在 matplotlib 中排列具有从网格上的函数调用的子图的图
Arrange plots that have subplots called from functions on grid in matplotlib
我正在寻找类似于 R 中的 arrangeGrob 的东西:
我有一个函数(比如,函数 FUN1
)可以创建一个带有子图的图。 FUN1
创建的子图数量可能会有所不同,而且情节本身非常复杂。我还有另外两个函数 FUN2
和 FUN3
,它们也可以创建不同结构的图。
有没有一种简单的方法来 define/arrange 整体 GRID,例如简单的 3 行 1 列样式和只需通过
FUN1 --> GRID(row 1, col 1)
FUN2 --> GRID(row 2, col 1)
FUN3 --> GRID(row 3, col 1)
之后,FUN1
生成的复杂图绘制在第 1 行,FUN2 生成的图绘制在第 2 行,依此类推,之前没有在 FUN 中指定子图标准?
使用 matplotlib 创建绘图的通常方法是先创建一些轴,然后绘制到这些轴上。可以使用 plt.subplots
、figure.add_subplot
、plt.subplot2grid
或更复杂的 GridSpec
在网格上设置轴。
一旦创建了这些轴,就可以将它们提供给函数,函数将内容绘制到轴上。下面是一个示例,其中创建了 6 个轴并使用 3 个不同的函数绘制它们。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
def func1(ax, bx, cx):
x = np.arange(3)
x2 = np.linspace(-3,3)
y1 = [1,2,4]
y2 = [3,2.5,3.4]
f = lambda x: np.exp(-x**2)
ax.bar(x-0.5, y1, width=0.4)
ax.bar(x, y2, width=0.4)
bx.plot(x,y1, label="lab1")
bx.scatter(x,y2, label="lab2")
bx.legend()
cx.fill_between(x2, f(x2))
def func2(ax, bx):
x = np.arange(1,18)/1.9
y = np.arange(1,6)/1.4
z = np.outer(np.sin(x), -np.sqrt(y)).T
ax.imshow(z, aspect="auto", cmap="Purples_r")
X, Y = np.meshgrid(np.linspace(-3,3),np.linspace(-3,3))
U = -1-X**2+Y
V = 1+X-Y**2
bx.streamplot(X, Y, U, V, color=U, linewidth=2, cmap="autumn")
def func3(ax):
data = [sorted(np.random.normal(0, s, 100)) for s in range(2,5)]
ax.violinplot(data)
gs = gridspec.GridSpec(3, 4,
width_ratios=[1,1.5,0.75,1], height_ratios=[3,2,2] )
ax1 = plt.subplot(gs[0:2,0])
ax2 = plt.subplot(gs[2,0:2])
ax3 = plt.subplot(gs[0,1:3])
ax4 = plt.subplot(gs[1,1])
ax5 = plt.subplot(gs[0,3])
ax6 = plt.subplot(gs[1:,2:])
func1(ax1, ax3, ax5)
func3(ax2)
func2(ax4, ax6)
plt.tight_layout()
plt.show()
我正在寻找类似于 R 中的 arrangeGrob 的东西:
我有一个函数(比如,函数 FUN1
)可以创建一个带有子图的图。 FUN1
创建的子图数量可能会有所不同,而且情节本身非常复杂。我还有另外两个函数 FUN2
和 FUN3
,它们也可以创建不同结构的图。
有没有一种简单的方法来 define/arrange 整体 GRID,例如简单的 3 行 1 列样式和只需通过
FUN1 --> GRID(row 1, col 1)
FUN2 --> GRID(row 2, col 1)
FUN3 --> GRID(row 3, col 1)
之后,FUN1
生成的复杂图绘制在第 1 行,FUN2 生成的图绘制在第 2 行,依此类推,之前没有在 FUN 中指定子图标准?
使用 matplotlib 创建绘图的通常方法是先创建一些轴,然后绘制到这些轴上。可以使用 plt.subplots
、figure.add_subplot
、plt.subplot2grid
或更复杂的 GridSpec
在网格上设置轴。
一旦创建了这些轴,就可以将它们提供给函数,函数将内容绘制到轴上。下面是一个示例,其中创建了 6 个轴并使用 3 个不同的函数绘制它们。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
def func1(ax, bx, cx):
x = np.arange(3)
x2 = np.linspace(-3,3)
y1 = [1,2,4]
y2 = [3,2.5,3.4]
f = lambda x: np.exp(-x**2)
ax.bar(x-0.5, y1, width=0.4)
ax.bar(x, y2, width=0.4)
bx.plot(x,y1, label="lab1")
bx.scatter(x,y2, label="lab2")
bx.legend()
cx.fill_between(x2, f(x2))
def func2(ax, bx):
x = np.arange(1,18)/1.9
y = np.arange(1,6)/1.4
z = np.outer(np.sin(x), -np.sqrt(y)).T
ax.imshow(z, aspect="auto", cmap="Purples_r")
X, Y = np.meshgrid(np.linspace(-3,3),np.linspace(-3,3))
U = -1-X**2+Y
V = 1+X-Y**2
bx.streamplot(X, Y, U, V, color=U, linewidth=2, cmap="autumn")
def func3(ax):
data = [sorted(np.random.normal(0, s, 100)) for s in range(2,5)]
ax.violinplot(data)
gs = gridspec.GridSpec(3, 4,
width_ratios=[1,1.5,0.75,1], height_ratios=[3,2,2] )
ax1 = plt.subplot(gs[0:2,0])
ax2 = plt.subplot(gs[2,0:2])
ax3 = plt.subplot(gs[0,1:3])
ax4 = plt.subplot(gs[1,1])
ax5 = plt.subplot(gs[0,3])
ax6 = plt.subplot(gs[1:,2:])
func1(ax1, ax3, ax5)
func3(ax2)
func2(ax4, ax6)
plt.tight_layout()
plt.show()