只是为了详细说明@Alan所说的内容,您通常会构建与此类似的绘图函数:
import numpy as np
import matplotlib.pyplot as plt
def main():
data = [np.random.random((2, 3)) for _ in range(5)]
fig, ax = plt.subplots()
plot_polygons(data, alpha=0.5, ax=ax)
plot_verts(data, marker='^', color='black', ax=ax)
plt.show()
def plot_polygons(data, ax=None, **kwargs):
if ax is None:
ax = plt.gca()
artists = [ax.fill(x, y, **kwargs) for x, y in data]
return artists
def plot_verts(data, ax=None, **kwargs):
if ax is None:
ax = plt.gca()
artists = [ax.scatter(x, y, **kwargs) for x, y in data]
return artists
main()
这种方法的优点是您可以隐式使用当前图形和/或自动创建一个。通过做类似的事情ax = plt.gca() if ax is None else ax
在绘图函数中,如果您愿意,可以混合使用 pyplot 状态机样式:
def main():
data = [np.random.random((2, 3)) for _ in range(5)]
plot_polygons(data, alpha=0.5)
plot_verts(data, marker='^', color='black')
plt.show()
或者您可以明确指定Axes
实例(通常这是一种更好的方法)。这允许您以不同的方式在特定轴上绘图:
data = [np.random.random((2, 3)) for _ in range(5)]
fig, axes = plt.subplots(nrows=2, sharex=True)
axes[0].set(title='Simple Plot', ylabel='Y-label')
plot_verts(data, marker='o', ax=axes[0])
axes[1].set(title='More complex', xlabel='X-label')
plot_polygons(data, ax=axes[1], alpha=0.5, color='gray')
plot_verts(data, ax=axes[1], color='red', marker='s', s=200)
plt.show()
请注意,我正在返回创建的艺术家,但我尚未在任何示例中使用它们。但是,返回艺术家是个好主意,因为它允许您稍后根据需要修改他们的属性。
例如,让我们整理一个简单的交互式示例,当您单击时它将隐藏多边形。我将重新定义之前的函数,使其成为一个完整的示例,您可以复制粘贴并运行:
import numpy as np
import matplotlib.pyplot as plt
def main():
data = [np.random.random((2, 3)) for _ in range(5)]
fig, ax = plt.subplots()
polygons = plot_polygons(data, alpha=0.5, ax=ax, color='gray')
verts = plot_verts(data, marker='s', color='red', ax=ax, s=200)
def on_click(event):
visible = polygons[0][0].get_visible()
plt.setp(polygons, visible=not visible)
plt.setp(verts, color=np.random.random(3))
plt.draw()
fig.canvas.mpl_connect('button_press_event', on_click)
ax.set(title='Click on plot to change')
plt.show()
def plot_polygons(data, ax=None, **kwargs):
if ax is None:
ax = plt.gca()
artists = [ax.fill(x, y, **kwargs) for x, y in data]
return artists
def plot_verts(data, ax=None, **kwargs):
if ax is None:
ax = plt.gca()
artists = [ax.scatter(x, y, **kwargs) for x, y in data]
return artists
main()