代码之家  ›  专栏  ›  技术社区  ›  jezrael

在Matplotlib和Seaborn之间共享X轴

  •  1
  • jezrael  · 技术社区  · 6 年前

    我在pandas中有数据 dataframe :。

    导入熊猫为pd 将numpy导入为np 将matplotlib.pyplot导入为plt 将Seaborn导入为sns 随机种子(786) df=pd.dataframe('a':np.arange(0,1,0.05), “B”:np.随机.rand(20)-.5) 打印(DF) 甲 0 0.00 0.256682 1 0.05至0.192555 2 0.10 0.393919 3 0.15-0.113310 4 0.20 0.373855 5 0.25-0.423764 6 0.30-0.123428 7 0.35-0.173446 8 0.40 0.440818 9 0.45-0.016878 10 0.50 0.055467 11 0.55-0.165294 12 0.60-0.216684 13 0.65 0.011099 14 0.70 0.059425 15 0.75 0.145865 16 0.80-0.019171 17 0.85 0.116984 18 0.90至0.051583 19 0.95-0.096527 < /代码>

    我想绘制 barplot 并添加竖线:

    plt.figure(FigSize=(10,5))。
    sns.barplot(x='a',y='b',data=df)
    plt.vlines(x=0.45,ymin=0,ymax=0.6,color='red',linewidth=5)
    < /代码> 
    
    

    TickLabels有问题,因为重叠和线条应位于点0.45instaed near0forx axis

    我尝试了许多来自link1的解决方案。 link2, link3, link4but still problem set correctly axis for both plots.

    什么是问题?是否可以在绘图之间共享X轴?

    预期输出-垂直线正确对齐,并且X轴上的刻度也不重叠:

    .

    我想要情节 barplot 并添加竖线:

    plt.figure(figsize=(10,5))
    sns.barplot(x = 'a', y = 'b', data = df)
    plt.vlines(x = 0.45, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
    

    滴答标签有问题,因为重叠和线条应该在点中。 0.45 近距离安装 0 对于 x axis .

    polt

    我尝试了很多解决方案 link1 , link2 , link3 , link4 但仍然有问题设置正确的轴为两个绘图。

    什么是问题?是否可以在绘图之间共享X轴?

    预期输出-正确对齐的垂直线,也不重叠X轴上的刻度:

    3 回复  |  直到 6 年前
        1
  •  4
  •   SpghttCd    6 年前

    条形图中的X轴是分类的,因此它没有您的 df.a 的值作为实际比例,但仅作为刻度标签。您可以更改,例如 df.a[19]=2 并且除了最后一个条形标记的标签外,什么都不会更改。

    所以分类轴意味着坐标是0,第一条,第二条,等等…19代表最后一个。

    我的方法是将垂直线设置为xpos*19/.95:。

    plt.vlines(x=0.45*19/.95,ymin=0,ymax=0.6,color='red',lineidth=5)
    < /代码> 
    
    

    对于一般情况,可以添加lambda函数来计算转换:

    f=lambda x:(x-df.a.values[0])*(df.a.size-1)/(df.a.values[-1]-df.a.values[0])
    plt.vlines(x=f(.45),ymin=0,ymax=0.6,color='red',linewidth=5)
    < /代码> 
    
    

    但是,asdf.a.values仅打印为勾号标签,它应该从开始到结束呈线性。

    关于x轴标记的问题:我只能告诉你它不出现在我的系统中,上面的绘图代码和你的一样,除了垂直线。可能是在一次又一次尝试VLines时引入的。

    例如:df.a[19] = 2除了最后一个勾号的标签,什么都不会改变。

    所以分类轴意味着坐标是0,第一条,第二条,等等…最后19个。

    我的方法是将垂直线设置为xpos*19/.95:

    plt.vlines(x = .45*19/.95, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
    

    enter image description here

    对于一般情况,可以添加lambda函数来计算转换:

    f = lambda x: (x-df.a.values[0]) * (df.a.size-1) / (df.a.values[-1] - df.a.values[0])
    plt.vlines(x = f(.45), ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
    

    然而,作为df.a.values只打印为刻度线标签,它应该从开始到结束呈线性。

    关于x轴标记的问题:我只能告诉你它不出现在我的系统中,上面的绘图代码和你的一样,除了垂直线。也许它是在一次又一次尝试VLines时引入的。

        2
  •  1
  •   Yuca    6 年前

    使用 ax.twiny 和舍入输入:

    导入熊猫为pd 将numpy导入为np 将matplotlib.pyplot导入为plt 将Seaborn导入为sns 随机种子(786) df=pd.dataframe('a':np.round(np.arange(0,1,0.05),2), ‘B’:NP.圆形(NP.随机.兰德(20),2)-.5) PLT.图(图尺寸=(10,5)) a x=sns.barplot(x='a',y='b',data=df) ax.set_xtickLabels(ax.get_xtickLabels(),旋转=90) ax2=ax.twiny()。 ax2.vlines(x=0.45,ymin=0,ymax=0.6,color='red',linewidth=2) #ax2.set_visible(false)这将隐藏绘图顶部的刻度 < /代码>

    enter image description here

        3
  •  0
  •   Cut7er    6 年前

    创建一个包含两个子地块的图形,然后可以在两个子地块之间共享X轴和Y轴。

    fig = plt.figure()
    ax1 = plt.subplot(211)
    ax2 = plt.subplot(212, sharex = ax1, sharey = ax1)