#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()
Проблема в том, что я не уверен, каков диапазон значений суммы. Если простое деление не соответствует вашему случаю, вы можете попытаться сначала объединить все значения, а затем скорректировать диапазон.