Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

matplotlib разделить маркеры

#python #графика #matplotlib


Есть файл CSV вида 

1,0,enp0s31f6
1,0,enp0s31f6
2,0.286968124,enp0s31f6
3,0.347273802,enp0s31f6
4,0.376051415,enp0s31f6
5,1.895804954,enp0s31f6
6,2.03941807,eth0
7,2.061084575,enp0s31f6
8,3.026748561,enp0s31f6
9,3.247024689,enp0s31f6
10,3.896585252,eth0
11,4.001361629,enp0s31f6
12,4.216054934,enp0s31f6
13,4.26913004,eth0
14,4.26942665,enp0s31f6
15,4.463316773,enp0s31f6


Рисую график вот так:


import matplotlib.pyplot as plt
import csv

x = []
y = []

with open('test.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=',')
    for row in plots:
        x.append(int(row[0]))
        y.append(float(row[1]))

plt.scatter(x,y, marker='o', label='Interfaces')
plt.xlabel('Packets')
plt.ylabel('Time')
plt.title('TEST')
plt.legend()
plt.show()




Получаю на выходе:



Но на данной картинке только 1 вид маркеров (enp0s31f6 и eth0) вместе, как разделить
их? Чтобы , к примеру, enp0s31f6 был синим маркером, а eth0 - оранжевым. 
    


Ответы

Ответ 1



В первую очередь необходимо разделить исходные данные по признаку принадлежности к конкретному интерфейсу. Для этого можно использовать словарь, но так как чтение происходит из csv формата, удобнее будет воспользоваться готовыми инструментами (numpy, pandas). Например, функция recfromcsv из numpy позволяет получить исходные данные в виде numpy.recarray с автоматическим определением типов. import matplotlib.pyplot as plt import numpy as np data = np.recfromcsv('test.csv', encoding=None, names=('time', 'packets', 'interface')) # если в реальности интерфейсов будет больше, то надо добавить цветов colors = 'blue', 'orange' ifaces = np.unique(data.interface) # множество интерфейсов assert len(colors) == ifaces.size for color, iface in zip(colors, ifaces): # получение данных, относящихся к текущему интерфейсу items = data[data.interface == iface] plt.scatter(items.time, items.packets, marker='o', label=iface, color=color) plt.xlabel('Packets') plt.ylabel('Time') plt.title('TEST') plt.legend() plt.show()

Ответ 2



import matplotlib.pyplot as plt import csv x = [] y = [] cl= [] # + with open('test.csv','r') as csvfile: plots = csv.reader(csvfile, delimiter=',') for row in plots: x.append(int(row[0])) y.append(float(row[1])) cl.append('r' if row[2]=='eth0' else 'g') # + plt.scatter(x,y, marker='o', c=cl, label='Interfaces') # + c=cl plt.xlabel('Packets') plt.ylabel('Time') plt.title('TEST') plt.legend() plt.show()

Ответ 3



По-моему проще всего решить эту задачу используя Pandas: import numpy as np import pandas as pd df = pd.read_csv(r'C:\Temp\test.csv', header=None, names=['x','y','name']) df['col'] = np.where(df['name'] == 'enp0s31f6', 'blue', 'orange') df.plot.scatter(x='x', y='y', c=df['col'])

Комментариев нет:

Отправить комментарий