tiempo real matrices lineas graficas graficar encimar ejes dibujar crear como python matplotlib

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:

  1. ¿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?

  2. ¿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: