Display multiple graphics with Seaborn

108 Views Asked by At

I have a csv file that I open with Pandas. It looks like this:

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

? being a numerical value.

I know how to display one feature at a time (because they have various ranges) and separated per patient:

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

I would like to display ALL the plots inside a single image, like a mapping. How can I do it?

1

There are 1 best solutions below

2
On BEST ANSWER

Seaborn usually prefers the "long form" of the dataframe, which can be obtained via 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()

seaborn stripplot with long form df

To get each feature in separate subplots, you can use catplot on the melted dataframe (use sharey=True if all features are in about the same range; use col_wrap=3 to start a new row every 3 columns):

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

catplot on melted dataframe