two (or more) graphs in one plot with different x-axis AND y-axis scales in python

前端 未结 3 2005
刺人心
刺人心 2020-12-13 21:23

I want 3 graphs on one axes object, for example:

#example x- and y-data
x_values1=[1,2,3,4,5]
y_values1=[1,2,3,4,5]

x_values2=[-1000,-800,-600,-400,-200]
y_         


        
3条回答
  •  臣服心动
    2020-12-13 22:03

    In this example, you can plot multiple lines in each x-y-axis, and legend each line.

    import numpy as np
    import matplotlib.pyplot as plt
    X1 = np.arange(10)
    X1 = np.stack([X1, X1])
    Y1 = np.random.randint(1, 10, (2, 10))
    X2 = np.arange(0, 1000, 200)
    X2 = np.stack([X2, X2])
    Y2 = np.random.randint(100, 200, (2, 5))
    
    
    x_label_names = ['XXX', 'xxx']
    y_label_names = ['YYY', 'yyy']
    X1_legend_names = ['X1_legend1', 'X1_legend2']
    X2_legend_names = ['X2_legend1', 'X2_legend2']
    
    
    def plot_by_two_xaxis(X1, Y1, X2, Y2, x_label_names: list, y_label_names: list, X1_legend_names: list, X2_legend_names: list):
        fig = plt.figure()
        ax1s = []
        ax2s = []
        lines = []
        j = 0
        for i in range(len(X1)):
            j += 1
            ax1s.append(fig.add_subplot(111, label=f"{j}", frame_on=(j == 1)))
        for i in range(len(X2)):
            j += 1
            ax2s.append(fig.add_subplot(111, label=f"{j}", frame_on=(j == 1)))
    
        k = 0
        for i in range(len(X1)):
            lines.append(ax1s[i].plot(X1[i], Y1[i], color=f"C{k}")[0])
            if i == 0:
                ax1s[i].set_xlabel(x_label_names[0], color=f"C{k}")
                ax1s[i].set_ylabel(y_label_names[0], color=f"C{k}")
                ax1s[i].tick_params(axis='x', colors=f"C{k}")
                ax1s[i].tick_params(axis='y', colors=f"C{k}")
            else:
                ax1s[i].set_xticks([])
                ax1s[i].set_yticks([])
            k += 1
    
        for i in range(len(X1)):
            lines.append(ax2s[i].plot(X2[i], Y2[i], color=f"C{k}")[0])
            if i == 0:
                ax2s[i].xaxis.tick_top()
                ax2s[i].yaxis.tick_right()
                ax2s[i].set_xlabel(x_label_names[1], color=f"C{k}")
                ax2s[i].set_ylabel(y_label_names[1], color=f"C{k}")
                ax2s[i].xaxis.set_label_position('top')
                ax2s[i].yaxis.set_label_position('right')
                ax2s[i].tick_params(axis='x', colors=f"C{k}")
                ax2s[i].tick_params(axis='y', colors=f"C{k}")
            else:
                ax2s[i].set_xticks([])
                ax2s[i].set_yticks([])
            k += 1
    
        ax1s[0].legend(lines, X1_legend_names + X2_legend_names)
    
        plt.show()
    
    
    plot_by_two_xaxis(X1, Y1, X2, Y2, x_label_names,
                    y_label_names, X1_legend_names, X2_legend_names)
    

提交回复
热议问题