首页 > 解决方案 > 如何用一定数量的子图填充图形?

问题描述

各位程序员好!

我正在尝试编写创建 amatplotlib.pyplot.figure并用subplots. 唯一的输入应该是数量subplots。在这种情况下,每个白框代表一个subplot

以下示例适用于subplot可被 100 整除的数字:

import matplotlib.pyplot as plt

subplots = 200
cols = int(round(subplots/10))
rows = int(round(subplots/20))

print(f'subplots: {cols*rows}')

fig, axes = plt.subplots(nrows=rows, ncols=cols)
_axes = []
for ax_array in axes:
    for ax in ax_array:
        _axes.append(ax)

for ax in _axes:
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.tick_params(axis='both', which='both', length=0)
    ax.plot()

plt.tight_layout()
plt.subplots_adjust(wspace=0, hspace=0)
plt.show()

输出:

subplots: 200

在此处输入图像描述

这个数字用 200 个子图正确描绘。

但是当我进行更改时subplots = 150,子图的数量被计算和描述错误:

subplots: 120

在此处输入图像描述

我如何计算正确的数量nrowsncols描述subplots? 如果需要,我希望figure能够描绘 149 subplots

有没有更好的方法来做到这一点?

先感谢您。

标签: pythonmatplotlib

解决方案


尝试替换这个:

rows = int(round(subplots/20))

有了这个:

rows = int(round(subplots/cols))

这将修复计算的子图数量。


由于plt.subplots()定义了子图的矩形网格,它们的总数不应该是素数,因为它必须能被列数和行数整除。如果您输入一个素数作为subplots,您的代码将找到最近的非素数。例如,如果您输入:

subplots = 149

您的代码将为您提供150子图,因为它不存在作为产品cols * rows提供的组合。149

为了管理这个,使用这个代码:

import matplotlib.pyplot as plt

subplots = 149
cols = int(round(subplots/10))
rows = int(round(subplots/cols))

print(f'subplots: {cols*rows}')

if subplots > cols * rows:
    fig, axes = plt.subplots(nrows = rows + 1, ncols = cols)
else:
    fig, axes = plt.subplots(nrows = rows, ncols = cols)

_axes = []
for ax_array in axes:
    for ax in ax_array:
        _axes.append(ax)

for ax in _axes:
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.tick_params(axis='both', which='both', length=0)
    ax.plot()

if subplots > cols * rows:
    for idx in range(1, cols):
        fig.delaxes(axes[rows, idx])
elif subplots < cols * rows:
    fig.delaxes(axes[rows - 1, cols - 1])

plt.tight_layout()
plt.subplots_adjust(wspace=0, hspace=0)
plt.show()
  • 在这种情况下subplots > rows * cols(例如subplots = 31)它将在底部添加一个子图:

在此处输入图像描述

  • 在这种情况下subplots < rows * cols(例如subplots = 23)它将删除最后一个子图:

在此处输入图像描述

因此,您可以管理所有案例。


推荐阅读