Невозможно построить Pandas groupby данные точечной диаграммы и линейных графиков

Я пытаюсь построить серию сгруппированных по таблице 1 в виде точечной диаграммы с кадрами данных, сгруппированными по таблице 2, в виде линейных графиков, в которых все они представлены на одной диаграмме. Мне не удалось совместить их. Тем не менее, я заметил, что атрибут Table2 «Days» не отображал все свои значения целиком, поэтому у меня есть график вертикальной линии для представления линейных диаграмм, как показано ниже:

ДИАГРАММА 1: это

Я смотрю на график, чтобы быть что-то вроде этого:

ДИАГРАММА 2:

введите описание изображения здесьКое-что из того, что я пытался сделать, было распаковать и установить новый индекс, но все равно безуспешно. Любые советы или помощь в этом будут оценены. Спасибо.

Код:

grouped = df.groupby('id')
fig,ax = plt.subplots(1,1,figsize=(8,6))    
for k,grp in grouped:
    grp.set_index('Days', inplace=True)
    ax = grp.plot.scatter(x='Days', y='Values',color="black")
    grp.plot(y=["curve1","curve2","curve3"], ax=ax, title="One \ 
    scatter and 3 line plots",alpha=0.5)
    ax.set_xlabel("Days", fontsize=15)
    ax.set_ylabel("Values", fontsize=15)
    fig.tight_layout()
    plt.autoscale(enable=True, axis='y')
plt.show()
plt.close()

ТАБЛИЦА 1:

     id     Days    Values
0   101     17.0    3.764706
1   101     24.0    4.000000
2   101     38.0    1.142857
3   101     51.0    0.461538
12  102     31.0    4.258065
13  102     61.0    4.166667
14  102     92.0    4.709677
15  102     123.0   3.516129
16  102     153.0   3.233333
17  102     171.0   10.277778
18  102     202.0   3.193548
19  102     217.0   6.400000
20  102     235.0   1.000000
21  102     246.0   13.545455
22  102     270.0   0.791667
23  102     288.0   5.333333
24  103     31.0    3.096774
25  103     61.0    3.166667
26  103     92.0    3.354839
28  103     103.0   3.636364
29  103     114.0   2.727273
32  103     145.0   6.870968
33  103     175.0   4.200000
34  103     190.0   1.266667
35  103     210.0   4.550000
36  104     31.0    11.677419
37  104     61.0    12.066667
38  104     92.0    11.935484
39  104     123.0   12.354839
40  104     125.0   246.000000
... ... ... ...
455873  125     259.0   4.612903
455874  125     281.0   5.727273
455875  125     309.0   9.750000
455876  125     340.0   5.935484
455877  126     31.0    2.935484
455878  126     61.0    1.800000
455879  126     92.0    3.709677
455880  126     122.0   1.500000
455881  126     153.0   5.645161
455882  126     184.0   2.903226
455883  126     215.0   2.870968
455884  126     245.0   3.966667
455885  126     273.0   5.607143
455886  126     303.0   3.533333
455887  126     334.0   4.129032
455888  126     365.0   7.064516
455889  127     31.0    0.193548
455890  127     61.0    0.366667
455891  127     92.0    0.258065
455892  127     122.0   0.266667
455893  127     153.0   2.903226
455894  127     183.0   3.366667
455895  127     214.0   1.354839
455896  127     245.0   2.064516
455897  128     276.0   0.548387
455898  128     304.0   0.964286
455899  128     334.0   1.133333
455900  128     365.0   2.000000
455913  129     31.0    4.129032
455914  129     61.0    4.10000

ТАБЛИЦА 2:

    id            curve1         curve2      curve3     Days
0   101         3.762914    3.730533    3.762762    1.000000
1   101         3.762908    3.730441    3.762756    1.003222
2   101         3.762903    3.730350    3.762749    1.006444
3   101         3.762897    3.730258    3.762743    1.009666
12  102         4.255960    4.218177    4.255781    1.038665
13  102         4.255953    4.218074    4.255774    1.041887
14  102         4.255946    4.217972    4.255767    1.045109
15  102         4.255940    4.217870    4.255760    1.048331
16  103         3.095224    3.067467    3.095093    1.051554
17  103         3.095220    3.067393    3.095088    1.054776
18  103         3.095215    3.067319    3.095082    1.057998
19  103         3.095210    3.067245    3.095077    1.061220
20  103         3.095205    3.067171    3.095072    1.064442
21  103         3.095201    3.067097    3.095067    1.067664
22  103         3.095196    3.067024    3.095062    1.070886
23  103         3.095191    3.066950    3.095057    1.074108
24  104         3.095186    3.066876    3.095052    1.077330
25  104         11.671414   11.564402   11.670904   1.080552
26  104         11.671396   11.564125   11.670885   1.083775
28  104         11.671360   11.563572   11.670846   1.090219
29  104         11.671342   11.563296   11.670826   1.093441
32  104         11.671289   11.562468   11.670768   1.103107
33  104         11.671271   11.562193   11.670749   1.106329
34  104         11.671253   11.561918   11.670729   1.109551
35  104         11.671235   11.561644   11.670710   1.112773
36  105         11.671217   11.561369   11.670691   1.115996
37  105          3.901147   3.864344    3.900970    1.119218
38  105          3.901141   3.864252    3.900964    1.122440
39  105          3.901135   3.864161    3.900957    1.125662
40  105          3.901129   3.864070    3.900951    1.128884
... ... ... ... ... ...
455873  126     25.476410   43.694862   29.152562   1469.867894
455874  126     25.476371   43.694860   29.152534   1469.871116
455875  126     31.540981   54.096432   36.092270   1469.874338
455876  126     31.540932   54.096429   36.092236   1469.877560
455877  127     31.540884   54.096426   36.092202   1469.880782
455878  127     31.540835   54.096423   36.092168   1469.884004
455879  127     31.540787   54.096420   36.092134   1469.887227
455880  127     470.699660  807.310367  538.622101  1469.890449
455881  127     470.698938  807.310323  538.621591  1469.893671
455882  127     470.698216  807.310280  538.621081  1469.896893
455883  127     470.697494  807.310236  538.620572  1469.900115
455884  127     470.696772  807.310192  538.620062  1469.903337
455885  127     32.606000   55.923891   37.311189   1469.906559
455886  127     32.605950   55.923888   37.311153   1469.909781
455887  127     32.605900   55.923885   37.311118   1469.913003
455888  127     32.605850   55.923882   37.311083   1469.916225
455889  128     32.605800   55.923879   37.311047   1469.919448
455890  128     35.066803   60.144961   40.127214   1469.922670
455891  128     35.066749   60.144958   40.127176   1469.925892
455892  128     35.066696   60.144954   40.127138   1469.929114
455893  128     35.066642   60.144951   40.127100   1469.932336
455894  128     35.066588   60.144948   40.127062   1469.935558
455895  128     64.137502   110.006494  73.393256   1469.938780
455896  128     64.137403   110.006488  73.393186   1469.942002
455897  128     64.137305   110.006482  73.393117   1469.945224
455898  128     64.137207   110.006476  73.393047   1469.948446
455899  128     64.137108   110.006470  73.392978   1469.951669
455900  128     10.082793   17.293797   11.537886   1469.954891
455913  129     36.850407   63.206268   42.168777   1469.996778
455914  129     36.850351   63.206264   42.168737   1470.000000

person dlvr    schedule 04.10.2017    source источник


Ответы (1)


Итак, похоже, что вы получаете графики только для 1 значения идентификатора из цикла for. В цикле for вы создаете новое изображение, а затем наносите данные из этого значения идентификатора на эту фигуру, а затем показываете его в конце цикла. Когда вы повторяете этот цикл, эта цифра в основном перезаписывается. Вы можете решить свою проблему, переместив объявление фигуры над циклом for, а затем переместив plt.show() ниже вашего цикла, чтобы все данные были помещены на 1 фигуру и отображались после завершения цикла.

Изменить

Я сделал несколько случайных данных и построил их, используя большую часть вашего кода, и это работает. Когда вы включаете объявление фигуры внутри цикла, создается большое количество изображений. Вы также можете столкнуться с проблемами из-за того, что вы назвали, а затем переименовали «топор», что может увеличить количество ваших графиков. Также нет причин включать plt.close(), если вы используете plt.show().

import numpy as np
from matplotlib import pyplot as plt

x= np.arange(0,10,1)
y = x**2-3*x


fig,ax = plt.subplots(1,1,figsize=(8,6))    
for f in np.arange(0,10,1):
    ax.plot(x,y+f)
    ax.set_xlabel("Days", fontsize=15)
    ax.set_ylabel("Values", fontsize=15)
    fig.tight_layout()
    plt.autoscale(enable=True, axis='y')    

plt.show()

введите здесь описание изображения

person BenT    schedule 04.10.2017
comment
Спасибо за совет. Если я вас понял, вот как вы хотели, чтобы я реконструировал это: ........ fig,ax = plt.subplots(1,1,figsize=(8,6)) для k,grp в grouped: .......... plt.show() plt.close() Однако, когда я пытаюсь сделать это вышеописанным способом, я получаю следующую ошибку: RuntimeWarning: Было открыто более 20 рисунков. Рисунки, созданные с помощью интерфейса pyplot (matplotlib.pyplot.figure), сохраняются до явного закрытия и могут занимать слишком много памяти, а ядро ​​моего ноутбука выключается. Что я делаю не так? - person dlvr; 04.10.2017
comment
Попробуйте обновить свой первоначальный вопрос, трудно увидеть, что вы изменили в комментарии. Вы зацикливаетесь на этом разделе своего кода? - person BenT; 05.10.2017
comment
Попробуйте перезапустить ядро ​​​​python, эти графики могут быть все еще там с момента последнего запуска вашего кода. Другая проблема может возникнуть из-за переименования вашей оси графика после того, как вы уже определили ось как график. - person BenT; 05.10.2017
comment
Я перезапустил ядро ​​​​python, но все еще имею ту же ошибку. - person dlvr; 05.10.2017
comment
Вы пытались переименовать свой топор = grp.plot.scatter(x='Days', y='Values',color=black) - person BenT; 05.10.2017
comment
Нет, я этого не делал. Можете ли вы воссоздать свой ответ, используя подход сгруппированных данных pandas, а также построить комбинацию одного разброса и трехлинейных графиков, таких как образец второй диаграммы, которую я недавно добавил выше - person dlvr; 05.10.2017
comment
Если вам нужен только точечный график с дополнительными линиями из кривых, то почему вы используете цикл for....? Вы не правильно рисуете подмножества индекса? - person BenT; 05.10.2017
comment
Я рисую подмножества индекса. Итак, перебирая фрейм данных для построения одного графика рассеяния и трех линейных графиков на индекс (id) - person dlvr; 05.10.2017
comment
Так что это будет зависеть от того, сколько очков у вас есть в каждом идентификаторе. В этом случае в вашем первом примере ваш данный идентификатор имеет только несколько точек рядом с одним и тем же значением Days на кривых DF и соответствует почти вертикальной линии, тогда как в другом фрейме данных он более разбросан. Если вы хотите получить полную кривую на втором графике, а затем построить подмножества, определенные идентификатором, на точечной диаграмме, вам нужно сначала построить кривые за пределами цикла for, а затем выполнить точечные диаграммы по мере того, как вы прокручиваете идентификаторы. - person BenT; 05.10.2017