Как построить данные, извлеченные из списка? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть список, содержащий данные, подобные этому примеру

data=[[january-b1,0.25,0.33],[february-b1,0.254,0.9],...,[august-b1,0.1,0.13],[january-b2,0.25,0.33],[february-b2,0.254,0.9],...,[august-b3,0.1,0.13]....]

каждый месяц имеет 10 полос b1..b10 и 2 значения. Я хочу построить график изменения каждой полосы в зависимости от месяцев. Каждая полоса имеет 2 числа: изменение первого значения и второго значения.

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

Это может быть первое приближение

import matplotlib.pyplot as plt

#plt.clf()
plt.ylabel('ylabel')
plt.xlabel('xlabel')
plt.title("My plot")

data=[["january-b1",0.25,0.33],["february-b1",0.254,0.9],["august-b1",0.1,0.13]]
labels,l_v1,l_v2 = [],[],[]
for l,v1,v2 in data:
    labels.append(l)
    l_v1.append(v1)
    l_v2.append(v2)
plt.plot(range(len(labels)), l_v1,linestyle='--', marker='o', color='blue')
plt.plot(range(len(labels)), l_v2, linestyle='--', marker='o', color='red')
plt.xticks(range(len(labels)),labels)
#plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

enter image description here

Другое возможное решение (каждая строка представляет месяц). Есть 2 строки по месяцам, цвет линий переменных одного месяца одинаков.

import matplotlib.pyplot as plt

#plt.clf()
plt.ylabel('ylabel')
plt.xlabel('xlabel')
plt.title("My plot")
colors = [
    "red", "orange", "blue", "purple", "yellow", "olive", "aqua",
    "red", "orange", "blue", "purple", "yellow", "olive"
]
data = [["january-b1", 0.25, 0.33], ["january-b2", 0.23, 0.33],["january-b3", 0.25, 0.33],
        ["february-b1", 0.254, 0.9],["february-b2", 0.274, 0.79],["february-b3", 0.254, 0.94],
        ["august-b1", 0.12, 0.13],["august-b2", 0.1, 0.13],["august-b3", 0.0, 0.23]]


variables_dict_1 = {}
variables_dict_2 = {}
for l,v1,v2 in data:
    label = l.split("-")[0]
    pos = l.split("-")[1].split("b")[-1]
    print(pos)
    pos = int(pos)-1

    aux = variables_dict_1.get(label,[0]*3) #change * 13 in your data
    aux[pos] = v1
    variables_dict_1[label] = aux

    aux = variables_dict_2.get(label, [0] * 3)  #change * 13 in your data
    aux[pos] = v2
    variables_dict_2[label] = aux

colors = [("red","salmon"),("blue","steelblue"),("orange","goldenrod")]
print(variables_dict_1.keys())
print(variables_dict_1)

for i,l in enumerate(variables_dict_1.keys()):
    plt.plot(range(len(variables_dict_1[l])), variables_dict_1[l],linestyle='--', marker='o', color=colors[i][0])
    plt.plot(range(len(variables_dict_1[l])), variables_dict_2[l], linestyle='--', marker='o', color=colors[i][1])
#plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

enter image description here

2 голосов
/ 08 марта 2020

Вы можете использовать пакет pandas, а затем построить график с помощью matplotlib следующим образом:

import pandas as pd
import matplotlib.pyplot as plt
data=[["january-b1",0.25,0.33],["february-b1",0.254,0.9],["august-b1",0.1,0.13],["january-b2",0.25,0.33],["february-b2",0.254,0.9],["august-b3",0.1,0.13]]
df = pd.DataFrame(data, columns=["Month-band","first value","second value"])
df.set_index(["Month-band"],inplace=True,drop=True)
df.plot()
plt.show()

Это приведет к следующему графику: enter image description here

Python версии

Выше код был протестирован под Python 3.7.6 и Pandas 0.24.2. После комментария OP я протестировал с Python 2.7.16 и Pandas 0.23.4 и xticklabels, где они не заполнены, как ожидалось.

В Python 2.7 кажется, что вы должны заменить строку (которая просто сохраняет график в переменной) и добавить новую строку, устанавливающую xticklabels:

ax = df.plot()
ax.set_xticklabels(df.index)

Печать только одного столбца

Если вы хотите построить только одно из значений, вы можете сделать следующее:

df["first value"].plot()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...