python - real - matplotlib ejes
¿Cuál es la diferencia entre dibujar parcelas usando parcelas, ejes o figuras en matplotlib? (2)
Estoy un poco confundido con lo que sucede en el backend cuando dibujo gráficos en matplotlib, tbh, no estoy claro con la jerarquía de gráfico, ejes y figura. Leí la documentación y fue útil, pero todavía estoy confundido ...
El siguiente código dibuja la misma trama de tres maneras diferentes:
#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)
Ahora mi pregunta es:
-
¿Cuál es la diferencia entre los tres? Quiero decir, ¿qué pasa debajo del capó cuando se llama a cualquiera de los 3 métodos?
-
¿Qué método se debe usar cuándo y cuáles son las ventajas y desventajas de usar alguno de ellos?
Los nombres de los objetos.
Matplotlib está fuertemente orientado a objetos y sus objetos principales son la
figura
y los
ejes
(encuentro que el nombre de los
axes
un poco engañoso, pero probablemente solo soy yo).
Puede pensar en la
figura
como un
lienzo
, del cual normalmente especifica las dimensiones y posiblemente, por ejemplo, el color de fondo, etc. Utiliza el lienzo, la
figura
, esencialmente de dos maneras, colocando otros objetos en él (principalmente
ejes
, pero también etiquetas de texto, etc.) y guardar su contenido con
savefig
.
Puedes pensar en un
hacha
como una especie de navaja suiza, un objeto útil que ofrece una herramienta (por ejemplo
.plot
,
.scatter
,
.hist
, etc.) para todo, principalmente.
Puede colocar uno, dos, ... muchos
ejes
dentro de una
figura
utilizando uno de los muchos métodos diferentes.
La interfaz
plt
La interfaz de procedimiento
plt
se desarrolló originalmente para imitar la interfaz MATLAB ™ pero no es realmente diferente de la interfaz orientada a objetos, incluso si no hace una referencia directa a los objetos principales (es decir, una
figura
y un
eje
), estos objetos son se instancia automáticamente y cada método
plt
se traduce esencialmente a una llamada de uno de los métodos de los objetos fundamentales subyacentes: por ejemplo, un
plt.plot()
es
hidden_axes.plot
y un
plt.savefig
es
hidden_figure.savefig
.
En cada momento puede controlar estos objetos ocultos utilizando
plt.gcf
y
plt.gca
, y esto a veces es necesario cuando uno de los métodos de objeto no se ha portado a un método en el espacio de nombres
plt
.
Me gustaría agregar que el espacio de nombres plt contiene también una serie de métodos convenientes para instanciar, de diferentes maneras, figuras y ejes .
Sus ejemplos
1er camino
plt.plot(x, y)
Aquí solo usa la interfaz plt , solo puede usar un solo eje en cada figura , pero esto es lo que desea cuando está explorando sus datos, una receta rápida que hace el trabajo ...
2da forma
ax = plt.subplot() ax.plot(x, y)
Aquí usa un método conveniente en el espacio de nombres plt para dar un nombre (y un identificador) a su objeto de ejes , pero por cierto también hay una figura oculta. Más tarde, puede usar el objeto ejes para trazar, hacer un histograma, etc., todo lo que puede hacer con la interfaz plt , pero también puede acceder a todos sus atributos y modificarlos con mayor libertad.
3er camino
figure = plt.figure() new_plot = figure.add_subplot(111) new_plot.plot(x, y)
Aquí comienza a crear instancias de una figura usando un método conveniente en el espacio de nombres plt y luego usa solo la interfaz orientada a objetos.
Es posible omitir el método de conveniencia
plt
(
matplotlib.figure.Figure
) pero luego tiene que ajustar la figura para una mejor experiencia interactiva (después de todo, es un método de
conveniencia
).
Recomendaciones personales
Sugiero
plt.plot
,
plt.scatter
en el contexto de una sesión interactiva, posiblemente usando
IPython
con su comando mágico
%matplotlib
, y también en el contexto de un cuaderno exploratorio de Jupyter.
Por otro lado, el enfoque orientado a objetos, más algunos métodos de conveniencia, es el camino a seguir.
- Si tiene un problema permanente que resolver de una vez por todas con un arreglo personalizado de subtramas finamente ajustadas,
- si desea incrustar Matplotlib en la interfaz de usuario de un programa que escriba.
Hay una gran área gris entre estos extremos y si me preguntas qué hacer, solo diría "Depende" ...
Método 1
plt.plot(x, y)
Esto le permite trazar solo una figura con coordenadas (x, y). Si solo desea obtener un gráfico, puede usarlo de esta manera.
Método 2
ax = plt.subplot()
ax.plot(x, y)
Esto le permite trazar una o varias figuras en la misma ventana. Mientras lo escribe, trazará solo una figura, pero puede hacer algo como esto:
fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
Trazará 4 figuras que se denominan ax1, ax2, ax3 y ax4 cada una pero en la misma ventana. Esta ventana se dividirá en 4 partes con mi ejemplo.
Método 3
fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)
No lo usé, pero puedes encontrar documentación.
Ejemplo:
import numpy as np
import matplotlib.pyplot as plt
# Method 1 #
x = np.random.rand(10)
y = np.random.rand(10)
figure1 = plt.plot(x,y)
# Method 2 #
x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)
figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)
plt.show()
Otro ejemplo: