所以我一直在使用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
的第一个实例,则会显示该图,第一个子图将绘制x1
和y1
,第二个将为空白;正是我期待的。窥探,我发现了类似的代码格式:
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()
我认为这不会那么困难,但是,嘿,告诉你我所知道的。任何帮助都会很不错。
答案 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)
然后我们用
标记第一个ax1my_plotter(ax1, x1, y1)
然后用
标记第二个ax2my_plotter(ax2, x2, y2)
最后确保您的功能正在改变轴对象。之前,你有ax.plot()。你改成了plt.scatter。请尝试使用ax.scatter()。