Построение двух участков.Одна с двумя сериями (и двумя шкалами), другая с двумя сериями на одинаковых шкалах - PullRequest
0 голосов
/ 15 мая 2019

Я строю некоторые данные.Один участок ниже другого.Верхний график имеет две серии с общей осью X, но с разными масштабами на оси Y.Нижний график имеет две серии с одинаковыми шкалами осей x и y.

Вот изображение, когда я хочу произвести:

enter image description here

Верхний график - это мой внешний вид.Я, однако, изо всех сил пытаюсь получить данные для построения на моем втором графике.Мой код выглядит следующим образом:

fig, axs = plt.subplots(2, 1, figsize=(11.69, 8.27))

color1 = 'red'
color2 = 'blue'
axs[0].set_title("Energy of an Alpha Particle Against Distance Through a {} Target".format(Sy_t), fontsize=15)
axs[0].set_ylabel("Alpha Energy (MeV)", fontsize=10, color=color1)
axs[0].set_xlabel("Distance travelled through target (cm)", fontsize=10)
axs[0].tick_params(axis='y', colors=color1)
axs[0].grid(lw=0.2)
axs[0].plot(dc['sum'], dc.index, marker='+', lw=0.2, color=color1)
axs[1] = axs[0].twinx()

#ax2.set_title("Stopping Power Against Distance through a {} Target".format(Sy_t), fontsize=15)
axs[1].set_ylabel("dE/dx (MeV/cm)", fontsize=10, color=color2)
axs[1].set_xlabel("Distance travelled through target (cm)", fontsize=10)
axs[1].plot(dc['sum'], dc['dydsum'], marker='+', lw=0.2, color=color2)
axs[1].tick_params(axis='y', colors=color2)
axs[1].grid(lw=0.2)
fig.tight_layout()

axs[2].set_title('Cross-Section Plots overall and for the product')
axs[2].set_ylabel('Cross-Section (mb)')
axs[2].set_xlabel('Energy (MeV)')
axs[2].plot(Sig_sum)
axs[2].plot(Sig_prod)
plt.show()

Я получаю ошибку:

IndexError: index 2 is out of bounds for axis 0 with size 2 

Данные для верхнего графика взяты из кадра данных.Две серии внизу имеют одинаковую шкалу x и y с одним из приведенных ниже дат:

1        0.001591
2        0.773360
3       28.536766
4      150.651937
5      329.797010
6      492.450824
7      608.765402
8      697.143340
9      772.593010
10     842.011451
11     900.617395
12     947.129704
13     984.270901
14    1015.312625
15    1041.436808
16    1062.700328
17    1079.105564
18    1091.244022
19    1100.138834
20    1107.206041
21    1113.259507
22    1118.579315
23    1123.164236
24    1127.014592
25    1129.558439
26    1130.390331
27    1129.917985
28    1128.069117
29    1125.184650
30    1121.497063
31    1117.341899
32    1112.556194
33    1108.158215
34    1103.083775
35    1097.872010
36    1092.889581
37    1087.439353
38    1081.922461
39    1076.163363
40    1070.421916

Когда я пытаюсь построить нижний график самостоятельно, он графически выглядит следующим образом: enter image description here

1 Ответ

1 голос
/ 15 мая 2019

Вы, вероятно, выиграете от некоторого разрушения того, что происходит. В начале вы звоните

fig, axs = plt.subplots(2, 1)

, который разбивает фигуру на два вспомогательных участка (оси . Классы оси , технически). axs - это массив, содержащий объекты двух осей.

Позже вы делаете

axs[1] = axs[0].twinx()

, который делает две вещи: он создает третий объект axes.Axes (сверху верхнего подпункта) и изменяет значение axs[1], чтобы ссылаться на этот объект вместо нижнего подпункта. Тогда у вас не будет (простого) способа получить доступ к нижнему субплоту (и попытка получить доступ к внеплановому индексу, равному axs, приводит к немедленной ошибке).

Возможное исправление:

fig, axs = plt.subplots(2, 1, ...)
topleftax = axs[0]
toprightax = axs[0].twinx()
bottomax = axs[1]
# and replace in the code that comes thereafter:
# axs[0] -> topleftax
# axs[1] -> toprightax
# axs[2] -> bottomax
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...