为什么将两个条形图子图合并为一个会改变轴,我该如何解决这个问题?

Why does merging two bar chart subplots into one change the axis and how can I fix this?

我有两个数据框:

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() 并以某种方式实现它?

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

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,...)。首先分配内部刻度位置,然后分配标签。通过对两个数据帧使用相同的索引,位置将重合。