¿Cómo mostrar un conjunto de gráficas en una misma ventana o en varias usando Matplotlib?

publicado por: Anonymous

Estoy intentando ver mis resultados de diferentes gráficos en Python con el uso de Matplotlib y subplot. Cuando aplico la función uno y la dos las puedo visualizar bien, pero al aplicar el filtro me da error.

Mi intensión es visualizar cada una de los gráficos generados en cada iteración del ciclo for. ¿Cómo podría hacer esto?

Dejo el siguiente código a modo de ejemplo:

def funcion1(x,y):
    plt.subplot(2,2,1)
    plt.plot(x,y,"g--")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title("cordenadas xy")
    plt.grid(color='gray', linestyle='dashed', linewidth=1, alpha=0.4)
    # Pintar los ejes pasando por (0,0)
    plt.axhline(0, color='black', linewidth=0.5)
    return (z,w)

def funcion2(z,w):
   plt.subplot(2,2,2)
    plt.plot(z,w,"g--")
    plt.xlabel("z")
   plt.ylabel("w")
   plt.title("cordenadas xy")
   plt.grid(color='gray', linestyle='dashed', linewidth=1, alpha=0.4)
   # Pintar los ejes pasando por (0,0)
   plt.axhline(0, color='black', linewidth=0.5)
   return (l,m)

def filtro(p,q):

   global p,q;
   p=[]
   q=[]
    for i in range(0,len(df)-2): #0->>171  #0-->>lend-3
        dnf=(x[i+1]+y[i+2])/2
        lnf=(y[i]+y[i+1]+y[i+2])/2
       #print("dnf:  ",dnf,"lnf:  ",lnf)
        p.append(dnf)
        q.append(lnf)

    plt.subplot(2,2,3)
    plt.plot(p,q,"g--")
    plt.xlabel("z")
    plt.ylabel("w")
    plt.title("cordenadas xy")
    plt.grid(color='gray', linestyle='dashed', linewidth=1, alpha=0.4)
    # Pintar los ejes pasando por (0,0)
    plt.axhline(0, color='black', linewidth=0.5)
    return (p,q)

for i in range(5):
    p,q=filtro(p,q)

solución

Tenemos dos escenarios posibles principalmente:

  • Múltiples gráficos en la misma ventana (figura):

    Si lo que quieres es usar subplots (distintos gráficos con su propio eje o no en una misma figura) puedes usar matplotlib.pyplot.subplot o crear una instancia matplotlib.pyplot.figure previamente y luego añadir subplots dinámicamente con el método matplotlib.pyplot.figure.add_subplot.

    La clave en ambos casos está en manejar los tres primeros parámetros, el primero indica el número de filas de la rejilla, el segundo el número de columnas y el tercero el índice que ocupará el subplot en concreto que estamos agregando en esa rejilla (este índice es base 1, es decir debe estar comprendido entre 1 y numero_filas x numero_columnas ambos incluidos).

  • Múltiples gráficos pero en distintas ventanas (figuras):

    Si quieres que cada función o iteración del ciclo te muestre un gráfico en una ventana distinta entonces debes crear una nueva figura cada vez.

Vamos a ver mejor un ejemplo basado en tu código usando dos funciones, cada una de ellas va a graficar en su propia ventana 4 subplots mediante llamadas iterativas, algo similar a tu código:

import random
import matplotlib.pyplot as plt



p = list(range(14))
q = [random.randint(0, 20) for _ in range(14)]


def filtro(p, q):
    q = [random.randint(0, 20) for _ in range(14)]
    return p, q


fig1 = plt.figure("Filtro")
fig1.subplots_adjust(hspace=0.5, wspace=0.5)

for i in range(1, 5):
    p, q = filtro(p, q)

    ax = fig1.add_subplot(2, 2, i)
    ax.plot(p,q,"g--")
    ax.set_xlabel("z")
    ax.set_ylabel("w")
    ax.set_title("cordenadas xy")
    ax.grid(color='gray', linestyle='dashed', linewidth=1, alpha=0.4)
    # Pintar los ejes pasando por (0,0)
    ax.axhline(0, color='black', linewidth=0.5)



def npotencia(array, exp):
    return [n ** exp for n in array]


# Creamos otra figura, se mostrar
fig2 = plt.figure("n ** i")
fig2.subplots_adjust(hspace=0.5, wspace=0.5)

x = list(range(1, 10))
for i in range(2, 6):
    y = npotencia(x, i)
    ax = fig2.add_subplot(2, 2, i-1)
    ax.plot(x, y, "r-.")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_title("n ** {}".format(i))
    ax.grid(color='gray', linestyle='dashed', linewidth=1, alpha=0.4)
    ax.axhline(0, color='black', linewidth=0.5)

plt.show()

introducir la descripción de la imagen aquí

Este método no está pensado para ser usado con el modo inline de ipython, sino con un backend gráfico de los soportados por Matpoltlib (tkinter, pyqt, etc).

Nota: plt.show solo debe ser llamado una vez en el programa, no una por cada figura.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *