基于列的Seaborn条带图

2024-09-25 02:33:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

Group   Exp1          Exp2        Exp3         Exp4     Exp5    Control
0   1   0.005556    -0.101111   0.052632    -0.055556   0.033333    y
1   2   -0.115684   0.076667    -0.349497   0.555556    0.555556    n
2   3   0.184444    0.251397    0.022222    -0.444444   0.611650    n
3   4   0.075556    0.237778    0.368750    0.098901    -0.111111   n
4   5   -0.186916   -0.355556   0.172414    0.087120    0.034737    y
5   6   0.250000    0.152542    -0.395349   0.111111    0.000000    n
6   7   -0.025014   0.030000    0.594444    0.055556    0.311111    n
7   8   -0.062500   0.123333    0.317778    0.144444    0.288889    n
8   9   0.001111    0.141111    0.181111    0.011111    0.435897    n
9   10  -0.124444   -0.074241   0.074444    -0.111111   0.133333    y

现在,典型的seaborn stripplot使用这些行来绘制不同的类别。 然而,我想让不同的类别成为专栏(不同的实验) 并在x轴上的实验标记上方垂直绘制每组和每个实验的10个值。 我如何做到这一点


Tags: 数据标记group绘制seaborn类别control典型
2条回答

删除不想打印的列,并将其余的传递给data

sns.stripplot(data=df.drop("Group", axis=1))

enter image description here

学习如何对@JohanC演示的长格式数据进行完整转换是一件好事,但了解如何利用wide-form data支持(如果它适合您想要做的事情)也是一件好事

Seaborn通常为works easiest with "long form" data,因此一列表示实验,另一列表示相应的值。Seaborn还接受某些类型的“宽”数据,以获得足够简单的结构化数据帧。在这种情况下,将“Group”列转换为索引就可以了

所以,它看起来像:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

df = pd.DataFrame({f'Exp{i}': np.random.randn(10) for i in range(1, 6)})
df['Group'] = range(1, 11)
ax = sns.stripplot(data=df.set_index('Group'))
ax.xaxis.tick_top()
plt.show()

example plot

宽窗体不支持hue。在本例中(sns.stripplot(data=df.drop(columns=['Group', 'Control']), hue=df['Control']))给出了一个错误,指出当xy未显式设置时hue不受支持

但是可以使用“长格式”。 Pandas^{}将数据帧转换为所需的长格式:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from io import StringIO

data_str = '''   Group   Exp1          Exp2        Exp3         Exp4     Exp5    Control
0   1   0.005556    -0.101111   0.052632    -0.055556   0.033333    y
1   2   -0.115684   0.076667    -0.349497   0.555556    0.555556    n
2   3   0.184444    0.251397    0.022222    -0.444444   0.611650    n
3   4   0.075556    0.237778    0.368750    0.098901    -0.111111   n
4   5   -0.186916   -0.355556   0.172414    0.087120    0.034737    y
5   6   0.250000    0.152542    -0.395349   0.111111    0.000000    n
6   7   -0.025014   0.030000    0.594444    0.055556    0.311111    n
7   8   -0.062500   0.123333    0.317778    0.144444    0.288889    n
8   9   0.001111    0.141111    0.181111    0.011111    0.435897    n
9   10  -0.124444   -0.074241   0.074444    -0.111111   0.133333    y'''

df = pd.read_csv(StringIO(data_str), delim_whitespace=True)
###df.set_index('Group', inplace=True)
##ax = sns.stripplot(data=df.drop(columns=['Control']), hue=df['Control'])

long_df = df.melt(id_vars=['Group', 'Control'], var_name='Experiment', value_name='Value')
ax = sns.stripplot(data=long_df, x='Experiment', y='Value', hue='Control')
ax.xaxis.tick_top()
plt.tight_layout()
plt.show()

long form

数据帧的长格式如下所示:

   Group Control Experiment     Value
0      1       y       Exp1  0.005556
1      2       n       Exp1 -0.115684
2      3       n       Exp1  0.184444
3      4       n       Exp1  0.075556
4      5       y       Exp1 -0.186916
...

相关问题 更多 >