41

我想创建一个由多个共享 x/y 轴的子图组成的图。从文档中它应该看起来像这样(尽管我的子图将是散点图):(代码here)

3 个共享 x 和 y 轴的子图

但我想动态创建子图!

所以子图的数量取决于前一个函数的输出。(每个图表可能会有大约 3 到 15 个子图,每个子图都来自不同的数据集,具体取决于我的脚本的输入。)

谁能告诉我如何做到这一点?

4

4 回答 4

37

假设您知道要使用的总子图总列:

import matplotlib.pyplot as plt

# Subplots are organized in a Rows x Cols Grid
# Tot and Cols are known

Tot = number_of_subplots
Cols = number_of_columns

# Compute Rows required

Rows = Tot // Cols 
Rows += Tot % Cols

# Create a Position index

Position = range(1,Tot + 1)

Rows的第一个实例仅考虑完全由子图填充的行,然后如果 1 或 2 或 ... Cols - 1 个子图仍需要位置,则再添加一个 Row。

然后创建图形并使用for 循环添加子图。

# Create main figure

fig = plt.figure(1)
for k in range(Tot):

  # add every single subplot to the figure with a for loop

  ax = fig.add_subplot(Rows,Cols,Position[k])
  ax.plot(x,y)      # Or whatever you want in the subplot

plt.show()

请注意,您需要范围Position才能将子图移动到正确的位置。

于 2016-12-29T18:24:11.003 回答
26
import matplotlib.pyplot as plt
from pylab import *
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

subplots_adjust(hspace=0.000)
number_of_subplots=3

for i,v in enumerate(xrange(number_of_subplots)):
    v = v+1
    ax1 = subplot(number_of_subplots,1,v)
    ax1.plot(x,y)

plt.show()

此代码有效,但您需要更正轴。我曾经subplot在同一列中绘制 3 个图表。您需要做的就是为number_of_plots变量分配一个整数。如果每个图的 X 和 Y 值不同,则需要为每个图分配它们。

subplot工作方式如下,例如,如果我有一个3,1,1. 这将创建一个 3x1 网格并将绘图放置在第一个位置。在下一次交互中,如果我的subplot值是3,1,2它,它会再次创建一个 3x1 网格,但将绘图放置在第二个位置,依此类推。

于 2012-09-07T14:50:53.580 回答
24

根据这篇文章,你想做的是这样的:

import matplotlib.pyplot as plt

# Start with one
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])

# Now later you get a new subplot; change the geometry of the existing
n = len(fig.axes)
for i in range(n):
    fig.axes[i].change_geometry(n+1, 1, i+1)

# Add the new
ax = fig.add_subplot(n+1, 1, n+1)
ax.plot([4,5,6])

plt.show() 

但是,Paul H回答指向名为gridspec的子模块,这可能会使上述操作更容易。我把它作为练习留给读者^_~。

于 2015-04-30T07:53:47.343 回答
1

我发现不是计算自己的行数和列数,而是plt.subplots先使用创建子图更容易,然后遍历轴对象以添加图。

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 8))
x_array = np.random.randn(6, 10)
y_array = np.random.randn(6, 10)

i = 0
for row in axes:
    for ax in row:
        x = x_array[i] 
        y = y_array[i]
        ax.scatter(x, y)
        ax.set_title("Plot " + str(i))
        i += 1
plt.tight_layout()
plt.show()

在这里,我使用 i 来遍历 and 的元素x_arrayy_array但您同样可以轻松地遍历函数或数据框列以动态生成图形。

于 2019-01-24T08:56:27.243 回答