如何在 matplotlib 中制作空白子图?

Posted

技术标签:

【中文标题】如何在 matplotlib 中制作空白子图?【英文标题】:How can I make a blank subplot in matplotlib? 【发布时间】:2012-04-19 14:19:42 【问题描述】:

我正在 matplotlib 中制作一组子图(例如 3 x 2),但我的数据集少于 6 个。如何使剩余的子图为空白?

安排如下:

+----+----+
| 0,0| 0,1|
+----+----+
| 1,0| 1,1|
+----+----+
| 2,0| 2,1|
+----+----+

这可能会持续几页,但在最后一页上,例如有 5 个数据集到 2,1 框将是空的。但是,我已将数字声明为:

cfig,ax = plt.subplots(3,2)

因此,在子图 2,1 的空间中,有一组带有刻度和标签的默认轴。如何以编程方式将该空间渲染为空白且没有轴?

【问题讨论】:

【参考方案1】:

您总是可以隐藏不需要的轴。例如,以下代码完全关闭第 6 个轴:

import matplotlib.pyplot as plt

hf, ha = plt.subplots(3,2)
ha[-1, -1].axis('off')

plt.show()

结果如下图:

或者,请参阅问题 Hiding axis text in matplotlib plots 的已接受答案,以了解保留轴但隐藏所有轴装饰(例如刻度线和标签)的方法。

【讨论】:

谢谢 - 这实际上更接近我原来的问题。我已经接受了另一个答案并调整了我的代码以使用它,但这两种方法都很棒。 酷,这确实很好,因为add_subplot() 的混乱更少了。 这太棒了! 这确实没有显示任何情节,可以说这是一个空白情节。我正在寻找一个没有数据的图,以明确表明没有数据。对这个答案有任何简单的修改吗? @Zelphir 我不确定你在追求什么:其他五个图是没有数据的空图,所以我不确定你要求什么额外的。另外,这是一个新问题。将来,请将此作为一个新问题提出,而不是对旧答案发表评论。【参考方案2】:

自从第一次提出这个问题以来,matplotlib 中添加了一个 much 改进的subplot interface。在这里,您可以准确地创建您需要的子图,而无需隐藏额外内容。此外,子图可以跨越其他行或列。

import pylab as plt

ax1 = plt.subplot2grid((3,2),(0, 0))
ax2 = plt.subplot2grid((3,2),(0, 1))
ax3 = plt.subplot2grid((3,2),(1, 0))
ax4 = plt.subplot2grid((3,2),(1, 1))
ax5 = plt.subplot2grid((3,2),(2, 0))

plt.show()

【讨论】:

哇 - 这是一个很好的改进。简单多了!谢谢@Hooked! @Hooked,最后一个空格非常适合添加图例。你知道有什么方法可以在那里设置图例吗? @Stefano 肯定有办法做到这一点——但这最好是作为一个新问题提出,你甚至可以在你的问题中链接这个答案(顺便说一句,欢迎来到 ***!)【参考方案3】:

也可以使用 Axes.set_visible() 方法隐藏子图。

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
data = pd.read_csv('sampledata.csv')

for i in range(0,6):
    ax = fig.add_subplot(3,2,i+1)
    ax.plot(range(1,6), data[i])
    if i == 5:
        ax.set_visible(False)

【讨论】:

您的回答对原始 Axes 和扩展 GeoAxes 都很好!【参考方案4】:

是否可以在需要时创建子图?

import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt

plt.figure()
plt.gcf().add_subplot(421)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(422)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(423)
plt.fill([0,0,1,1],[0,1,1,0])
plt.suptitle("Figure Title")
plt.gcf().subplots_adjust(hspace=0.5,wspace=0.5)
plt.savefig("outfig")

【讨论】:

我不这么认为,因为为了简洁起见,我还需要做一些其他格式化的事情,我没有包括在原始问题中。其中之一是 plt.subplots_adjust(wspace=0,hspace=0)。我不确定这会在事后奏效。 @mishaF :您可以使用这种方法进行 subplots_adjust() 。查看我的编辑。【参考方案5】:

要删除位于 (2,1) 的绘图,您可以使用

import matplotlib.pyplot as plt
cfig,ax = plt.subplots(3,2)
cfig.delaxes(ax.flatten()[5])

【讨论】:

以上是关于如何在 matplotlib 中制作空白子图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 matplotlib 为许多子图制作一个图例?

Matplotlib:获取子图以填充图形

如何使用 matplotlib 为所有子图设置默认颜色循环?

单击 matplotlib 中的步骤图子图点时如何使标签出现(或可能是 plotly)?

如何以编程方式在 Matplotlib 中选择特定的子图?

与 matplotlib 子图不一致的刻度标签字体