我正在绘制一些数据。一个地块比另一个地块低。顶部的图有两个共享x轴的系列,但在y轴上的比例不同。底部图有两个系列,它们的x和y轴比例相同。
以下是我希望制作的图像:
最上面的图是我希望它看起来的样子。但是,我正在努力获取要在第二张图上绘制的数据。我的代码如下:
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
答案 0 :(得分:1)
您可能会从发生的事情分解中受益。一开始,您致电
fig, axs = plt.subplots(2, 1)
将图形分为两个子图(从技术上讲,axes.Axes类)。 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