使用多索引数据帧生成复杂的seaborn点图

时间:2016-06-22 23:33:43

标签: python pandas seaborn

示例数据:

table1
   c1  c2
r1 1   3
r2 2   2
r3 3   1

table2
   c1  c2
r1 4   6
r2 5   5
r3 6   4

table3
  c1  c2
r1 7  9
r2 8  8
r3 9  7

我已经将数据传输到如下所示的数据框中,其中行是分析类别,上层列是被分析的个体,第二层是复制。

   table1    table2    table3
   r1 r2 r3  r1 r2 r3  r1 r2 r3
c1  1 2 3     4 5 6     7 8 9
c2  3 2 1     6 5 4     9 8 7

我想将其转换为点图,其中每个复制的平均值为点,其余值用于创建置信区间,并为每个表绘制一条线。换句话说,我希望值传递给pointplot为x=[table1,table2,table3], y=mean(all_r_values), hue=[c1, c2]

我不知道该怎么做,或者如何将我的桌子重塑成适合此的形式。

1 个答案:

答案 0 :(得分:1)

Seaborn希望数据采用长(整洁)格式,您可以在the documentation中了解更多信息:

  

使用“tidy”格式的DataFrame调用这些函数是最简单也是最好的,尽管较低级别的函数也接受宽格式DataFrame或简单的观察向量。

实质上,这意味着您希望尽可能多地将信息包含在数据框的行中而不是列中。在您的情况下,您希望将数据转换为以下格式:

rep  table    c       value
r1  table1    c1      1
r2  table1    c1      2
r3  table1    c1      3
...

我复制了您的示例数据并对其进行了轻微修改以获得此结果:

rep c1 c2 table
r1 1  3 table1
r2 2  2 table1
r3 3  1 table1
r1 4  6 table2
r2 5  5 table2
r3 6  4 table2
r1 7  9 table3
r2 8  8 table3
r3 9  7 table3

复制到剪贴板并通过

将其读入pandas
import pandas as pd
import seaborn as sns

df = pd.read_clipboard()

然后你可以"融化"将数据转换成长格式,并用Seaborn绘制:

df_long = df.melt(id_vars=['rep', 'table'], var_name='c')
sns.pointplot(x='table', y='value', hue='c', data=df_long, join=False, dodge=0.2)

enter image description here

从分层列格式中获取(并进入)格式相当混乱,但可以通过

完成
# Get sample data into the hierarchical column format
df_long_temp = df.melt(id_vars=['rep', 'table'], value_vars=['c1', 'c2'], var_name='c')
df_multi_cols = df_long_temp.set_index(['table', 'rep', 'c']).unstack(level=[0,1])

# Reshape from hierarchical column to long-form data
df_long = df_multi_cols.stack(level=[1,2]).reset_index()
sns.pointplot(x='table', y='value', hue='c', data=df_long, join=False, dodge=0.2)