pythonnumpymatplotlibplotmultiple-axes

Matplotlib: how to plot data from lists, adding two y-axes?


I need to produce some plots with matplotlib but I am very poor at it. I have five lists which contain 100 values each. Their values vary according to:

enter image description here

I want to be able to produce two line-and-marker charts out of them:

  1. The first plot involves List 1, 2, 3, and 4, and has two y-axes. List 1, 2, and 3 rely on the regular y-axis, while list 4 relies on the added y-axis, like the following:

enter image description here

  1. The second has to plot just List 4 and 5, but with the regular y-axis.

Do I need to turn the each list into a numpy array before going on? Anyhow, I failed to figure out how to do the plotting with matplotlib. Any help will be much appreciated. Thanks!


Solution

  • You just need to make a twinx axes to plot list 4 on a separate y axis. You can see an example here.

    And here's a short script to do what you want. No need to convert to numpy arrays in this case.

    import matplotlib.pyplot as plt
    
    # Some sample lists
    l1 = [0.7,0.8,0.8,0.9,0.8,0.7,0.6,0.9,1.0,0.9]
    l2 = [0.2,0.3,0.1,0.0,0.2,0.1,0.3,0.1,0.2,0.1]
    l3 = [0.4,0.6,0.4,0.5,0.4,0.5,0.6,0.4,0.5,0.4]
    
    l4 = [78,87,77,65,89,98,74,94,85,73]
    l5 = [16,44,14,55,34,36,76,54,43,32]
    
    # Make a figure
    fig = plt.figure()
    
    # Make room for legend at bottom
    fig.subplots_adjust(bottom=0.2)
    
    # The axes for your lists 1-3
    ax1 = fig.add_subplot(211)
    # A twin axis for list 4. This shares the x axis, but has a separate y axis
    ax2 = ax1.twinx()
    
    # Plot lines 1-3
    line1 = ax1.plot(l1,'bo-',label='list 1')
    line2 = ax1.plot(l2,'go-',label='list 2')
    line3 = ax1.plot(l3,'ro-',label='list 3')
    
    # Plot line 4
    line4 = ax2.plot(l4,'yo-',label='list 4')
    
    # Some sensible y limits
    ax1.set_ylim(0,1)
    ax2.set_ylim(0,100)
    
    # Your second subplot, for lists 4&5
    ax3 = fig.add_subplot(212)
    
    # Plot lines 4&5
    ax3.plot(l4,'yo-',label='list 4')
    line5 = ax3.plot(l5,'mo-',label='list 5')
    
    # To get lines 1-5 on the same legend, we need to 
    # gather all the lines together before calling legend
    lines = line1+line2+line3+line4+line5
    labels = [l.get_label() for l in lines]
    
    # giving loc a tuple in axes-coords. ncol=5 for 5 columns
    ax3.legend(lines, labels, loc=(0,-0.4), ncol=5)
    
    ax3.set_xlabel('events')
    
    # Display the figure
    plt.show()
    

    enter image description here