使用函数创建绘图对象,然后将它们放入图中

Use function to create plot objects, then place them into figure

所以我一直在处理 Usage Page 中显示的示例。它的代码是:

import numpy as np
import matplotlib.pyplot as plt

n1 = 5
n2 = 30

x1 = np.linspace(0,10,n1)
y1 = np.random.rand(n1)
x2 = np.linspace(0,10,n2)
y2 = np.random.rand(n2)

#Matplotlib example copy paste
def my_plotter(ax, data1, data2, param_dict):
    out = ax.plot(data1, data2, **param_dict)
    return out

fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, x1, y1, {'marker':'x'})
my_plotter(ax2, x2, y2, {'marker':'o'})

plt.show()

请注意,示例中的文档字符串已被删除以节省 space。

问题是,如果我去掉 param_dict 参数,

my_plotter(ax1, x1, y1)
my_plotter(ax2, x2, y2)

,它不仅不起作用(在 运行ning 脚本和 运行ning plt.show() 脚本具有 运行 会出现空白子图),但不会出现任何错误。如果我 运行 只显示 my_plotter 的第一个实例,将显示图形,第一个子图将绘制 x1y1,第二个将为空白;正是我所期待的。翻来覆去,发现了类似的代码格式:

def axtest(x, y, ax=None):
    if ax is None:
        ax = plt.gca()
    ret = ax.plot(x, y)
    return(ret)

fig, (ax1, ax2) = plt.subplots(1,2)
print('blah')
axtest(x1, y1, ax1)
axtext(x2, y2, ax2)

plt.show()

此代码显示了与上述函数完全相同的行为; axtest 的一个实例将绘制一个非空白和空白的子图,而 axtest 的两个实例将不执行任何操作,没有错误可言。

我错过了什么?我是否必须将参数传递给轴才能使其工作?因为那对我来说毫无意义。

我的最终目标是使用我拥有的一些代码来执行此操作:

def orig_func(x, y, z):
   X, Y, Z = interpolate_to_grid(x, y, z)
   fig = plt.figure()
   plt.imshow(Z)
   plt.contour(X, Y, Z)
   plt.scatter(X, Y, c=Z)
   #do formating of the data
   plt.show()

并让它这样做:

def new_func(x, y, z):
   X, Y, Z = interpolate_to_grid(x, y, z)
   fig = plt.figure()
   plt.imshow(Z)
   plt.contour(X, Y, Z)
   plt.scatter(X, Y, c=Z)
   #do formating of the data
   return(the plot info)

plot_info1 = new_func(x1, y1, z1)
plot_info2 = new_func(x2, y2, z2)

fig, (ax1, ax2) = plt.subplots(1,2)

ax1 = plot_info1
ax2 = plot_info2

plt.show()

我认为这不会那么困难,但是,嘿,向您展示我所知道的。任何帮助都会很好。

你确定你第一次尝试没有犯小错误吗?以下对我来说很好用。

import numpy as np
import matplotlib.pyplot as plt

n1 = 5
n2 = 30

x1 = np.linspace(0,10,n1)
y1 = np.random.rand(n1)
x2 = np.linspace(0,10,n2)
y2 = np.random.rand(n2)

#Matplotlib example copy paste
def my_plotter(ax, data1, data2):
    out = ax.plot(data1, data2)
    return out

fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, x1, y1)
my_plotter(ax2, x2, y2)

plt.show()

所以剩下的问题是你的第二个例子有什么问题。在上面列出的示例中,我们有一个函数,它被赋予一个轴对象 (ax) 以及数据。它 returns 现在在其上绘制的完全相同的轴对象。

您在函数中创建了一个图形,但这不是必需的,因为我们已经在此处创建了图形

fig, (ax1, ax2) = plt.subplots(1, 2)

然后我们用

标记第一个 ax1
my_plotter(ax1, x1, y1)

然后用

标记第二个 ax2
my_plotter(ax2, x2, y2)

最后确保您的函数正在改变轴对象。之前,你有 ax.plot()。您更改为 plt.scatter。请尝试 ax.scatter()。