我想创建一个由多个具有共享x / y轴的子图组成的图。 它应该从文档中看起来像这样(虽然我的子图将是散点图):(code here)
但我想动态创建子图!
因此子图的数量取决于前一个函数的输出。 (每个图表可能大约有3到15个子图,每个子图来自不同的数据集,具体取决于我的脚本输入。)
谁能告诉我如何实现这一目标?
答案 0 :(得分:20)
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网格,但将绘图放在第二个位置,依此类推。
答案 1 :(得分:14)
Based on this post,你想要做的是这样的事情:
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的answer指向名为gridspec的子模块,这可能会使上述内容变得更容易。我将此作为练习留给读者^ _~。
答案 2 :(得分:13)
假设您知道要使用的总子图和总列:
import matlab.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)
行的第一个实例仅针对完全由子图填充的行,然后再添加一个行,如果1或2或者...... Cols - 1个子图仍然需要位置。
然后使用 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()
请注意,您需要位置范围才能将子图移动到正确的位置。
答案 3 :(得分:0)
我发现不用计算自己的行数和列数,而是更容易地使用plt.subplots
创建子图,然后遍历axis对象以添加图。
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来遍历x_array
和y_array
的元素,但是您同样可以轻松地遍历函数或数据框的列以动态生成图。