为啥将两个条形图子图合并为一个会改变轴,我该如何解决?

Posted

技术标签:

【中文标题】为啥将两个条形图子图合并为一个会改变轴,我该如何解决?【英文标题】:Why does merging two bar chart subplots into one change the axis and how can I fix this?为什么将两个条形图子图合并为一个会改变轴,我该如何解决? 【发布时间】:2022-01-16 10:51:12 【问题描述】:

我有两个数据框:

df1=pd.DataFrame(10*np.random.rand(4,3),index=[2,3,4,5],columns=["I","J","K"])
df2=pd.DataFrame(10*np.random.rand(4,3),index=[1,2,3,4],columns=["I","J","K"])

创建条形图后,我得到:

现在我想将它们合并成一个图,所以我尝试了:

fig, ax = plt.subplots(sharex=True)
ax1 = df1.plot.bar(legend=True, rot=0, stacked=True, width=0.1, position=1, colormap="bwr", ax=ax, alpha=0.7)
ax2 = df2.plot.bar(legend=True, rot=0, stacked=True, width=0.1, position=0, colormap="BrBG", ax=ax, alpha=0.7)
plt.show()

但结果不是我所期望的:

如您所见,我希望 x 轴具有值 1、2、3、4、5,并且图形与它们的原始索引值相对应。问题出在哪里,我该如何解决?

此外,如果可能的话,我需要自动设置新的轴值,因为我有许多这些数据帧都具有不同的轴值,并且手动插入新的轴值需要很长时间。也许我可以在索引列中使用.unique() 并以某种方式实现它?

【问题讨论】:

【参考方案1】:

您可以将两个数据帧重新索引到同一个索引:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df1 = pd.DataFrame(10 * np.random.rand(4, 3), index=[2, 3, 4, 5], columns=["I", "J", "K"])
df2 = pd.DataFrame(10 * np.random.rand(4, 3), index=[1, 2, 3, 4], columns=["I", "J", "K"])

fig, ax = plt.subplots()
combined_index = df1.index.union(df2.index)
df1.reindex(combined_index).plot.bar(legend=True, rot=0, stacked=True, width=0.1, position=1,
                                     colormap="bwr", alpha=0.7, ax=ax)
df2.reindex(combined_index).plot.bar(legend=True, rot=0, stacked=True, width=0.1, position=0,
                                     colormap="BrBG", alpha=0.7, ax=ax)
plt.show()

Pandas 条形图使用数据框的索引创建分类 x 刻度(内部编号为 0,1,2,...)。首先分配内部刻度位置,然后分配标签。通过对两个数据框使用相同的索引,位置将重合。

【讨论】:

确实如此。更新似乎更符合熊猫哲学。我只用这些数字指数进行了测试。 index.union() 可能更安全,例如有日期。 第一个答案combined_index = np.unique(df1.index.to_list() + df2.index.to_list()) 也很完美。正是我想要的。谢谢。

以上是关于为啥将两个条形图子图合并为一个会改变轴,我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

我有 2 个不同的条形图,它们有一个共同的 X 轴和 2 个不同的 Y 轴。我想使用 python 将这两个使用 X 轴的图合并为一个

使用共享 x 轴合并 matplotlib 子图

单击 matplotlib 中的步骤图子图点时如何使标签出现(或可能是 plotly)?

matplotlib饼图用主图的实际标题替换最后一个饼图子图标题[重复]

条形图带有使用子图的标准错误

MATLAB如何画两个子图共用一个Y轴标签?