pythonpandasseabornrelplot

How to plot data from multiple dataframes with seaborn relplot


I want to plot two lines on the same set of axes. It seems sns.relplot is creating a facetted figure, and I don't know how to specify that I want the second line on the same facet as the first.

Here's a MWE

import numpy as np
import pandas as pd
import seaborn as sns

x = np.random.uniform(low = 1, high = 10, size = 20)

df1 = pd.DataFrame({'x': x, 'y1': 2 * x, 'type': 'a'})
df2 = pd.DataFrame({'x': x, 'y2': 3 * x, 'type': 'b'})

sns.relplot(data = df1, x = 'x', y = 'y1', kind = 'line', hue = 'type', palette = ['red'])
sns.relplot(data = df2, x = 'x', y = 'y2', kind = 'line', hue = 'type', palette = ['blue'])

How do I get the red and blue lines on the same plot? I've not had luck with different permutations of map.


Solution

  • import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    np.random.seed(2022)  # to create the same sample data
    x = np.random.uniform(low=1, high=10, size=20)
    
    df1 = pd.DataFrame({'x': x, 'y1': 2 * x, 'type': 'a'})
    df2 = pd.DataFrame({'x': x, 'y2': 3 * x, 'type': 'b'}).rename(columns={'y2': 'y1'})
    
    df = pd.concat([df1, df2], ignore_index=True)
    
    # plot df
    g = sns.relplot(data=df, x='x', y='y1', kind='line', hue='type', palette=['red', 'blue'])
    

    enter image description here

    Alternatives

    np.random.seed(2022)
    x = np.random.uniform(low = 1, high = 10, size = 20)
    
    df1 = pd.DataFrame({'x': x, 'y1': 2 * x, 'type': 'a'})
    df2 = pd.DataFrame({'x': x, 'y2': 3 * x, 'type': 'b'})
    
    fig, ax = plt.subplots(figsize=(5, 5))
    
    sns.lineplot(data=df1, x='x', y='y1', label='a', ax=ax)
    sns.lineplot(data=df2, x='x', y='y2', label='b', ax=ax)
    
    ax = df1.plot(x='x', figsize=(5, 5))
    df2.plot(x='x', ax=ax)