I'm try to keep track of changes within a dataframe using a boxplot combined with a swarmplot, and lines connecting data points.
So far I only managed to combine the boxplot with the swarmplot, using this code:
import seaborn as sns
from itertools import cycle
import numpy as np
import pandas as pd
#create random dataframe with 4 conditions
df = pd.DataFrame(data = np.random.random(size=(4,4)), columns = ['A','B','C','D'])
datapoints=pd.melt(df)
#add IDs
ID = cycle(["1","2","3", "4"])
datapoints['ID'] = [next(ID) for IDs in range(len(datapoints))]
#plot values
sns.boxplot(x="variable", y="value", data=datapoints)
sns.swarmplot(x="variable", y="value", data=datapoints, color=".25")
Waht I would like to do is to keep track of changes connecting the single dots across A, B, C and D per ID.
This way I could follow the performance of for example ID 1 across the 4 conditions. Something like this:
CodePudding user response:
Not sure I understood the question as boxplot are used to aggregate information rather than showing all values, but if you want to show all points:
sns.lineplot(x="variable", y="value", hue='ID', data=datapoints,
estimator=None, legend=False)
or:
sns.lineplot(data=df.T, legend=False)
To have black lines, use:
pal = sns.color_palette(['black'], df.shape[1])
sns.lineplot(x="variable", y="value", hue='ID', data=datapoints,
estimator=None, legend=False, palette=pal)