我试着复制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()
产生以下输出:
有人能告诉我哪里错了吗?
2条答案
按热度按时间5f0d552i1#
seaborn
绘制长DataFrame
DataFrame
,就像在OP中一样,使用pivot_table
创建一个宽DataFrame
,然后用pandas.DataFrame.plot.bar
或pandas.DataFrame.plot
绘图。*在
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
、seaborn 0.11.2
中测试vyswwuz22#
这是很难给予一个伟大的答案,因为我知道这只是演示数据,所以处理您的真实的数据将是不同的。我认为你创建框架的方式给了你问题,因为你直接用Pandas绘图。
目前,您的框架看起来像:
...但是你需要X轴作为索引,
Cat1
和Cat2
有一个单独的列,分别有它们各自的值。更接近于:你实现这一点的方式将取决于你的实际数据集,但使用提供的例子(我稍微改变了你的输入值,以更好的可视化),这是我的方法:
输出量: