此问题已在此处有答案:
Delete a subplot(3个答案)
9天前关闭
我试图创建一个绘图函数,它将所需绘图的数量作为输入,并使用pylab.subplots
和sharex=True
选项绘制它们。如果所需的图的数量是奇数,那么我想删除最后一个面板,并在其正上方的面板上强制标记。我找不到一种方法来做到这一点,并同时使用sharex=True
选项。子图的数量可以相当大(>20)。
下面是示例代码。在这个例子中,当i=3
时,我想强制xtick标签。
import numpy as np
import matplotlib.pylab as plt
def main():
n = 5
nx = 100
x = np.arange(nx)
if n % 2 == 0:
f, axs = plt.subplots(n/2, 2, sharex=True)
else:
f, axs = plt.subplots(n/2+1, 2, sharex=True)
for i in range(n):
y = np.random.rand(nx)
if i % 2 == 0:
axs[i/2, 0].plot(x, y, '-', label='plot '+str(i+1))
axs[i/2, 0].legend()
else:
axs[i/2, 1].plot(x, y, '-', label='plot '+str(i+1))
axs[i/2, 1].legend()
if n % 2 != 0:
f.delaxes(axs[i/2, 1])
f.show()
if __name__ == "__main__":
main()
5条答案
按热度按时间gev0vcfq1#
简单地说,你让你的子图调用一个偶数(在这个例子中是6个图):
然后删除不需要的:
这个问题和回答是以一种自动化的方式来看待这个问题的,但是我认为在这里发布基本的用例是值得的。
fcipmucu2#
如果你把
main
函数中的最后一个if
替换为:它应该可以做到:
qvk1mo1f3#
我总是生成任意数量的子图(有时数据导致3个子图,有时13个,等等)。我写了一个小实用函数来停止思考它。
我定义的两个函数如下。您可以更改样式选择以符合您的首选项。
下面是13个子图的示例用法:
其产生以下内容:
或者,切换到按列遍历顺序(
generate_subplots(..., row_wise=False)
)生成:eulz3vhy4#
您不必进行计算以检测需要删除的子图,而是可以检入没有打印任何内容的子图。您可以查看this answer以获得各种方法来检查是否在轴上绘制了某些内容。使用函数
ax.has_Data()
,你可以这样简化你的函数:您还可以使用
n
参数指定所需的图像数量,以及使用max_width
参数指定每行所需的图像数量。dgtucam15#
对于Python 3,你可以删除如下: