Search code examples
pythonmatplotlibplotlyaxis-labels

Having a single y axis values while plotting two variables on secondary axis


I am trying to plot three variables, in a graph using primary and secondary axis with one variable on primary axis and two on secondary axis. My code

vav = floor_data[floor_data['vavId'] == i]
        vav = vav.reset_index()
        x = vav.index 
        y1 = vav['nvo_temperature_sensor_pps']
        y2 = vav['nvo_airflow']
        y3 = vav['nvo_air_damper_position']   

        fig, ax1 = plt.subplots()
        ax2 = ax1.twinx()
        ax1.plot(x, y1, 'g-')
        ax2.plot(x, y2, 'b-')
        ax2.plot(x, y3, 'r-')
        ax2 = ax1.twinx()

        ax1.set_xlabel('VAV '+str(i))
        ax1.set_ylabel('temperature ', color='g')
        ax2.set_ylabel('air flow, temperature', color='b')

        plt.show()

I have added all the three variables but I am facing problem in y-ticks of secondary axis. My plot looks like enter image description here

Is it possible to have a single y tick values on secondary axis for better readability?


Solution

  • You need to create new twix axis on host and shrink subplot to create space for additional axis on right side. Then move new axis at right position. Some descriptions in code.

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, host = plt.subplots()
    # shrink subplot
    fig.subplots_adjust(right=0.75)
    
    # create new axis on host
    par1 = host.twinx()
    par2 = host.twinx()
    # place second axis at far right position
    par2.spines["right"].set_position(("axes", 1.2))
    
    
    # define plot functions
    def function_sin(x):
        return np.sin(x)
    
    
    def function_parabola(x):
        return x**2
    
    
    def function_line(x):
        return x+1
    
    # plot data
    x = np.linspace(0, 10, 100)
    y_sin = function_sin(x)
    y_parabola = function_parabola(x)
    y_line = function_line(x)
    host.plot(x, y_sin, "b-")
    par1.plot(x, y_parabola, "r-")
    par2.plot(x, y_line, "g-")
    
    # set labels for each axis
    host.set_xlabel("VAV 16")
    host.set_ylabel("Temperature")
    par1.set_ylabel("Temperature")
    par2.set_ylabel("Air Flow")
    
    plt.show()
    

    Output:

    enter image description here