【问题标题】:Python: Combining two different plots in one plot but different x value range [closed]Python:在一个图中组合两个不同的图但不同的x值范围[关闭]
【发布时间】:2017-08-23 05:12:05
【问题描述】:

我想使用 seaborn 将点图和箱线图组合成一个图。该组合本身有效,但由于两个数据帧的 x 轴值不在同一范围内,我得到错误的输出(第二个数据帧的 x 值将被忽略)。 以下是我的部分数据集:

import pandas as pd
bpdata=pd.DataFrame({'Ldate': [20150202, 20150202, 20150202, 20151117, 20151117, 20151117, 20160205, 20160205, 20160205], 'Lreflectance': [0.067, 0.0482, 0.0555, 0.099, 0.0956, 0.0931, 0.0757, 0.0663, 0.0566]})
Mplotdata=pd.DataFrame({'Mdate':[20150202, 20150407,20160202], 'Mreflectance': [0.0868, 0.0833,0.0719]})

单独绘制:

import seaborn as sns
plot=sns.pointplot(data=Mplotdata, x='Mdate', y='Mreflectance', color='dimgrey', marker='o')
for item in plot.get_xticklabels():
    item.set_rotation(45)

plot=sns.boxplot(data=bpdata, x='Ldate', y='Lreflectance', color='lightgray')
for item in plot.get_xticklabels():
    item.set_rotation(45)  

看起来像这样: pointplot (left) and boxplot (right)

但是当我尝试将点图和箱线图放在一个图中时

plot=sns.boxplot(data=bpdata, x='Ldate', y='Lreflectance', color='lightgray')
plot=sns.pointplot(data=Mplotdata, x='Mdate', y='Mreflectance', color='dimgrey', marker='o')
for item in plot.get_xticklabels():
    item.set_rotation(45)  

看起来像这样:

在此图中,x 轴仅显示第一个图的值。如果我更改点图和箱线图的顺序,它也将只使用第一个数据帧的 x 值,第二个将被忽略。

知道如何解决这个问题吗?

我在这个论坛、谷歌或 matplotlib/seaborn 文档中没有找到任何解决方案。

【问题讨论】:

  • 您能否包含 (edit) 一些重现问题的最小数据集?寻求调试帮助时请查看minimal reproducible example
  • 谢谢@MSeifert,完成了。
  • 不清楚您希望在图中的哪个位置看到哪些值。此外,您显示的图像似乎与数据不匹配。请记住,您在这里交谈的人可能是数据分析和python绘图方面的专家,但他们对您的特殊问题一无所知,因此您需要向他们解释。
  • 是的,对不起!第一张图片由两个图组成,一个箱线图和一个点图。那么就很清楚了。我不知道,为什么只显示一个,我会尝试添加另一个。感谢您的评论。

标签: python plot seaborn boxplot


【解决方案1】:
fig, ax = plt.subplots()
ax2 = ax.twiny() # put a second plot on top of it, having the same y axis
data1 = np.random.random(10) #random in [0,1]
data2 = np.random.random(15)+1 #random in [1,2]

ax.plot(np.arange(len(data1)), data1) # plot in the first plot
ax2.plot(np.arange(len(data2)),data2) # plot in the second plot

【讨论】:

    【解决方案2】:

    谢谢@JürgMerlinSpaak,就是这样:

    fig, ax = plt.subplots()
    ax2 = ax.twiny()
    plot=sns.boxplot(data=bpdata, x='Ldate', y='Lreflectance', color='lightgray', ax=ax)
    plot=sns.pointplot(data=Mplotdata, x='Mdate', y='Mreflectance', color='dimgrey', marker='o', ax=ax2)
    for item in plot.get_xticklabels():
        item.set_rotation(45)
    

    情节和盒子的大小仍然需要改进,但两个情节的组合效果很好。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2022-01-25
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多