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

时间:2017-03-29 15:59:51

标签: python object matplotlib plot subplot

所以我一直在使用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()

请注意,示例中的docstring已被删除以节省空间。

问题是,如果我摆脱param_dict参数,

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

,它不仅不起作用(运行脚本并在脚本运行后在控制台中运行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()

我认为这不会那么困难,但是,嘿,告诉你我所知道的。任何帮助都会很不错。

1 个答案:

答案 0 :(得分:0)

你确定第一次尝试时没有犯错。以下对我来说很好。

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)以及数据。它返回的是同一个轴对象,现在已经绘制了它。

你在这个函数中创建了一个数字,但这不需要,因为我们已经在这里创建了数字

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()。