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()
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
yset_ylim
.plt
tiene muchos menos opciones que trabajar directamente con el objeto de ejes. De hecho, casi todas las funciones deplt
es un envoltorio muy delgado que primero llamaax = plt.gca()
y luego llama a cualquier función en ese objeto. No deberías estar usandoplt
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 unaget_ylim()
función en elaxes
que devolverá los límites yax.get_yaxis()
función que le devolverá laaxis
(note la diferencia entreaxes
yaxis
). 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
yplt.ylim
están enmatplotlib.pyplot
yax.set_xlim
yax.set_ylim
son métodos en elAxes
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
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