Толщина линии на графике pyplot на основе столбца фрейма данных

#python #dataframe #matplotlib

Вопрос:

Во-первых, фрейм данных:

Дата categorie 12МКГ сумма
202001 cat1 0.8947368 38.0
202002 cat1 0.8695652 46.0
202003 cat1 0.8913044 46.0
202004 cat1 0.88372093 43.0
202005 cat1 0.8913044 46.0
202006 cat1 0.8888889 45.0
202007 cat1 0.8780488 41.0
202008 cat1 0.925 40.0
202009 cat1 0.8684211 38.0
202010 cat1 0.76744187 43.0
202011 cat1 0.7111111 45.0
202012 cat1 0.6888889 45.0
202101 cat1 0.7083333 48.0
202102 cat1 0.73333335 45.0
202103 cat1 0.74 50.0
202104 cat1 0.71428573 56.0
202105 cat1 0.7241379 58.0
202106 cat1 0.7258065 62.0
202107 cat1 0.71875 64.0
202001 cat2 0.6244344 221.0
202002 cat2 0.6136364 220.0
202003 cat2 0.61085975 221.0
202004 cat2 0.6028708 209.0
202005 cat2 0.63013697 219.0
202006 cat2 0.6034483 232.0
202007 cat2 0.5914894 235.0
202008 cat2 0.59322035 236.0
202009 cat2 0.6008584 233.0
202010 cat2 0.5903614 249.0
202011 cat2 0.5836735 245.0
202012 cat2 0.57377046 244.0
202101 cat2 0.5795918 245.0
202102 cat2 0.56666666 270.0
202103 cat2 0.557971 276.0
202104 cat2 0.548951 286.0
202105 cat2 0.5270758 277.0
202106 cat2 0.53985506 276.0
202107 cat2 0.53488374 258.0
202001 cat3 0.426 500.0
202002 cat3 0.40963855 498.0
202003 cat3 0.40365112 493.0
202004 cat3 0.41129032 496.0
202005 cat3 0.4144869 497.0
202006 cat3 0.4 500.0
202007 cat3 0.39478958 499.0
202008 cat3 0.4137255 510.0
202009 cat3 0.4035433 508.0

И я хочу создать линейный график. Мне нужна одна строка для каждой категории, и по оси x мне нужна дата, а по оси y-12МКГ. Я также хочу, чтобы каждая строка имела другой цвет, что мне до сих пор удавалось (при поддержке @Петра Новаковского).

 import matplotlib.pylab as pl
import matplotlib.pyplot as plt

labels = set(df['categorie'].values)
colors = pl.cm.jet(np.linspace(0,1,len(labels)))
for key, color in zip(labels, range(len(labels))):
    data_x = df.loc[df['categorie']==key]['date']
    data_y = df.loc[df['categorie']==key]['12MKG']
    plt.plot(data_x, data_y, color=colors[color], label=key)
plt.legend()
plt.show()
 

Теперь я хочу, чтобы линии на графике имели разную толщину, где толщина увеличивается с увеличением столбца «Сумма». Толщина строки может варьироваться либо в зависимости от суммы для каждой даты, либо в зависимости от толщины строки на основе последнего значения суммы, в данном случае на основе даты == 202107.

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

1. Re «фрейм данных»: Подразумевает ли это Pandas ( DataFrame )?

2. @PeterMortensen В данном случае это был фрейм данных pandas, но об этом раньше не упоминалось, потому что я был готов изменить свой фрейм данных на фрейм данных pyspark, если кто-то предпочтет, чтобы решение работало таким образом.

Ответ №1:

Я придумал что-то вроде этого:

 import matplotlib.pylab as pl
import matplotlib.pyplot as plt

labels = set(df['categorie'].values)
colors = pl.cm.jet(np.linspace(0,1,len(labels)))
width_lines = df.amount.values
for key, color, width in zip(labels, range(len(labels)), width_lines):
    data_x = df.loc[df['categorie']==key]['date']
    data_y = df.loc[df['categorie']==key]['12MKG']
    width = df.loc[df['categorie']==key]['amount']
    width = sum(width)
    plt.plot(data_x, data_y, color=colors[color], label=key, linewidth=width/100)
plt.legend()
plt.show()
 

Проблема в том, что я не уверен, каков диапазон значений суммы. Если простое деление не соответствует вашему случаю, вы можете попытаться сначала объединить все значения, а затем скорректировать диапазон.