python-3.xpandasmatplotlibseabornrelplot

Subplots depending on one column


I have a Dataframe and based on its data, I draw lineplots for it. The code currently looks as simple as that:

ax = sns.lineplot(x='datapoints', y='mean', hue='index', data=df)
sns.move_legend(ax, "upper left", bbox_to_anchor=(1, 1))

Now, there actually is a column, called "klinger", which has 8 different values and I would like to get a plot consisting of eight subplots (4x2) for it, all sharing just one legend.

Is that an easy thing to do?

Currently, I generate sub-dfs by filtering and just draw eight diagrams and cut them together with a graphic tool, but this can't be the solution


Solution

  • You can get what you are looking for with sns.relplot and kind='line'. Use col='klinger' to plot subplots as many as you need, col_wrap=4 will help to obtain 4x2 shape, and col_order=klinger_categories will select which categories you want to plot.

    import numpy as np
    import pandas as pd
    import seaborn as sns
    number = 100
    klinger_categories = ['a','b','c','d','e','f','g','h']
    data = {'datapoints': np.arange(number),
            'mean': np.random.normal(0,1,size=number),
            'index': np.random.choice(np.arange(2),size=number),
            'klinger': np.random.choice(klinger_categories,size=number),
            }
    df = pd.DataFrame(data)
    sns.relplot(
            data=df, x='datapoints', y='mean', hue='index', kind='line',
            col='klinger', col_wrap=4, col_order=klinger_categories
            )
    

    Output