python - 创建轮廓增强漏斗图

标签 python python-3.x matplotlib plot

我想创建一个轮廓增强漏斗图(不是漏斗图),以测试荟萃分析中的小研究效果,如下所示:

![R funnelplot

上面的图是在 R 中创建的,它有几个用于执行此操作的包。但是,我想使用 matplotlib 和 pandas 在 Python 中创建它。我怎样才能做到这一点? 我尝试过 Pythonmeta 包并得到了这个漏斗图 enter image description here

这是该包的源代码:

    def __init__(self,size=[6,6],dpi=80): #set figure
        self.size=size #inchs
        self.dpi=dpi   #default:80pts
        self.title="Meta-analysis Results "  
        self.nototal=False
        plt.rcParams['font.sans-serif']=['SimHei'] 
        plt.rcParams['axes.unicode_minus']=False
        logger.info("Load Fig().")
    def funnel (self,effs):
        myfig = Fig_Funnel (self.size,self.dpi,effs)
        return myfig```
    def Fig_Funnel (size,dpi,effs):
        myfig = plt.figure(linewidth=1,figsize=size,dpi=dpi)
        myfig.set_size_inches(size)
        x=[];y=[]
        for i in range(1,len(effs)):
            x.append(effs[i][1])
            y.append(effs[i][6])
        lbl,=plt.plot(x,y,"o", lw=1)

    
        ymax=max(y)+0.2
        plt.ylim(ymax,0)
        plt.plot([effs[0][1],effs[0][1]],[0,ymax],color="blue", linestyle="--",
        lw=1)
        plt.plot([effs[0][1],effs[0][1]-1.96*ymax],[0,ymax],color="blue",
        linestyle="--", lw=1)
        plt.plot([effs[0][1],effs[0][1]+1.96*ymax],[0,ymax],color="blue",
        linestyle="--", lw=1)
        ax = gca()
        ax.spines['right'].set_color('none')
        ax.spines['top'].set_color('none')
        ax.xaxis.set_ticks_position('bottom')
        ax.yaxis.set_ticks_position('left')

        plt.xlabel("Effect Size")
        plt.ylabel("Standard Error")
        myfig.tight_layout() 
        return myfig

最佳答案

最后,我自己创建了它。:)

首先,要了解轮廓增强漏斗图的概念,我建议阅读 Jaime L Peters纸。

为了创建绘图,我使用了以下代码

def CEfunnelplot(rults):      #to draw contour enhanced funnel plot

fig=plt.figure(figsize=(9,8))
ax=gca()
x=logES(rults)
y=SE(rults)      

plt.xlim(min(x)-5,max(x)+2)  #the xlim can change manually
plt.ylim(max(y)+0.1,0)
ax.set_facecolor(color="whitesmoke")
tes=(rults[0][1])
logtes=math.log(rults[0][1])


plt.plot ([0,(-2.58*max(y))],[0,max(y)], linestyle="None", lw=1)
plt.plot ([0,(2.58*max(y))],[0,max(y)], linestyle="None", lw=1)

trianglex = [ -2.58*max(y), 0, 2.58*max(y)] 
triangley = [ max(y),0, max(y)] 
for i in range(3):
    plt.plot(trianglex, triangley,color="lightgray")
plt.fill(trianglex, triangley,"lightgray")

plt.plot ([0,(-1.96*max(y))],[0,max(y)], linestyle="None", lw=1)
plt.plot ([0,(1.96*max(y))],[0,max(y)], linestyle="None", lw=1)

trianglex = [ -1.96*max(y), 0,1.96*max(y)] 
triangley = [ max(y),0, max(y)] 
for i in range(3):
    plt.plot(trianglex, triangley,color="darkgrey")
plt.fill(trianglex, triangley,"darkgrey")


plt.plot ([0,(-1.65*max(y))],[0,max(y)], linestyle="None", lw=1)
plt.plot ([0,(1.65*max(y))],[0,max(y)], linestyle="None", lw=1)

trianglex = [ -1.65*max(y), 0,1.65*max(y)] 
triangley = [ max(y),0, max(y)] 
for i in range(3):
    plt.plot(trianglex, triangley,color="white")
plt.fill(trianglex, triangley,"white")

plt.plot ([logtes,logtes],[0,max(y)],color="blue", linestyle="--", lw=1)
plt.plot ([logtes,logtes-1.96*max(y)],[0,max(y)],color="blue", linestyle="--", lw=1)
plt.plot ([logtes,logtes+1.96*max(y)],[0,max(y)],color="blue", linestyle="--", lw=1)
plt.plot(x,y,"o",lw=1,color="k")

ax = gca()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
colors = ['whitesmoke', 'lightgray', 'darkgrey',"white"]
lines =[Line2D([0], [0], color=c, linewidth=3, linestyle='solid') for c in colors]
labels = ["p < 1%","1%< p <5%","5%< p <10%","p > 10%"]
plt.legend(lines, labels,shadow=True)    

plt.xlabel("logRR",fontsize=14 )
plt.ylabel("Standard Error",fontsize=14,rotation=90 )
plt.savefig("Contour Enhanced Funnel plot.jpg")

我用了This sample code用于创建图例和 This code 为绘图着色。 结果如下:

Contour-Enhanced funnel plot

如果您想将图例的标记更改为“方形”,您可以更改如下代码

lines =[Line2D([0], [0],color=c,linewidth=3,linestyle='None',marker="s") for c in colors]

Figure with square markers for legend

关于python - 创建轮廓增强漏斗图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65262690/

相关文章:

python - 无法使用executemany执行ST_GEOMFROMTEXT

Python Matplotlib散点图绘制数字不一致的轴

python - 与 pandas 数据框中的日期绘制保持一致

Python - 正则表达式,列表末尾的空白元素?

python - 如何 MatPlotLib 绘制两个 DataFrame?

python - 如何将 OS X Python 模块(站点包)移动到服务器位置?

python - tkinter 标签在一段时间后消失

Python BeautifulSoup 提取字体标签的内容

python - 使用 lxml/ElementTree 获取非连续文本

python-3.x - 如何使用 python IMAP 下载邮件的所有附件