小能豆

我可以创建 AxesSubplot 对象,然后将它们添加到 Figure 实例吗?

javascript

查看matplotlib文档,似乎将 an 添加AxesSubplot到 a 的标准方法Figure是使用Figure.add_subplot

from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_subplot(1,1,1)
ax.hist( some params .... )

我希望能够AxesSubPlot独立于图形创建类似对象,以便可以在不同的图形中使用它们。类似

fig = pyplot.figure()
histoA = some_axes_subplot_maker.hist( some params ..... )
histoA = some_axes_subplot_maker.hist( some other params ..... )
# make one figure with both plots
fig.add_subaxes(histo1, 211)
fig.add_subaxes(histo1, 212)
fig2 = pyplot.figure()
# make a figure with the first plot only
fig2.add_subaxes(histo1, 111)

这可能吗matplotlib?如果可以,我该怎么做?

更新:我还没有设法将轴和图形的创建分离,但按照下面答案中的示例,可以轻松地在新的或旧的图形实例中重复使用以前创建的轴。这可以用一个简单的函数来说明:

def plot_axes(ax, fig=None, geometry=(1,1,1)):
    if fig is None:
        fig = plt.figure()
    if ax.get_geometry() != geometry :
        ax.change_geometry(*geometry)
    ax = fig.axes.append(ax)
    return fig

阅读 54

收藏
2024-07-22

共1个答案

小能豆

matplotlib 中,AxesFigure 对象是紧密耦合的。通常情况下,Axes 对象是在 Figure 中创建的,并且不能独立于 Figure 存在。然而,有一些方法可以模拟你想要的行为,即在不同的 Figure 中使用相同的 Axes

方法 1:创建重用的绘图函数

你可以定义绘图函数,这样你可以在不同的 Figure 中应用相同的绘图逻辑。这种方法允许你在多个图形中重复使用相同的绘图代码。

import matplotlib.pyplot as plt

def plot_histogram(ax, data, **kwargs):
    """ 在给定的 Axes 上绘制直方图 """
    ax.hist(data, **kwargs)

# 生成一些示例数据
import numpy as np
data1 = np.random.randn(1000)
data2 = np.random.randn(1000)

# 创建第一个图形和坐标轴
fig1, ax1 = plt.subplots()
plot_histogram(ax1, data1, bins=30, color='blue')

# 创建第二个图形和坐标轴
fig2, ax2 = plt.subplots()
plot_histogram(ax2, data2, bins=30, color='green')

plt.show()

方法 2:使用 Figure.add_axes 进行自定义放置

如果你想对 Axes 的位置和大小有更多的控制,可以使用 Figure.add_axes 方法。这个方法允许你指定 Axes 的位置和大小,这样你可以在多个图形中重复使用相同的布局逻辑。

fig1 = plt.figure()
ax1 = fig1.add_axes([0.1, 0.6, 0.8, 0.3])  # [left, bottom, width, height]
plot_histogram(ax1, data1, bins=30, color='blue')

fig2 = plt.figure()
ax2 = fig2.add_axes([0.1, 0.1, 0.8, 0.8])
plot_histogram(ax2, data2, bins=30, color='green')

plt.show()

方法 3:使用 GridSpec 布局管理器

GridSpec 提供了一种灵活的方式来安排多个 Axes 对象。你可以使用 GridSpec 定义图形的网格布局,并在该布局中创建多个 Axes 对象。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# 创建图形和 GridSpec 对象
fig = plt.figure()
gs = gridspec.GridSpec(2, 1)  # 2 行 1 列的网格布局

# 在 GridSpec 的位置上创建 Axes
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])

# 绘制数据
plot_histogram(ax1, data1, bins=30, color='blue')
plot_histogram(ax2, data2, bins=30, color='green')

plt.show()

方法 4:复制 Axes 对象(有限)

虽然 matplotlib 不直接支持在不同的 Figure 中重复使用 Axes 对象,但你可以通过复制 Axes 对象的内容来模拟这种行为。这并不完全等同于真正的重用,但可以在一定程度上满足需求。

import matplotlib.pyplot as plt

def copy_axes(ax):
    fig = plt.figure()
    new_ax = fig.add_subplot(111)
    for line in ax.get_lines():
        new_ax.plot(line.get_data(), label=line.get_label())
    return fig, new_ax

# 创建原始图形和坐标轴
fig1, ax1 = plt.subplots()
plot_histogram(ax1, data1, bins=30, color='blue')

# 复制坐标轴到新图形
fig2, ax2 = copy_axes(ax1)
plt.show()

总结

  • 重用绘图逻辑:将绘图逻辑封装在函数中,然后在不同的 Axes 对象上调用这些函数。
  • 自定义 Axes 放置:使用 Figure.add_axes 进行精确控制。
  • 使用 GridSpec:灵活安排多个 Axes 对象的布局。
  • 复制 Axes 对象:模拟在不同 Figure 中重用 Axes 对象的行为。

这些方法可以帮助你在不同的 Figure 中重复使用绘图逻辑或布局,满足你的需求。

2024-07-22