在2d子图上循环,好像它是1-D

Hos*_*hoi 7 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])
Run Code Online (Sandbox Code Playgroud)

此代码循环遍历2D子阵列,并在第21个图中停止,留下4个面板.我的问题是,有没有内置的方法来完成这项任务?例如,制作2D子图阵列并将阵列"展平"为1D,然后在1D阵列上循环0到20.

第二个范围()中的表达式非常难看.我不认为我会使用这段代码.我认为琐碎的方法是计算图表的数量,如果计数> 21则中断.但我只是想知道是否有更好的(或奇特的)方式.

Ffi*_*ydd 10

而不是提前使用创建子图plt.subplots,只需在使用时创建它们plt.subplot(nrows, ncols, number).下面的小例子展示了如何做到这一点.它创建了一个3x3的绘图数组,只绘制了前6个.

import numpy as np
import matplotlib.pyplot as plt

nrows, ncols = 3, 3

x = np.linspace(0,10,100)

fig = plt.figure()    
for i in range(1,7):
    ax = fig.add_subplot(nrows, ncols, i)
    ax.plot(x, x**i)

plt.show()
Run Code Online (Sandbox Code Playgroud)

例

你当然可以填写最后三个,plt.subplot(nrows, ncols, i)但不要在那里调用任何密谋(如果那是你想要的).

import numpy as np
import matplotlib.pyplot as plt

nrows, ncols = 3, 3

x = np.linspace(0,10,100)

fig = plt.figure()    
for i in range(1,10):
    ax = fig.add_subplot(nrows, ncols, i)
    if i < 7:
        ax.plot(x, x**i)

plt.show()
Run Code Online (Sandbox Code Playgroud)

例2

你可能也喜欢它的外观GridSpec.


tac*_*ell 7

subplots 返回一个轴对象的ndarray,你可以展平或拉扯它:

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