Seaborn:色调取决于两个值

2024-06-16 11:05:49 发布

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

我有以下两个数据帧,我想一起绘制。第一个(data)包含多个重复实验(=重复)的不同组的完整数据,以及该实验中单个细胞的值。第二个(avgs)总结了所有组的每个重复实验的平均值。我基本上希望以建议的方式绘制数据

data.head()

   cell   replicate     value           group   
0   1         1         0.029723        GROUP_A 
1   1         2         0.019136        GROUP_A     
2   2         2         0.020216        GROUP_A 
3   3         1         0.032020        GROUP_B
4   3         2         0.044815        GROUP_B

avgs.head()

          replicate     value           group   
0         1             0.019709        GROUP_A 
1         2             0.018937        GROUP_A     
2         1             0.358437        GROUP_B 
3         2             0.269602        GROUP_B
4         3             0.303252        GROUP_B

我的目标是实现B或C中显示的绘图,其中色调取决于组和复制

import matplotlib.pyplot as plt
import seaborn as sns
sns.swarmplot(x="group", y="value", data=data, hue="replicate")
sns.swarmplot(x="group", y="value", data=avgs,size=8,hue="replicate", edgecolor="k", linewidth=2)

我将给出A中所示的基本图,以及与复制对应的色调。

是否有一种方法可以做到这一点,或者为每个组使用不同的调色板,这样每个组都有不同的颜色,每个复制品都有不同的颜色深浅(示例B,在Affinity Designer中制作)

另一种对我有用的方法是用灰色调色板绘制data的单个单元格值。然而,当我添加avgs的复制平均值数据时,如何实现这一点,每组都有不同的颜色,并且每个复制平均值都有相应的颜色底纹(示例C)

是否可以将调色板字典传递给seaborn/matplotlib,例如:

gray = sns.dark_palette("gray", n_colors=5)
red = sns.dark_palette("red", n_colors=5)
blue = sns.dark_palette("blue", n_colors=5)
 
my_palette={"GROUP_A": gray, "GROUP_B": red, "GROUP_C": blue}

谢谢


Tags: 数据datavalue颜色group绘制平均值dark
1条回答
网友
1楼 · 发布于 2024-06-16 11:05:49

这些组可以单独打印,每个组都有自己的调色板。为了确保x位置得到尊重,需要使用所有所需的x标签设置order=关键字

Seaborn会为每次通话自动添加图例条目,因此图例可能会变得非常大。您可以抑制图例,也可以将其限制为前几个条目

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

N = 500
data = pd.DataFrame({'replicate': np.random.choice(range(1, 4), N),
                     'value': 2 + np.random.uniform(-0.5, 0.5, (N, 5)).sum(axis=1),
                     'group': np.random.choice([f'GROUP_{g}' for g in 'ABCD'], N)})
groups = np.unique(data.group)
for g in groups:
    data.loc[data.group == g, 'value'] += np.random.uniform(0, 3)
avgs = data.groupby(['replicate', 'group']).mean()
avgs.reset_index(inplace=True)

my_palette = {"GROUP_A": 'Greys', "GROUP_B": 'Reds', "GROUP_C": 'Blues', "GROUP_D": 'Greens'}

for ind, g in enumerate(groups):
    sns.swarmplot(x="group", y="value", data=data[data.group == g], order=groups,
                  palette=my_palette[g], hue="replicate")
    sns.swarmplot(x="group", y="value", data=avgs[avgs.group == g], order=groups,
                  size=8, palette=my_palette[g], hue="replicate", edgecolor="k", linewidth=2)

# plt.gca().legend_.remove() # optionally suppress the legend
handles, labels = plt.gca().get_legend_handles_labels()
plt.legend(handles=handles[:3], title='replicate')
plt.tight_layout()
plt.show()

example plot

相关问题 更多 >