Search code examples
pythonpandasdatematplotlibseaborn

How to plot columns from a dataframe as subplots


What am I doing wrong here? I want to create for new dataframe from df and use Dates as the x-axis in a line chart for each newly created dataframe (Emins, FTSE, Stoxx and Nikkei).

I have a dataframe called df that I created from data.xlsx and it looks like this:

    Dates         ES1     Z 1     VG1     NK1
0   2005-01-04  -0.0126  0.0077 -0.0030  0.0052
1   2005-01-05  -0.0065 -0.0057  0.0007 -0.0095
2   2005-01-06   0.0042  0.0017  0.0051  0.0044
3   2005-01-07  -0.0017  0.0061  0.0010 -0.0009
4   2005-01-11  -0.0065 -0.0040 -0.0147  0.0070
3670    2020-09-16  -0.0046 -0.0065 -0.0003 -0.0009
3671    2020-09-17  -0.0083 -0.0034 -0.0039 -0.0086
3672    2020-09-18  -0.0024 -0.0009 -0.0009  0.0052
3673    2020-09-23  -0.0206  0.0102  0.0022 -0.0013
3674    2020-09-24  0.0021  -0.0136 -0.0073 -0.0116

From df I created 4 new dataframes called Eminis, FTSE, Stoxx and Nikkei.

Thanks for your help!!!!

    import numpy as np
    import matplotlib.pyplot as plt
    plt.style.use('classic')
    
    df = pd.read_excel('data.xlsx')
    df = df.rename(columns={'Dates':'Date','ES1': 'Eminis', 'Z 1': 'FTSE','VG1': 'Stoxx','NK1': 'Nikkei','TY1': 'Notes','G 1': 'Gilts', 'RX1': 'Bunds','JB1': 'JGBS','CL1': 'Oil','HG1': 'Copper','S 1': 'Soybeans','GC1': 'Gold','WILLTIPS': 'TIPS'})
    headers = df.columns
    Eminis = df[['Date','Eminis']]
    FTSE = df[['Date','FTSE']]
    Stoxx = df[['Date','Stoxx']]
    Nikkei = df[['Date','Nikkei']]
    
    # create multiple plots via plt.subplots(rows,columns)
    fig, axes = plt.subplots(2,2, figsize=(20,15))
    x = Date
    y1 = Eminis
    y2 = Notes
    y3 = Stoxx
    y4 = Nikkei
    
    # one plot on each subplot
    axes[0][0].line(x,y1)
    axes[0][1].line(x,y2)
    axes[1][0].line(x,y3)
    axes[1][1].line(x,y4)
    
    plt.legends()
    plt.show()

Solution

  • As elegant solution is to:

    • Set Dates column in your DataFrame as the index.
    • Create a figure with the required number of subplots (in your case 4), calling plt.subplots.
    • Draw a plot from your DataFrame, passing:
      • ax - the ax result from subplots (here it is an array of Axes objects, not a single Axes),
      • subplots=True - to draw each column in a separate subplot.

    The code to do it is:

    fig, a = plt.subplots(2, 2, figsize=(12, 6), tight_layout=True)
    df.plot(ax=a, subplots=True, rot=60);
    

    To test the above code I created the following DataFrame:

    np.random.seed(1)
    ind = pd.date_range('2005-01-01', '2006-12-31', freq='7D')
    df = pd.DataFrame(np.random.rand(ind.size, 4),
        index=ind, columns=['ES1', 'Z 1', 'VG1', 'NK1'])
    

    and got the following picture:

    enter image description here

    As my test data are random, I assumed "7 days" frequency, to have the picture not much "cluttered". In the case of your real data, consider e.g. resampling with e.g. also '7D' frequency and mean() aggregation function.