python - 如何用一定数量的子图填充图形?
问题描述
各位程序员好!
我正在尝试编写创建 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
我如何计算正确的数量nrows
和ncols
描述subplots
? 如果需要,我希望figure
能够描绘 149 subplots
。
有没有更好的方法来做到这一点?
先感谢您。
解决方案
尝试替换这个:
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
)它将删除最后一个子图:
因此,您可以管理所有案例。
推荐阅读
- spring-boot - SpringBoot CBC ciphersuite 和 logjam 漏洞
- r - 如何为另一个变量的唯一值创建索引变量?
- c# - 为 MTOM 消息 MIME 部分创建阅读器时出错,找不到 Content-ID '<858d8f9f-b101-46c3-bf84-d2b934ad1271>'
- tensorflow - 糟糕的文本生成结果,而很好的预测结果
- arrays - 如何将序列转换为数组?
- rxjs - 如何基于一个外部 observable 将多个 observable 组合在一起?
- jupyter-notebook - 如何检测是在 Jupyter Notebook 还是 Lab
- python - 在多列上合并两个熊猫数据框
- java - 在方法中将多个字符串作为参数时如何选择字符串极端情况?
- javascript - 有没有办法在我的 c# 程序中捕获 cefsharp 中的 javascript 引发的错误?