Matplotlib 默认不会显示居中的多边形图?

Matplotlib will not show a polygon plot centered by default?

对于我目前看到的所有类型的图,matplotlib 会在没有给出 xlim(), ylim() 值时自动将它们居中。示例:

import matplotlib.pyplot as plt
A_pts = [(162.5, 137.5), (211.0, 158.3), (89.6, 133.7)]
ax = plt.subplot(111)
ax.scatter(*A_pts)
plt.show()

但是当我绘制 Polygon

ax = plt.subplot(111)
triangle = plt.Polygon(A_pts, fill=None, edgecolor='r')
ax.add_patch(triangle)
plt.show()

绘图 window 显示了两个轴的限制 [0, 1],这导致多边形不可见。我必须明确通过适当的限制,以便它显示在图中 window

ax.set_xlim(80, 250)
ax.set_ylim(120, 170)

这是设计使然还是我遗漏了什么?

这是设计使然。 plotscatter 之类的东西是绘图函数,可以接收数据、创建艺术家并形成 plot/adjust 轴。 add_patch 另一方面,更像是一种艺术家控制方法(它不创建艺术家,艺术家本身被传入)。正如 Paul H 在评论中提到的,它处于 public API 的最低级别,并且在该级别假定您可以完全控制该图。

添加补丁时,坐标轴的数据限制发生了变化,打印可以看到ax.dataLim.bounds。但是,add_patch 不会调用 automlimits 函数,而大多数其他绘图命令会调用。

这意味着您可以手动设置绘图的限制(如问题所示),或者您可以调用 ax.autoscale_view() 来调整限制。后者当然有一个优点,即您不需要事先确定限制,并且可以保留边距。

import matplotlib.pyplot as plt
pts = [(162, 137), (211, 158), (89, 133)]
ax = plt.subplot(111)
triangle = plt.Polygon(pts, fill=None, edgecolor='r')
ax.add_patch(triangle)
print ax.dataLim.bounds

ax.autoscale_view()
plt.show() 

一旦您添加了一些其他自动缩放限制的绘图,就无需再调用 autoscale_view()

import matplotlib.pyplot as plt
pts = [(162, 137), (211, 158), (89, 133)]
ax = plt.subplot(111)
triangle = plt.Polygon(pts, fill=None, edgecolor='r')
ax.add_patch(triangle)

ax.plot([100,151,200,100], [124,135,128,124])

plt.show()