首页 > 解决方案 > 使用 Seaborn 显示多个图形

问题描述

我有一个用 Pandas 打开的 csv 文件。它看起来像这样:

"Patient","Visit","Feature1","Feature2","Feature3"
"P1",0,?,?,?
"P1",1,?,?,?
"P2",0,?,?,?
"P2",1,?,?,?
"P2",2,?,?,?
"P3",0,?,?,?
"P3",1,?,?,?

?是一个数值。

我知道如何一次显示一个特征(因为它们有不同的范围)并为每个患者分开:

seaborn.stripplot(y="Feature1", x="Patient", data=features)

我想在单个图像中显示所有图,例如映射。我该怎么做?

标签: matplotlibseaborn

解决方案


Seaborn 通常更喜欢数据框的“长格式”,可以通过 pandas 获得melt

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

df = pd.DataFrame({"Patient": ["P1", "P1", "P2", "P2", "P2", "P3", "P3"],
                   "Visit": [0, 1, 0, 1, 2, 0, 1],
                   "Feature1": np.random.normal(10, 2, 7),
                   "Feature2": np.random.normal(12, 2, 7),
                   "Feature3": np.random.normal(15, 2, 7)})
df_melted = df.melt(value_vars=["Feature1", "Feature2", "Feature3"], id_vars=["Patient", "Visit"],
                    var_name="Feature", value_name="Value")
sns.stripplot(data=df_melted, x="Patient", y="Value", hue="Feature", dodge=True)

plt.tight_layout()
plt.show()

带有长格式df的seaborn stripplot

要在单独的子图中获取每个特征,您可以catplot在融化的数据帧上使用(sharey=True如果所有特征都在大致相同的范围内,则使用;用于col_wrap=3每 3 列开始一个新行):

sns.catplot(kind="strip", data=df_melted, x="Patient", y="Value", col="Feature", sharey=False)
plt.tight_layout()

融化数据框上的猫图


推荐阅读