【问题标题】:How to combine different DataFrames into one grouped bar plot如何将不同的 DataFrame 组合成一个分组条形图
【发布时间】:2021-12-08 04:08:48
【问题描述】:

我正在尝试从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()

产生这个输出:

谁能告诉我哪里出错了?

【问题讨论】:

    标签: python pandas matplotlib seaborn bar-chart


    【解决方案1】:
    • 您可以用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))
    

    【讨论】:

    • @Trenton McKinney,非常感谢MAN ;)
    • 不客气。
    【解决方案2】:

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

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

    ...但是您需要将 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)
    

    输出:

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2016-07-20
      相关资源
      最近更新 更多