¿Cómo puedo hacer una subparcela en blanco en matplotlib?

82

Estoy haciendo un grupo de subtrama (digamos, 3 x 2) en matplotlib, pero tengo menos de 6 conjuntos de datos. ¿Cómo puedo dejar en blanco el resto de la subparcela?

El arreglo se ve así:

+----+----+
| 0,0| 0,1|
+----+----+
| 1,0| 1,1|
+----+----+
| 2,0| 2,1|
+----+----+

Esto puede durar varias páginas, pero en la página final, hay, por ejemplo, 5 conjuntos de datos para el cuadro 2,1 estará vacío. Sin embargo, he declarado la figura como:

cfig,ax = plt.subplots(3,2)

Entonces, en el espacio para la subparcela 2,1 hay un conjunto predeterminado de ejes con marcas y etiquetas. ¿Cómo puedo dejar ese espacio en blanco y sin ejes mediante programación?

mishaF
fuente

Respuestas:

138

Siempre puede ocultar los ejes que no necesita. Por ejemplo, el siguiente código apaga completamente el sexto eje:

import matplotlib.pyplot as plt

hf, ha = plt.subplots(3,2)
ha[-1, -1].axis('off')

plt.show()

y da como resultado la siguiente figura:

Una imagen de una cuadrícula de gráficos de 3x2, sin gráfico representado en la celda inferior derecha

Alternativamente, vea la respuesta aceptada a la pregunta Ocultar el texto del eje en gráficos de matplotlib para una forma de mantener los ejes pero ocultar todas las decoraciones de los ejes (por ejemplo, las marcas de graduación y las etiquetas).

Chris
fuente
Gracias, en realidad eso se acerca aún más a mi pregunta original. Ya acepté la otra respuesta y adapté mi código para usarla, pero ambos enfoques son geniales.
mishaF
Genial, eso es realmente agradable ya que hay menos add_subplot()desorden.
moooeeeep
¡Esto es maravilloso!
FaCoffee
Esto no muestra ningún diagrama y se podría decir que es un diagrama en blanco. Estaba buscando un gráfico que no tenga datos, para mostrar explícitamente que no hay datos. Cualquier modificación fácil de esta respuesta, ¿cuál es?
Zelphir Kaltstahl
@Zelphir No estoy seguro de lo que buscas: los otros cinco gráficos son gráficos vacíos sin datos, así que no estoy seguro de qué extra estás pidiendo. Además, esta es una pregunta nueva. En el futuro, haga esto como una nueva pregunta en lugar de comentar una respuesta anterior.
Chris
26

Se ha agregado una interfaz de subtrama muy mejorada a matplotlib desde que se hizo esta pregunta por primera vez. Aquí puede crear exactamente las subtramas que necesita sin ocultar los extras. Además, las subtramas pueden abarcar filas o columnas adicionales.

import pylab as plt

ax1 = plt.subplot2grid((3,2),(0, 0))
ax2 = plt.subplot2grid((3,2),(0, 1))
ax3 = plt.subplot2grid((3,2),(1, 0))
ax4 = plt.subplot2grid((3,2),(1, 1))
ax5 = plt.subplot2grid((3,2),(2, 0))

plt.show()

ingrese la descripción de la imagen aquí

Enganchado
fuente
Vaya, esa es una buena mejora. ¡Mucho más simple! ¡Gracias @Hooked!
mishaF
@Hooked, ese último espacio en blanco es perfecto para agregar una leyenda. ¿Conoces alguna forma de establecer la leyenda allí?
Stefano
@Stefano seguro que hay formas de hacer esto, pero sería mejor plantearlo como una nueva pregunta, incluso puede vincular esta respuesta en su pregunta (¡bienvenido a StackOverflow por cierto!)
Enganchado
6

También es posible ocultar una subtrama utilizando el método Axes.set_visible ().

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
data = pd.read_csv('sampledata.csv')

for i in range(0,6):
ax = fig.add_subplot(3,2,i+1)
ax.plot(range(1,6), data[i])
if i == 5:
    ax.set_visible(False)
Nick Hunkins
fuente
¡Su respuesta es excelente tanto para ejes originales como para GeoAxes extendidos!
Fei Yao
1

¿Sería una opción crear las subtramas cuando las necesite?

import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt

plt.figure()
plt.gcf().add_subplot(421)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(422)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(423)
plt.fill([0,0,1,1],[0,1,1,0])
plt.suptitle("Figure Title")
plt.gcf().subplots_adjust(hspace=0.5,wspace=0.5)
plt.savefig("outfig")
moooeeeep
fuente
No lo creo porque hay otras cosas de formato que necesito hacer que no incluí en la pregunta original por brevedad. Uno de ellos es plt.subplots_adjust (wspace = 0, hspace = 0). No estoy seguro de que funcione después del hecho.
mishaF
@mishaF: puedes hacer subplots_adjust () usando este enfoque. Ver mi edición.
moooeeeep