наиболее эффективный способ создания графика с двумя разными осями y и точками, окрашенными другой переменной - PullRequest
1 голос
/ 19 сентября 2019

У меня есть фрейм данных с 4 столбцами:

  • номер записи
  • текущий
  • емкость
  • имя шага: четыре значения a, b,c, d

Я хотел бы создать диаграмму, используя matplotlib: required chart

Диаграмма:

  • Xось: номер записи
  • ось Y: ток и емкость * маркеры 1023 *
  • : окрашены значением step_name

я пытаюсь этот код, но он генерируетошибка.

fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(12, 8))
df.plot.scatter('record_number', 'current', c ='step_name' ,ax=ax1)
df.plot.scatter('record_number', 'capacity', c ='step_name', ax=ax2)
plt.show()

Существует ли простой способ создать цветовую карту из уникальных значений столбца данных?Вам нужно сделать это с помощью пользовательской функции?Может ли pandas / matplotlib понять это, как это делает Tableau?

Вот пример некоторых данных из фрейма данных.Вы можете скопировать данные и использовать pd.read_clipboard() для создания фрейма данных.Я постараюсь найти другой способ предоставления этой информации.

record_number   current capacity    step_name
16299   13.744  72.042  c
60942   24.33   53.954  c
78204   24.332  9.313   c
37146   24.327  54.379  c
60533   24.331  51.189  c
85517   24.331  58.738  c
48782   -24.325 -51.974 d
84008   24.334  48.54   c
76814   0   0   a
85310   24.329  57.339  c
70417   -24.326 -36.958 d
4822    -24.312 -32.166 b
24782   -24.321 -51.183 d
57664   24.336  31.799  c
43586   -24.33  -16.86  d
61505   24.33   57.759  c
74553   -24.332 -64.909 d
30388   24.329  8.705   c
26213   -24.333 -60.854 d
48086   -24.33  -47.271 d
9344    24.325  25.703  c
51946   -24.33  -73.356 d
40327   11.332  74.809  c
49750   -24.329 -58.516 d
85586   24.331  59.205  c
12217   24.33   45.12   c
58459   24.329  37.172  c
4596    -24.35  -30.639 b
83811   24.327  47.208  c
67173   -24.324 -15.036 d
59496   24.329  44.181  c
71065   -24.329 -41.337 d
9260    24.33   25.135  c
61812   24.327  59.834  c
28831   -5.316  -75.849 d
58634   24.328  38.355  c
13060   24.33   50.818  c
86841   24.328  67.687  c
23905   -24.325 -45.257 d
7888    24.33   15.863  c
61286   24.331  56.279  c
69391   -24.33  -30.025 d
11508   24.326  40.329  c
56630   24.333  24.811  c
31293   24.33   14.821  c
70474   -24.326 -37.343 d
49720   -24.325 -58.313 d
53255   24.33   2.001   c
78431   24.325  10.848  c
49790   -24.32  -58.786 d
21280   -24.323 -27.517 d
70510   -24.331 -37.587 d
56135   24.329  21.465  c
82821   24.329  40.518  c
12037   24.327  43.904  c
60760   24.33   52.724  c
59509   24.328  44.269  c
32294   24.328  21.586  c
22478   -24.324 -35.613 d
38317   24.331  62.293  c
30806   24.331  11.53   c
55349   24.323  16.153  c
21376   -24.326 -28.166 d
17742   -24.327 -3.608  d
39891   21.075  72.892  c
56550   24.325  24.27   c
3110    -24.301 -20.597 b
38899   24.331  66.226  c
4841    -24.354 -32.295 b
47390   -24.329 -42.567 d
23584   -24.335 -43.087 d
10756   24.329  35.246  c
32356   24.328  22.005  c
69773   -24.332 -32.606 d
86246   24.33   63.665  c
29851   24.335  5.075   c
25986   -24.325 -59.32  d
16786   6.566   73.361  c
40008   17.998  73.525  c
50391   -24.326 -62.848 d
28543   -8.234  -75.318 d
36890   24.329  52.649  c
46688   -24.325 -37.823 d
51818   -24.323 -72.491 d
26355   -24.336 -61.813 d
56514   24.329  24.027  c
26702   -24.336 -64.158 d
35480   24.33   43.119  c
13826   24.33   55.995  c
70074   -24.324 -34.64  d
14013   24.329  57.259  c
19769   -24.327 -17.306 d
16964   5.015   73.645  c
76072   -12.77  -74.762 d
65279   -24.331 -2.236  d
6778    24.327  8.361   c
41577   -24.332 -3.283  d
5987    24.326  3.015   c
78560   24.331  11.719  c
11034   24.333  37.125  c

1 Ответ

0 голосов
/ 20 сентября 2019

Если вы хотите использовать только pandas и matplotlib, это должно работать:

#sorting dataframe along record_number column
df = df.sort_values('record_number')

#creating an index group for each separate set of rows with the same set_name 
df['gg'] = (df['step_name'] != df['step_name'].shift()).cumsum()

#associating a color to the step_name
cols = {'a':'b', 'b':'g', 'c':'r', 'd':'c'}

#plotting
fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(12, 8))
for (sn, gidx), sdf in df.groupby(['step_name', 'gg']):
    ax1.plot(sdf['record_number'], sdf['current'], c=cols[sn], label=sn)
    ax2.plot(sdf['record_number'], sdf['capacity'], c=cols[sn], label=sn)

#setting axis labels
plt.xlabel('record_number')
ax1.set_ylabel('current')
ax2.set_ylabel('capacity')

#making the legend, removing repeated entries
handles, labels = ax2.get_legend_handles_labels()
f_h = []
f_l = []
for h, l in zip(handles, labels):
    if l not in f_l:
        f_h.append(h)
        f_l.append(l)
plt.legend(f_h, f_l)

plt.show()

Этот код выдает, используя ваши образцы данных:

enter image description here

pandas Функции построения графика дают хорошие результаты, но не очень настраиваемые.Для создания сложных графиков, как правило, лучше использовать matplotlib функции.

Здесь я создал дополнительную строку df['gg'], чтобы пометить каждую группу последовательных строк одним и тем же 'step_name' с различным индексом, поэтомучто я могу группировать по нему при построении (в противном случае результатом была бы одна линия для каждого цвета).

Кроме того, вам нужно связать цвет для каждой буквы в столбце 'step_name' (я сделал этоопределив col словарь).См. здесь , чтобы узнать форматы, распознаваемые matplotlib для указания цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...