使用函数创建绘图对象,然后将它们放入图中
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
的第一个实例,将显示图形,第一个子图将绘制 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()
我认为这不会那么困难,但是,嘿,向您展示我所知道的。任何帮助都会很好。
你确定你第一次尝试没有犯小错误吗?以下对我来说很好用。
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()。
所以我一直在处理 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
的第一个实例,将显示图形,第一个子图将绘制 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()
我认为这不会那么困难,但是,嘿,向您展示我所知道的。任何帮助都会很好。
你确定你第一次尝试没有犯小错误吗?以下对我来说很好用。
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)
然后我们用
标记第一个 ax1my_plotter(ax1, x1, y1)
然后用
标记第二个 ax2my_plotter(ax2, x2, y2)
最后确保您的函数正在改变轴对象。之前,你有 ax.plot()。您更改为 plt.scatter。请尝试 ax.scatter()。