【问题标题】:Two Seaborn plots on one twinx figure become distorted一个双胞胎人物上的两个 Seaborn 情节变得扭曲
【发布时间】:2021-07-27 06:11:15
【问题描述】:

我看到这个问题的变体被问了好几次,但我认为我看到的任何变体都没有解决它(除了“使用 matplotlib 进行组合图”,但我希望能帮助理解 为什么 我应该这样做)。

df1 = pd.DataFrame({'height': {0: 161, 1: 173, 2: 168, 3: 185, 4: 163},
                    'year': {0: 2015, 1: 2016, 2: 2017, 3: 2018, 4: 2019}})
df2 = pd.DataFrame({'year': {0: 2015, 1: 2015, 2: 2016, 3: 2016, 4: 2017,
                             5: 2017, 6: 2018, 7: 2018, 8: 2019, 9: 2019},
                    'weight': {0: 64, 1: 81, 2: 82, 3: 83, 4: 66,
                               5: 71, 6: 84, 7: 91, 8: 99, 9: 94},
                    'sex': {0: 'M', 1: 'F', 2: 'M', 3: 'F', 4: 'M',
                            5: 'F', 6: 'M', 7: 'F', 8: 'M', 9: 'F'}})
ax = sns.barplot(x='year', y='weight', hue='sex', data=df2)
ax2 = ax.twinx()
sns.lineplot(x='year', y='height', data=df1, ax=ax2)

我希望这是一个教科书的组合图示例,但结果是:

这是为什么呢? X 轴不应该简单地收敛并制作一个漂亮的图吗?当然,每个情节都可以单独渲染。

【问题讨论】:

标签: pandas seaborn


【解决方案1】:

如果您单独绘制它们并检查它们的xlim,您可以看到 seaborn 将条形图的 x 值向下移动到 0(年份通过 xticklabels 单独显示):

ax = sns.barplot(x='year', y='weight', hue='sex', data=df2)
print(ax.get_xlim())
print(ax.get_xticklabels())

# (-0.5, 4.5)
# [Text(0, 0, '2015'), Text(1, 0, '2016'), Text(2, 0, '2017'), Text(3, 0, '2018'), Text(4, 0, '2019')]

线图不会改变x 的值,而是绘制 2000 年代范围内的年份:

ax = sns.lineplot(x='year', y='height', data=df1)
print(ax.get_xlim())

# (2014.8, 2019.2)

一种解决方法是在线图的data 上使用reset_index() 并使用x='index' 手动将其x 值转换为0 以与条形图对齐:

g = sns.lineplot(x='index', y='height', data=df1.reset_index(), ax=ax2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2017-04-11
    相关资源
    最近更新 更多