我正在尝试使用子图绘制许多数据并且我没有遇到麻烦,但我想知道是否有一种方便的方法来执行此操作。
下面是示例代码。
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,然后通过0到20遍历1D数组。
第二个范围()中的表达式非常难看。我不认为我会使用这段代码。 我认为琐碎的方法是计算图的数量,如果计数&gt; 21。 但我只是想知道是否有更好的(或奇特的)方式。
答案 0 :(得分:8)
不是使用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()
你可以通过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()
您可能也喜欢GridSpec
的外观。
答案 1 :(得分:7)
subplots
返回一个轴对象的ndarray,你可以展平或拉扯它:
fig, axes = plt.subplots(nrows = nrow, ncols=ncol, figsize=(8,6))
for ax in axes.flatten()[:20]:
# do stuff to ax