我对此代码的工作方式有些困惑:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()


在这种情况下,无花果轴如何工作?它是做什么的?

又为什么这项工作不能做同样的事情:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)


评论

从matplotlib 2.1开始,第二个代码开始工作。

#1 楼

有几种方法可以做到这一点。 subplots方法创建图形以及子图,然后将其存储在ax数组中。例如:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()




但是,类似的事情也可以使用,尽管创建一个带有子图的图,然后在其上添加:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()




评论


我的绘图来自用户定义的函数,而不是plot(x,y),该函数使用networkx创建图形。如何使用它?

– Sigur
17年12月19日在0:03

是否可以在没有for循环的情况下生成多个子图?例如。一些在单独的图上绘制多列数据的矢量化解决方案?对于R中的ggplot来说,这非常简单,但是对于Python来说似乎是不可能的。

–user2739472
19年5月10日在14:25

您可以通过axn = ax.flatten()然后将axn中的轴减少为两个for循环:axes.plot(x,y)

– wander95
19年7月17日在19:17



@ wander95谢谢您,如果没有您,此答案不适用于col = 1或row = 1

–古尔扎
19年11月30日在20:10

#2 楼

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()




评论


我得到的是斧头,但无花果。这些是什么?

–Leevo
19年8月6日在9:25

ax实际上是一个numpy数组。图是matplotlib.figure.Figure类,通过它您可以对绘制的图进行很多操作。例如,您可以将颜色栏添加到特定的子图,您可以更改所有子图后面的背景色。您可以修改这些子图的布局,或为其添加新的小斧头。最好您可以为所有子图使用一个主标题,该标题可以通过fig.suptitle(title)方法获得。最后,一旦对图满意,就可以使用fig.savefig方法保存它。 @Leevo

–哈利勒·胡特(Hhalil Al Hooti)
19年8月6日在9:43

#3 楼


还可以在子图调用中打开轴的包装
,并设置是否要在子图之间共享x和y轴。

像这样:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()




#4 楼

您可能对以下事实感兴趣:从matplotlib 2.1版开始,问题的第二个代码也很好用。

来自更改日志:


Figure类现在具有subplots方法
Figure类现在具有subplots()方法,其行为与pyplot.subplots()但在现有图形上。


示例:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()


评论


我得到了:AttributeError Traceback(最近一次通话最近)()2 3 fig = plt.figure()----> 4轴= fig.subplots(nrows = 2 ,ncols = 2)AttributeError:'Figure'对象没有属性'subplots'

–鲁德·施密特(Ludo Schmidt)
18年3月28日在8:49

@LudoSchmidt答案为“从matplotlib 2.1版开始...”

–重要性
18 Mar 28 '18在8:52

#5 楼

阅读文档:matplotlib.pyplot.subplots

pyplot.subplots()返回一个元组fig, ax,该元组使用符号

fig, axes = plt.subplots(nrows=2, ncols=2)


分为两个变量。

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)


不起作用,因为subplots()pyplot中的函数,而不是对象Figure的成员。

#6 楼

如果您确实想使用循环,请执行以下操作。没人真正回答过如何循环馈送数据:
def plot(data):
    fig = plt.figure(figsize=(100, 100))
    for idx, k in enumerate(data.keys(), 1):
        x, y = data[k].keys(), data[k].values
        plt.subplot(63, 10, idx)
        plt.bar(x, y)  
    plt.show()