如何将不同的 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 轴作为索引,并且 Cat1
和 Cat2
的单独列及其各自的值。更接近于:
完成此操作的方式将取决于您的实际数据集,但使用提供的示例(我稍微更改了您的输入值以获得更好的可视化效果),这是我的方法:
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.12
、pandas 1.3.3
、matplotlib 3.4.3
、seaborn 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))
我正在尝试复制
我的输出类似于那个问题或 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 轴作为索引,并且 Cat1
和 Cat2
的单独列及其各自的值。更接近于:
完成此操作的方式将取决于您的实际数据集,但使用提供的示例(我稍微更改了您的输入值以获得更好的可视化效果),这是我的方法:
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
orpandas.DataFrame.plot
.[=33= 绘图] - 测试于
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
、seaborn 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))