python - 循环遍历 2d 子图,就好像它是 1-D

标签 python matplotlib flatten subplot

我正在尝试使用子图绘制许多数据,我没有遇到麻烦,但我想知道是否有一种方便的方法可以做到这一点。

下面是示例代码。

import numpy as np    
import math 
import matplotlib.pyplot as plt

quantities=["sam_mvir","mvir","rvir","rs","vrms","vmax"
,"jx","jy","jz","spin","m200b","m200c","m500c","m2500c"
,"xoff","voff","btoc","ctoa","ax","ay","az"]

# len(quantities) = 21, just to make the second loop expression 
# shorter in this post.

ncol = 5
nrow = math.ceil(21 / ncol)

fig, axes = plt.subplots(nrows = nrow, ncols=ncol, figsize=(8,6))

for i in range(nrow):
    for j in range(((21-i*5)>5)*5 + ((21-i*5)<5)*(21%5)):
        axes[i, j].plot(tree[quantities[i*ncol + j]]) 
        axes[i, j].set_title(quantities[i*ncol + j])

此代码循环遍历二维子图数组并在第 21 个图处停止,留下 4 个面板为空。 我的问题是,是否有任何内置方法来完成这项任务? 例如,制作 2D 子图数组并将数组“展平”为 1D,然后通过 0 到 20 遍历 1D 数组。

第二个 range() 中的表达式非常难看。我不认为我会使用此代码。 我认为简单的方法是计算地 block 的数量,如果计数 > 21 则中断。 但我只是想知道是否有更好(或奇特)的方法。

最佳答案

subplots 返回轴对象的 ndarray,您可以将其展平或拆散:

fig, axes = plt.subplots(nrows = nrow, ncols=ncol, figsize=(8,6))
for ax in axes.flatten()[:20]:
    # do stuff to ax

关于python - 循环遍历 2d 子图,就好像它是 1-D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070906/

相关文章:

python - 如何使用 matplotlib 绘制 3d 高斯分布?

scala - 如何解决 Scala 2.10.x 扁平化问题

sql-server - 创建平展空值的 SQL Server (T-SQL) View

python - 通过Pyglet在python中播放MP3文件时遇到问题

python - 使用列表理解来实现递归函数

python - Matplotlib:annotate() 缺少 1 个必需的位置参数: 'self'

python - 如何使用 NumPy.recarray 的两个 View 修改它

functional-programming - 理解展平的语义

python - 如何在 Python 中过滤掉字典中的非字符串键?

基于条件的 Python 点语法函数