【问题标题】:How to create subplots with the correct data from a dataframe如何使用数据框中的正确数据创建子图
【发布时间】:2021-11-18 10:29:59
【问题描述】:

我想实现这段代码,涉及到一些数据的可视化。

特别是,我必须生成 10 个与下面的代码具有相同结构的图。它们之间的唯一区别是 x 的范围。

在情节 n.1 中,x 将位于 range(0, 100, 10) ---> 10 个子情节中,0 一直到 9。

在情节 n.2 中,x 将位于 range(100, 200, 10) ---> 其中 100 到 109 的 10 个子情节。

在情节 n.3 中,x 将位于 range(200, 300, 10) ---> 其中 200 到 209 的 10 个子情节。

以此类推,直到: 情节 n.10 x 将位于 range(900, 1000, 10) ---> 其中 900 到 909 为止,对于 10 个子情节。

fig, ((ax1,ax2, ax3, ax4, ax5), (ax6,ax7, ax8, ax9, ax10)) = plt.subplots(2,5, figsize =(40,20))
axs = [ax1,ax2, ax3, ax4, ax5, ax6,ax7, ax8, ax9, ax10]
for ax in axs:
    ax.grid()
    ax.set_xlabel('Time [s]', fontsize = 22)
    ax.set_ylabel('$C_{vv}(t)$', fontsize = 22)
ax1.title.set_text('$l_0 = 6.00$ $\mu$m')
ax2.title.set_text('$l_0 = 8.67$ $\mu$m')
ax3.title.set_text('$l_0 = 11.33$ $\mu$m')
ax4.title.set_text('$l_0 = 14.00$ $\mu$m')
ax5.title.set_text('$l_0 = 16.67$ $\mu$m')
ax6.title.set_text('$l_0 = 19.33$ $\mu$m')
ax7.title.set_text('$l_0 = 22.00$ $\mu$m')
ax8.title.set_text('$l_0 = 24.67$ $\mu$m')
ax9.title.set_text('$l_0 = 27.33$ $\mu$m')
ax10.title.set_text('$l_0 = 30.00$ $\mu$m')
fig.suptitle('$\lambda = 0.23 $', fontsize = 30)


for x in range(100, 200, 10):
    ax1.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)

for x in range(101, 200, 10):
    ax2.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)

for x in range(102, 200, 10):
    ax3.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)
    
for x in range(103, 200, 10):
    ax4.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)
    
for x in range(104, 200, 10):
    ax5.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)

for x in range(105, 200, 10):
    ax6.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)

for x in range(106, 200, 10):
    ax7.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)

for x in range(107, 200, 10):
    ax8.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)
    
for x in range(108, 200, 10):
    ax9.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=0.5)
    
for x in range(109, 200, 10):
    ax10.plot(VACF[x][:1000,0], VACF[x][:1000,1], alpha=1)    

plt.show()

如何实现并使代码更短一些? 谢谢你的帮助

【问题讨论】:

  • 希望答案是有帮助的。彻底回答问题很费时间。如果您的问题已解决,请接受解决方案 位于答案左上角的 ▲/▼ 箭头下方。如果出现更好的解决方案,则可以接受新的解决方案。如果您的声望超过 15,您还可以使用 ▲/▼ 箭头对答案的有用性进行投票。 如果解决方案无法回答问题,请发表评论。 What should I do when someone answers my question?。谢谢。

标签: python pandas matplotlib subplot


【解决方案1】:
  • .ravel() 展平axes,如answer 所示。
  • 使用zip 组合每个axes 的所有值,并用for-loop 解压它们
  • range(100, 110) 表示每个绘图循环中x 的初始值。
    • range(0, 100, 10) 从 0 到 90,步长为 10
    • range(0, 10, 1) 从 0 到 9,步长为 1
fig, axes = plt.subplots(2,5, figsize =(40,20))
axes = axes.ravel()

title_txt = [6.00, 8.67, 11.33, 14.00, 16.67, 19.33, 22.00, 24.67, 27.33, 30.00]

for ax, xi, txt in zip(axes, range(100, 110), title_txt):
    for x in range(xi, 200, 10):
        ax.plot(VACF[x][:1000, 0], VACF[x][:1000, 1], alpha=0.5)
    ax.grid()
    ax.set_xlabel('Time [s]', fontsize = 22)
    ax.set_ylabel('$C_{vv}(t)$', fontsize = 22)
    ax.title.set_text(f'$l_0 = {txt}$ $\mu$m')
    
fig.suptitle('$\lambda = 0.23 $', fontsize = 30)

  • OP 顶部文本中描述的模式可以实现如下:
for base in range(0, 1000, 100):
    for x in range(base+0, base+10, 1):

# resulting range for each loop
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
[200, 201, 202, 203, 204, 205, 206, 207, 208, 209]
[300, 301, 302, 303, 304, 305, 306, 307, 308, 309]
[400, 401, 402, 403, 404, 405, 406, 407, 408, 409]
[500, 501, 502, 503, 504, 505, 506, 507, 508, 509]
[600, 601, 602, 603, 604, 605, 606, 607, 608, 609]
[700, 701, 702, 703, 704, 705, 706, 707, 708, 709]
[800, 801, 802, 803, 804, 805, 806, 807, 808, 809]
[900, 901, 902, 903, 904, 905, 906, 907, 908, 909]
  • 代入剧情循环
for ax, xi, txt in zip(axes, range(0, 1000, 100), title_txt):
    for x in range(xi+0, xi+10, 1):
        ax.plot(VACF[x][:1000, 0], VACF[x][:1000, 1], alpha=0.5)
    ax.grid()
    ax.set_xlabel('Time [s]', fontsize = 22)
    ax.set_ylabel('$C_{vv}(t)$', fontsize = 22)
    ax.title.set_text(f'$l_0 = {txt}$ $\mu$m')
    
fig.suptitle('$\lambda = 0.23 $', fontsize = 30)
  • 在此示例中,在每个子图中绘制了具有不同频率的同一组正弦波

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 2021-11-09
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多