python - 多指数作图

标签 python pandas matplotlib seaborn

我有一些数据,我使用以下代码操作了数据框:

import pandas as pd
import numpy as np

data = pd.DataFrame([[0,0,0,3,6,5,6,1],[1,1,1,3,4,5,2,0],[2,1,0,3,6,5,6,1],[3,0,0,2,9,4,2,1],[4,0,1,3,4,8,1,1],[5,1,1,3,3,5,9,1],[6,1,0,3,3,5,6,1],[7,0,1,3,4,8,9,1]], columns=["id", "sex", "split", "group0Low", "group0High", "group1Low", "group1High", "trim"])
data

#remove all where trim == 0
trimmed = data[(data.trim == 1)]
trimmed

#create df with columns to be split
columns = ['group0Low', 'group0High', 'group1Low', 'group1High']
to_split = trimmed[columns]
to_split

level_group = np.where(to_split.columns.str.contains('0'), 0, 1)
# output: array([0, 0, 1, 1])
level_low_high = np.where(to_split.columns.str.contains('Low'), 'low', 'high')
# output: array(['low', 'high', 'low', 'high'], dtype='<U4')

multi_level_columns = pd.MultiIndex.from_arrays([level_group, level_low_high], names=['group', 'val'])
to_split.columns = multi_level_columns
to_split.stack(level='group')

sex = trimmed['sex']
split = trimmed['split']
horizontalStack = pd.concat([sex, split, to_split], axis=1)
horizontalStack

finalData = horizontalStack.groupby(['split', 'sex', 'group'])
finalData.mean()

我的问题是,如何使用 ggplot 或 seaborn 绘制平均数据,以便对于每个“拆分”级别,我得到一个如下所示的图表:

enter image description here

在代码的底部,您可以看到我试图拆分组因子,这样我就可以分开条形图,但这导致了错误 (KeyError: 'group'),我认为这与我使用多重索引的方式

最佳答案

我会使用 seaborn 的因子图。

假设您有这样的数据:

import numpy as np
import pandas

import seaborn
seaborn.set(style='ticks') 
np.random.seed(0)

groups = ('Group 1', 'Group 2')
sexes = ('Male', 'Female')
means = ('Low', 'High')
index = pandas.MultiIndex.from_product(
    [groups, sexes, means], 
   names=['Group', 'Sex', 'Mean']
)

values = np.random.randint(low=20, high=100, size=len(index))
data = pandas.DataFrame(data={'val': values}, index=index).reset_index()
print(data)

     Group     Sex  Mean  val
0  Group 1    Male   Low   64
1  Group 1    Male  High   67
2  Group 1  Female   Low   84
3  Group 1  Female  High   87
4  Group 2    Male   Low   87
5  Group 2    Male  High   29
6  Group 2  Female   Low   41
7  Group 2  Female  High   56

然后您可以使用一个命令创建因子图 + 加上额外的一行以删除一些冗余(对于您的数据)x 标签:

fg = seaborn.factorplot(x='Group', y='val', hue='Mean', 
                        col='Sex', data=data, kind='bar')
fg.set_xlabels('')

这给了我:

enter image description here

关于python - 多指数作图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31845258/

相关文章:

python - 如何将条形图添加到基于 Django 的数据库?

python - 在循环中删除数据框中的值

python - ax.xaxis.set_major_formatter 不会更改 Xtick 标签显示数字的数量

python - Cython 的 array.array 中的 8 字节 int (long long)

python - 国际文本的 Scrapy 问题

python - 如何使用不同的标记分隔符连接多个 Pandas DataFrame 列?

python - csv的pandas DataFrame输出端

python - 在简单的 pandas/matplotlib “barh” 图中指定一列的单条标签颜色

python - 在 matplotlib 2.0 中,如何将颜色条行为恢复为 matplotlib 1.5 的行为?

python - 如何沿曲线注释文本