dos (o más) gráficas en una gráfica con diferentes escalas de eje X e eje Y en python

Quiero 3 gráficos en un objeto de ejes, por ejemplo:

#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_values2=[10,20,39,40,50] x_values3=[150,200,250,300,350] y_values3=[10,20,30,40,50] #make axes fig=plt.figure() ax=fig.add_subplot(111) 

ahora quiero agregar los tres conjuntos de datos a ax. Pero no deberían compartir ningún eje x o y (desde entonces, debido a las diferentes escalas, uno sería mucho más pequeño que el otro. Necesito algo como ax.twinx (), ax.twiny (), pero ambos x – y el eje y deben ser independientes.

Quiero hacer esto, porque quiero poner las dos plots adjuntas (y una tercera, que es similar a la segunda) en una plot (“ponerlas una encima de la otra”). Parcela1 plot2

Luego pondría las tags x / y (y / o marcas, límites) de la segunda gráfica a la derecha / arriba y los límites x / y de otra gráfica en la parte inferior / izquierda. No necesito x / y-tags de la 3. plot.

¿Cómo hago esto?

La idea sería crear tres subplots en la misma posición. Para asegurarse, se reconocerán como gráficos diferentes, sus propiedades deben diferir, y la forma más sencilla de lograrlo es simplemente proporcionar una etiqueta diferente, ax=fig.add_subplot(111, label="1") .

El rest es simplemente ajustar todos los parámetros de los ejes, de modo que la gráfica resultante se vea atractiva. Es un poco de trabajo configurar todos los parámetros, pero lo siguiente debe hacer lo que necesita.

introduzca la descripción de la imagen aquí

 import matplotlib.pyplot as plt x_values1=[1,2,3,4,5] y_values1=[1,2,2,4,1] x_values2=[-1000,-800,-600,-400,-200] y_values2=[10,20,39,40,50] x_values3=[150,200,250,300,350] y_values3=[10,20,30,40,50] fig=plt.figure() ax=fig.add_subplot(111, label="1") ax2=fig.add_subplot(111, label="2", frame_on=False) ax3=fig.add_subplot(111, label="3", frame_on=False) ax.plot(x_values1, y_values1, color="C0") ax.set_xlabel("x label 1", color="C0") ax.set_ylabel("y label 1", color="C0") ax.tick_params(axis='x', colors="C0") ax.tick_params(axis='y', colors="C0") ax2.scatter(x_values2, y_values2, color="C1") ax2.xaxis.tick_top() ax2.yaxis.tick_right() ax2.set_xlabel('x label 2', color="C1") ax2.set_ylabel('y label 2', color="C1") ax2.xaxis.set_label_position('top') ax2.yaxis.set_label_position('right') ax2.tick_params(axis='x', colors="C1") ax2.tick_params(axis='y', colors="C1") ax3.plot(x_values3, y_values3, color="C3") ax3.set_xticks([]) ax3.set_yticks([]) plt.show() 

También puede estandarizar los datos para que compartan los mismos límites y luego trazar los límites de la segunda escala deseada “manualmente”. Esta función estandariza los datos a los límites del primer conjunto de puntos:

 def standardize(data): for a in range(2): span = max(data[0][a]) - min(data[0][a]) min_ = min(data[0][a]) for idx in range(len(data)): standardize = (max(data[idx][a]) - min(data[idx][a]))/span data[idx][a] = [i/standardize + min_ - min([i/standardize for i in data[idx][a]]) for i in data[idx][a]] return data 

Entonces, trazar los datos es fácil:

 import matplotlib.pyplot as plt data = [[[1,2,3,4,5],[1,2,2,4,1]], [[-1000,-800,-600,-400,-200], [10,20,39,40,50]], [[150,200,250,300,350], [10,20,30,40,50]]] limits = [(min(data[1][a]), max(data[1][a])) for a in range(2)] norm_data = standardize(data) fig, ax = plt.subplots() for x, y in norm_data: ax.plot(x, y) ax2, ax3 = ax.twinx(), ax.twiny() ax2.set_ylim(limits[1]) ax3.set_xlim(limits[0]) plt.show() 

Dado que todos los puntos de datos tienen los límites del primer conjunto de puntos, podemos simplemente trazarlos en el mismo eje. Luego, utilizando los límites de los segundos ejes xey deseados, podemos establecer los límites para estos dos.

Parcela de resultados