在2d子图上循环,就像它是1D一样

2024-10-02 02:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用子图绘制许多数据,我没有遇到麻烦,但我想知道是否有一种方便的方法来完成这项工作。在

下面是示例代码。在

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])

这段代码在一个2D子图数组上循环,并在第21个绘图处停止,留下4个面板为空。 我的问题是,有没有内置的方法来完成这个任务? 例如,制作2D子图数组并将数组“展平”为1D,然后在1D数组上循环0到20。在

第二个range()中的表达式非常难看。我不认为我会使用这个代码。 我认为最简单的方法是数数情节数,如果数到21就中断。 但我只是想知道有没有更好(或更奇特)的方法。在


Tags: 方法代码inimportforasrangeplt
2条回答

subplots返回一系列轴对象,您可以将其展平或展开:

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

与其预先使用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()

Example

当然,您可以通过执行plt.subplot(nrows, ncols, i)来填充最后三个,但不要在其中调用任何绘图(如果这是您想要的)。在

^{pr2}$

Example 2

{你的}也可能看起来像你。在

相关问题 更多 >

    热门问题