【问题标题】:Is there a way to achieve this subplot look writing less?有没有办法让这个子情节看起来写得更少?
【发布时间】:2021-07-04 06:01:34
【问题描述】:

我正在尝试学习一些 python,并尝试绘制一些数据。当然,我能够做到,但是为了实现我想要的外观,我添加了太多代码。而且我想有一种更简单的方法。

我想做的是

  1. 为所有子图设置相同的 x 轴限制
  2. 删除绘图框,只保留 x 轴

为了实现这一点,我必须写下所有这些

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,10))
axes[0, 0].plot(data1['Hz'], data1['int_n'])
axes[0, 1].plot(data2['Hz'], data2['int_n'])
axes[1, 0].plot(data3['Hz'], data3['int_n'])
axes[1, 1].plot(data4['Hz'], data4['int_n'])
axes[0, 0].set_xlim(100, 20)
axes[0, 1].set_xlim(100, 20)
axes[1, 0].set_xlim(100, 20)
axes[1, 1].set_xlim(100, 20)
axes[0, 0].set_title('Sample 1')
axes[0, 1].set_title('Sample 2')
axes[1, 0].set_xlabel('Hz')
axes[1, 1].set_xlabel('Hz')
axes[0, 0].set_ylabel('Experiment 1')
axes[1, 0].set_ylabel('Experiment 2')
axes[0, 0].get_yaxis().set_ticks([])
axes[0, 1].get_yaxis().set_ticks([])
axes[1, 0].get_yaxis().set_ticks([])
axes[1, 1].get_yaxis().set_ticks([])
axes[0, 0].spines['right'].set_visible(False)
axes[0, 0].spines['top'].set_visible(False)
axes[0, 0].spines['left'].set_visible(False)
axes[0, 1].spines['right'].set_visible(False)
axes[0, 1].spines['top'].set_visible(False)
axes[0, 1].spines['left'].set_visible(False)
axes[1, 0].spines['right'].set_visible(False)
axes[1, 0].spines['top'].set_visible(False)
axes[1, 0].spines['left'].set_visible(False)
axes[1, 1].spines['right'].set_visible(False)
axes[1, 1].spines['top'].set_visible(False)
axes[1, 1].spines['left'].set_visible(False)
fig.tight_layout()

我想有一个简单的方法可以用更少的文字来做,但我不知道该怎么做

【问题讨论】:

  • 你可以使用循环让它更短一点,但不会更短,你的代码很好。
  • 对循环不太满意,但我会研究一下。感谢您添加由于低代表我无法做到的图像。

标签: python matplotlib subplot


【解决方案1】:

您可以在 axes 的扁平化实例上使用 for 循环。为了让事情变得更简单,您还可以使用 zip 并同时迭代您的 data 实例。例如:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,10))

for ax, data in zip(axes.flat, (data1, data2, data3, data4)):

    # Do these to all axes instances
    ax.plot(data['Hz'], data['int_n'])    
    ax.set_xlim(100, 20)
    ax.get_yaxis().set_ticks([])

    # loop over the spines we want to turn off
    for spine in ['right', 'top', 'left']:
        ax.spines[spine].set_visible(False)

# These things only apply to one or two axes, so are outside the loop
axes[0, 0].set_title('Sample 1')
axes[0, 1].set_title('Sample 2')
axes[1, 0].set_xlabel('Hz')
axes[1, 1].set_xlabel('Hz')
axes[0, 0].set_ylabel('Experiment 1')
axes[1, 0].set_ylabel('Experiment 2')

fig.tight_layout()

【讨论】:

  • 这看起来更简单一些。谢谢
  • [ax.spines[p].set_visible(False) for p in ['right', 'top', 'left']] 这样会更短。
  • @r-beginners,确实,但在某些时候,你开始从更简洁转向不那么可读。
猜你喜欢
  • 2022-09-30
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多