我有这个pandas DataFrame:
>>> print(df)
Channel 0 1 2 3 4 5 6 7
Sample
7d 3.82 4.10 3.86 3.86 3.95 3.65 3.43 3.63
12d 2.97 4.32 3.50 3.58 3.22 3.37 3.58 3.78
17d 4.01 4.04 4.10 3.43 3.76 3.26 3.35 3.48
DO 3.07 3.58 3.14 3.22 3.11 3.09 3.16 3.16
我想做一个与此类似的情节(代码为sns.swarmplot(df)
):
但颜色不应设置为每个通道(即DataFrame列),而是设置为每个样本(即DataFrame行)。因此,x轴上的每个“类别”将具有对应于行7d,12d,17d和DO的4种颜色。
在seaborn中有没有一种简单的方法可以实现这一目标?
编辑:我应该补充一点,我尝试使用hue
关键字,但它说它还需要使用x
和y
关键字。根据{{3}},似乎我需要创建一个新的DataFrame,其中包含一列中的所有数值和另外两列包含样本和通道信息的列。然后我可以将情节称为sns.swarmplot(x='Channel', y='values', hue='Sample')
。是否有更直接的方法不涉及创建额外的ad-hoc DataFrame?
EDIT2 :根据@BrenBarn建议,我最终创建了一个新的“整洁”DataFrame:
dd = []
for sa in df.index:
print(sa)
d = pd.DataFrame(df.loc[sa]).reset_index()
d.columns = ['Channel', 'Leakage']
d['Sample'] = sa
dd.append(d)
ddf = pd.concat(dd)
然后用以下内容绘制数据:
sns.swarmplot(x='Channel', y='Leakage', hue='Sample', data=ddf)
给出了我预期的情节:
我希望有办法 告诉seaborn使用原始的“2-D表”格式来制作情节 这种数据更加紧凑和自然。 如果这是可能的,我会接受答案;)。
答案 0 :(得分:2)
您在编辑中基本上已回答了您的问题,但您可能需要查看
pd.melt
或pd.stack
是创建新整洁DataFrame的简便方法。
e.g。
s=df.stack()
s.name='values'
df_tidy=s.reset_index()
sns.stripplot(data=df_tidy,hue='sample',x='Channel',y='values')
或
df_tidy=pd.melt(df.reset_index(),id_vars=['sample'],value_vars=df.columns.tolist(),value_name='values')
sns.stripplot(data=df_tidy,hue='sample',x='Channel',y='values')