Unir con rectas Scatter Plot Matplotlib

publicado por: Anonymous

Tengo un diagrama de dispersión como el que se muestra en la figura y quiero unir los puntos con segmentos, pero no todos, sino en grupos de a 5. Es decir, cuatro segmentos que unan los primeros 5 puntos, cuatro segmentos que unan los siguientes 5 puntos y así… son 120 puntos en total, por lo que serían 24 grupos de 5.

Scatter plot

Este es el código que generó ese gráfico:

plt.scatter(np.arange(1,121), mos[0:120])
plt.title('Imagen 1')
plt.ylabel('MOS')
plt.xlabel('Numero de Imagen')
plt.grid(True)
plt.tight_layout()
plt.show()

¿Cómo agrego los segmentos?

Desde ya muchas gracias.

solución

Puedes hacer lo siguiente:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import collections  as mc

mos = np.random.rand(120)
y = np.arange(1,121)

fig, ax = plt.subplots()
plt.scatter(y, mos)

cant = 5
for i in range(0,len(mos),cant):
    lines = []
    for j in range(0,cant-1):
        p = [(y[i+j], mos[i+j]), (y[i+j+1], mos[i+j+1])]
        lines.append(p)

    lc = mc.LineCollection(lines, colors='red', linewidths=1)
    ax.add_collection(lc)


plt.title('Imagen 1')
plt.ylabel('MOS')
plt.xlabel('Numero de Imagen')
plt.grid(True)
plt.tight_layout()

plt.show()

Ten en cuenta que no dispongo del array mos así que lo simulo con valores random. Lo que define los segmentos es el siguiente código:

cant = 5
for i in range(0,len(mos),cant):
    lines = []
    for j in range(0,cant-1):
        p = [(y[i+j], mos[i+j]), (y[i+j+1], mos[i+j+1])]
        lines.append(p)

    lc = mc.LineCollection(lines, colors='red', linewidths=1)
    ax.add_collection(lc)

Es decir, recorremos mos en pasos de cant = 5 y luego armamos los 4 puntos segmentos, estableciendo el punto inicial y el final: p = [(y[i+j], mos[i+j]), (y[i+j+1], mos[i+j+1])]. La salida sería algo así:

introducir la descripción de la imagen aquí

Respondido por: Anonymous

Leave a Reply

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