【问题标题】:Seaborn categorical plot with hue from DataFrame rows带有来自 DataFrame 行的色调的 Seaborn 分类图
【发布时间】:2016-09-26 05:22:20
【问题描述】:

我有这个熊猫数据框:

>>> 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 轴上的每个“类别”将有 4 种颜色对应于第 7d、12d、17d 和 DO 行。

在 seaborn 中是否有一种简单的方法可以实现这一点?

编辑:我应该补充一点,我尝试使用 hue 关键字,但它说它还需要使用 xy 关键字。根据this example,我似乎需要创建一个新的DataFrame,其中所有数值在一列中,另外两列包含样本和通道信息。然后我可以将情节称为sns.swarmplot(x='Channel', y='values', hue='Sample')。有没有更直接的方法不涉及创建额外的 ad-hoc DataFrame?

EDIT2:按照@BrenBarn 的建议,我最终创建了一个新的“整洁”数据框:

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 使用原始的“二维表”格式来绘制 对于此类数据,这更加紧凑和自然。 如果这是可能的,我会接受答案;)。

【问题讨论】:

  • 为什么不转置您的数据?然后你可以将Channel设为一列并将其设置为X变量。
  • 您能否详细说明如何将Channel 设为一列并将其设置为X 变量?
  • 您的编辑表明您已经想出了如何去做。通常,要有效地使用 seaborn 图,您需要采用“整洁”格式的数据,其中每一行代表一个观察值。您应该尝试将数据转换为该格式。与其将其视为“附加的临时 DataFrame”,不如考虑将该格式作为基本的通用格式。
  • 好的,谢谢@BrenBarn!明白你的意思了。只是对于这些数据,二维表的形式更加自然和紧凑。

标签: python pandas seaborn


【解决方案1】:

您基本上已经在编辑中回答了您的问题,但您可能想看看 pd.meltpd.stack 作为创建新的整洁 DataFrame 的更简单方法。

例如

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')

【讨论】:

  • 有趣,我不知道这些功能!根据您的提示,我找到了一种更简单的方法:pd.melt(df.T.reset_index(), id_vars='Channel')
  • 另外,一个非海洋替代品:df.T.plot(marker='o',ls='None')(至少在这个例子中效果很好,我不知道你的实际数据集有多复杂)。
  • 哇,你说得对!不过,我失去了“群”功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2021-09-16
  • 1970-01-01
  • 2019-05-16
  • 2018-12-06
  • 2016-11-03
相关资源
最近更新 更多