【问题标题】:Grouped bar chart from two pandas data frames来自两个熊猫数据框的分组条形图
【发布时间】:2017-07-20 19:33:55
【问题描述】:

我有两个包含不同值但结构相同的数据框:

df1 =

         0         1         2         3         4 
D  0.003073  0.014888  0.155815  0.826224       NaN
E  0.000568  0.000435  0.000967  0.002956  0.067249  

df2 =

     0         1         2         3         4
D  0.746689  0.185769  0.060107  0.007435       NaN   
E  0.764552  0.000000  0.070288  0.101148  0.053499

我想在一个分组条形图中绘制两个数据框。此外,每一行(索引)都应该是一个子图。

其中一个可以直接使用 pandas 轻松实现:

df1.T.plot(kind="bar", subplots=True, layout=(2,1), width=0.7, figsize=(10,10), sharey=True)

我尝试使用

加入他们
pd.concat([df1, df2], axis=1)

这会产生一个新的数据框:

         0         1         2         3         4         0         1         2         3         4
D  0.003073  0.014888  0.155815  0.826224       NaN  0.746689  0.185769  0.060107  0.007435       NaN
E  0.000568  0.000435  0.000967  0.002956  0.067249  0.764552  0.000000  0.070288  0.101148  0.053499

但是,使用上述方法绘制数据框不会对每列的条进行分组,而是将它们分开处理。对于每个子图,这会导致 x 轴按列的顺序带有重复的刻度,例如0,1,2,3,4,0,1,2,3,4.

有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    目前还不清楚数据是如何组织的。 Pandas 和 seaborn 通常期望 tidy datasets。因为您在绘图之前确实转置了数据,所以我假设您有两个变量(A 和 B)和四个观察值(例如测量值)

    df1 = pd.DataFrame.from_records(np.random.rand(2,4), index = ['A','B'])
    df2 = pd.DataFrame.from_records(np.random.rand(2,4), index = ['A','B'])
    
    df1.T
    

    也许这接近你想要的:

    df4 = pd.concat([df1.T, df2.T], axis=0, ignore_index=False)
    df4['col'] = (len(df1.T)*(0,) + len(df2.T)*(1,))
    df4.reset_index(inplace=True)
    df4
    

    使用 seaborns facet grid 可以方便地绘制:

    sns.factorplot(x='index', y='A', hue='col', kind='bar', data=df4)
    

    【讨论】:

    • 这正是我所做的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2020-09-19
    • 2020-07-25
    • 2017-02-07
    • 2019-02-15
    相关资源
    最近更新 更多