Список графиков кортежей (содержащий номер графика) - PullRequest
1 голос
/ 06 января 2020

Мой вопрос связан с этим вопросом "Python: список графиков кортежей ". Разница заключается в структуре кортежа. Первая часть показывает номер участка, а вторая - значение (у). Мне удалось извлечь данные из одного большого списка в три списка.

Как я могу построить этот список кортежей на трех графиках (линейный график)?

[(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
[(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
[(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Вы должны создать третье измерение для своего кортежа, чтобы представить ось x, иначе нечего строить. Я предполагаю, что они в порядке, и что индекс кортежа в списке может рассматриваться как некий элемент времени.

Я думаю, что было бы легче понять, если бы вы делали это шаг за шагом. Первый элемент в каждом кортеже можно рассматривать как цвет линии, а второй - как значение оси y. Предполагая, что они в порядке, вы можете перечислить каждый список и принять инкрементное значение в качестве значения оси X.

Так что итерируйте по всем 3 спискам, затем итерируйте по каждому перечисляемому кортежу, добавляя его в основной список data каковы будут значения x, y и цвета для вашего окончательного набора данных.

Перетащите их в pandas фрейм данных и используйте seaborn для точного создания многострочного графика, который вы ищете.

import pandas as pd
import seaborn as sns

a = [(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
b = [(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
c = [(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

data = []
for x in [a,b,c]:
    for i, t in enumerate(x):
        data.append([i, t[0], t[1]])

df = pd.DataFrame(data)
df = df.astype(int)
df.columns=['Time','Color','Value']

sns.lineplot(x='Time',y='Value',hue='Color',data=df)
0 голосов
/ 06 января 2020

То же самое, просто добавьте функцию для очистки кортежей, чтобы преобразовать строки в целые:

import matplotlib.pyplot as plt

p1 = [(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
p2 = [(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
p3 = [(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

def cleaner(mylist):
    out = []
    for tup in mylist:
        newtup = tuple()
        for item in tup:
            newtup += (int(item),)
        out.append(newtup)
    return(out)

plt.plot(*zip(*cleaner(p1)))
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...