pandas 如何将合并不同的 Dataframe 合并到一个分组条形图中

voj3qocg  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(100)

我试着复制this问题的答案,我看不出我在做什么不同。
我的输出,类似于那个问题或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()

产生以下输出:

有人能告诉我哪里错了吗?

5f0d552i

5f0d552i1#

  • 您可以使用seaborn绘制长DataFrame
>>> import seaborn as sns
>>> sns.barplot(data=result, x='Area', y='Number', hue='Cat')
  • 如果你有长DataFrame,就像在OP中一样,使用pivot_table创建一个宽DataFrame,然后用pandas.DataFrame.plot.barpandas.DataFrame.plot绘图。
    *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))

vyswwuz2

vyswwuz22#

这是很难给予一个伟大的答案,因为我知道这只是演示数据,所以处理您的真实的数据将是不同的。我认为你创建框架的方式给了你问题,因为你直接用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)

输出量:

相关问题