#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'])
Комментариев нет:
Отправить комментарий