Cómo configurar xlim e ylim para una subparcela [duplicate]

3 minutos de lectura

Avatar de usuario de Cupitor
cupidor

Me gustaría limitar los ejes X e Y en matplotlib para una subparcela específica. La figura de la trama secundaria en sí no tiene ninguna propiedad de eje. Quiero, por ejemplo, cambiar solo los límites para la segunda trama:

import matplotlib.pyplot as plt
fig=plt.subplot(131)
plt.scatter([1,2],[3,4])
fig=plt.subplot(132)
plt.scatter([10,20],[30,40])
fig=plt.subplot(133)
plt.scatter([15,23],[35,43])
plt.show()

  • su pregunta no fue clara, puedo pensar en 4 o 5 formas de configurar algo tan simple con subtramas.

    – tacoswell

    7 de abril de 2013 a las 2:34

  • Si puede pensar en configurar de 4 o 5 maneras, muestra que ya entendió la pregunta en primer lugar.

    – Cupido

    7 de abril de 2013 a las 2:36

  • Porque sospeché que tiene algunas lagunas en su comprensión de la jerarquía de clases de mpl (que confirman sus nombres de variables). Por lo tanto, se beneficiará más si puedo mostrarle cómo adaptar el código que ya tiene.

    – tacoswell

    7 de abril de 2013 a las 2:50

avatar de usuario de tacaswell
tacaswell

Debe usar la interfaz OO para matplotlib, en lugar de la interfaz de la máquina de estado. Casi todos los plt.* función son envolturas delgadas que básicamente hacen gca().*.

plt.subplot devuelve un axes objeto. Una vez que tenga una referencia al objeto de ejes, puede trazar directamente en él, cambiar sus límites, etc.

import matplotlib.pyplot as plt

ax1 = plt.subplot(131)
ax1.scatter([1, 2], [3, 4])
ax1.set_xlim([0, 5])
ax1.set_ylim([0, 5])


ax2 = plt.subplot(132)
ax2.scatter([1, 2],[3, 4])
ax2.set_xlim([0, 5])
ax2.set_ylim([0, 5])

y así sucesivamente para tantos ejes como quieras.

o mejor, envuélvelo todo en un bucle:

import matplotlib.pyplot as plt

DATA_x = ([1, 2],
          [2, 3],
          [3, 4])

DATA_y = DATA_x[::-1]

XLIMS = [[0, 10]] * 3
YLIMS = [[0, 10]] * 3

for j, (x, y, xlim, ylim) in enumerate(zip(DATA_x, DATA_y, XLIMS, YLIMS)):
    ax = plt.subplot(1, 3, j + 1)
    ax.scatter(x, y)
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

  • El problema de mantener la instancia del eje es que no tiene todas las propiedades que tiene plt, por ejemplo, no se puede usar axis.ylim() para obtener el ylim del gráfico en un eje.

    – deslumbrante

    21 de enero de 2014 a las 19:09

  • @dashesy Tú usas set_xlim y set_ylim. plt tiene muchos menos opciones que trabajar directamente con el objeto de ejes. De hecho, casi todas las funciones de plt es un envoltorio muy delgado que primero llama ax = plt.gca() y luego llama a cualquier función en ese objeto. No deberías estar usando plt para cualquier cosa menos trabajo interactivo.

    – tacoswell

    21 de enero de 2014 a las 19:12

  • Sí, estoy de acuerdo, es preferible no depender de la versión interactiva, pero no hay forma de obtener el ylim de una trama que tiene solo un eje. Después de hacer una trama, tendrá un automático ylim asignado, pero el eje no tendrá esa información. Entonces, si los últimos dibujos dependen del ylim, como dijiste, uno tiene que set_ylim para anular el rango actual.

    – deslumbrante

    21/01/2014 a las 21:45


  • lo siento, me olvidé de ese poco de magia en plt.ylim. También hay una get_ylim() función en el axes que devolverá los límites y ax.get_yaxis() función que le devolverá la axis (note la diferencia entre axes y axis). También existen las versiones simétricas para el eje x.

    – tacoswell

    21/01/2014 a las 21:55

  • @aderchox porque están en diferentes espacios de nombres. plt.xlim y plt.ylim están en matplotlib.pyplot y ax.set_xlim y ax.set_ylim son métodos en el Axes objeto. En casi todos los casos, debería preferir usar los métodos Axes en lugar de pyplot.

    – tacoswell

    1 de abril de 2020 a las 16:51

¿Ha sido útil esta solución?