如何将不同的 DataFrame 组合成一个分组的条形图

How to combine different DataFrames into one grouped bar plot

我正在尝试复制 问题的答案,我看不出我在做什么,那是不同的。

我的输出类似于那个问题或 here 是一个分组条形图,其中此数据框:

    Area  Number   Cat
0  item1       4  Cat1
1  item2       6  Cat1
2  item3       7  Cat1
3  item4       8  Cat1
4  item5      10  Cat1
0  item1       4  Cat2
1  item2       6  Cat2
2  item3       7  Cat2
3  item7       8  Cat2
4  item6      10  Cat2

按区域分组,然后每个区域有两个连体条显示Cat1和Cat2的编号。所以输出应该有七组条形图(即项目 1、2、3、4、5、6、7),每组有两个条形图,一个用于类别 1,一个用于类别 2。

此代码:

import sys
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

test_dict1 = {'item1':4, 'item2':6, 'item3':7,'item4':8,'item5':10}
test_dict2 = {'item1':4, 'item2':6, 'item3':7,'item7':8,'item6':10}

#df = pd.DataFrame({'test_dict1':pd.Series(test_dict1),'test_dict2':pd.Series(test_dict2)}).reset_index()
#df = df.set_axis(['Item', 'DictOne', 'DictTwo'], axis=1)

test1_df = pd.DataFrame(test_dict1.items(), columns=['Area','Number'])
test2_df = pd.DataFrame(test_dict2.items(), columns=['Area','Number'])


test1_df['Cat'] = 'Cat1'
test2_df['Cat'] = 'Cat2'

dfs = [test1_df,test2_df]
result = pd.concat(dfs)

print(result)

from matplotlib import rcParams
sns.set(style="whitegrid")
rcParams.update({'figure.autolayout': True})
fig, ax1 = plt.subplots(figsize=(12,6))

result.plot.bar(x='Cat', ax=ax1)
plt.tight_layout()
plt.xticks(rotation=45, ha="right")
plt.show()

产生这个输出:

谁能告诉我哪里出错了?

很难给出一个很好的答案,因为我知道这只是演示数据,因此处理您的真实数据会有所不同。我认为您创建数据框的方式给您带来了问题,因为您直接使用 pandas.

进行绘图

目前,您的数据框如下所示:

...但是您需要将 X 轴作为索引,并且 Cat1Cat2 的单独列及其各自的值。更接近于:

完成此操作的方式将取决于您的实际数据集,但使用提供的示例(我稍微更改了您的输入值以获得更好的可视化效果),这是我的方法:

import pandas as pd

cat1 = {'item1':4, 'item2':6, 'item3':7,'item4':8,'item5':10}
cat2 = {'item1':5, 'item2':4, 'item3':12,'item4':6,'item5':3}

df1 = pd.DataFrame.from_dict(cat1, orient='index', columns=['Cat1'])
df2 = pd.DataFrame.from_dict(cat2, orient='index', columns=['Cat2'])

df = pd.concat([df1, df2], axis=1)

ax = df.plot.bar(rot=0)

输出:

  • 你可以用 seaborn
  • 绘制你的长 DataFrame
>>> import seaborn as sns
>>> sns.barplot(data=result, x='Area', y='Number', hue='Cat')
  • 如果你有长 DataFrame,就像在 OP 中一样,使用 pivot_table 创建一个宽 DataFrame,然后用 pandas.DataFrame.plot.bar or pandas.DataFrame.plot.[=33= 绘图]
  • 测试于 python 3.8.12pandas 1.3.3matplotlib 3.4.3seaborn 0.11.2
>>> result = result.pivot_table(index='Area', columns="Cat", values="Number")

Cat    Cat1  Cat2
Area             
item1   4.0   4.0
item2   6.0   6.0
item3   7.0   7.0
item4   8.0   NaN
item5  10.0   NaN
item6   NaN  10.0
item7   NaN   8.0

>>> ax1 = result.plot(kind='bar', rot=0, figsize=(12,6))