【发布时间】: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 关键字,但它说它还需要使用 x 和 y 关键字。根据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!明白你的意思了。只是对于这些数据,二维表的形式更加自然和紧凑。