Intercambiar los bordes en artistas individuales de dos ejes.

Tengo una figura en la que trazo dos ejes-objetos, ax1 y ax2 , donde ax2 = ax1.twinx() .

¿Cómo puedo intercambiar los bordes en artistas individuales de cada uno de los ejes? Por ejemplo, me gustaría que un artista de ax1 estuviera en un segundo plano, luego tuviera a todos los artistas de ax2 además de eso, y luego ax1 el rest de los artistas de ax1 . Como ejemplo, me gustaría trazar lo siguiente en el orden en que está escrito (es decir, (x3, y3) encima de (x2, y2) encima de (x1, y1) )

 import matplotlib.pyplot as plt fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.plot(x1, y1) ax2.plot(x2, y2) ax1.plot(x3, y3) 

¿Cómo se puede hacer esto?

Esta respuesta muestra cómo revertir los bordes de los ejes, pero no en elementos individuales.

No puedes simplemente ajustar el orden z de los artistas a través de los ejes. El orden z de los artistas que pertenecen a un eje es relativo a ese eje solamente.

Sin embargo, puede obtener el efecto deseado, pero no fácilmente. Aquí hay dos opciones:

Utilizando 3 ejes

En mi opinión, la forma más sencilla es utilizar 3 ejes, siendo el tercer eje un “clon” completo del primero, pero con un orden z por encima de ax2 .

 fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax3 = fig.add_axes(ax1.get_position(), sharex=ax1, sharey=ax1) ax3.set_facecolor('none') #prevents axes background from hiding artists below ax3.set_axis_off() # pervents superimposed ticks from being drawn l_bottom, = ax1.plot([1,2,3], [4,6,6], lw=10, c='C1') l2, = ax2.plot([1,2,3], [60,30,40], lw=10, c='C2') l_top, = ax3.plot([1,2,3],[5,10,3], lw=10, c='C3') ax3.legend([l_bottom, l2, l_top],['left','right','left']) ax3.set_title('using a 3rd axe') 

introduzca la descripción de la imagen aquí

Utilizando transformadas

Este método solo usa 2 ejes, pero traza la línea verde en ax2 usando las coordenadas de datos de ax1 . El problema con ese método es que ax1 no se autoescala automáticamente, de ahí la necesidad de llamar a set_ylim() . Además, podría ser bastante confuso en un código más grande para realizar un seguimiento de qué transformada utiliza cada artista.

 fig, ax1 = plt.subplots() ax2 = ax1.twinx() l_bottom, = ax1.plot([1,2,3], [4,6,6], lw=10, c='C1') l2, = ax2.plot([1,2,3], [60,30,40], lw=10, c='C2') l_top, = ax2.plot([1,2,3],[5,10,3], lw=10, c='C3',transform=ax1.transData) ax1.set_ylim(2.65,10.35) # matches the limits on the previous graph ax2.set_ylim(28.5,61.5) ax2.legend([l_bottom, l2, l_top],['left','right','left']) ax2.set_title('using transforms') 

introduzca la descripción de la imagen aquí