自动缩放不适用于绘制箭头

时间:2016-06-18 16:45:28

标签: python matplotlib

尝试使用以下内容在Matplotlib中绘制一个简单的箭头:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.arrow(1, 1, 1, 1)
plt.show()

导致空图。

如果箭头规格更改为ax.arrow(0, 0, 1, 1),那么我会在最终的情节中看到一个箭头。因此我怀疑这可能是轴缩放的问题,所以我根据Matplotlib autoscale中的建议将代码修改为以下内容:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.arrow(1, 1, 1, 1)
ax.relim()
ax.autoscale_view()
plt.show()

也不起作用。

我发现手动设置限制,如以下作品

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.arrow(1, 1, 1, 1)
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
plt.show()

奇怪的是,我发现单独ax.set_xlim()ax.set_ylim()单独无效我必须设置箭头的限制才能显示。

问题:

  • ax.arrow是否需要特殊处理?
  • ax.relim()ax.autoscale_view()以外,我错过了一些命令吗?
  • 为什么我必须同时设置xlimylim

版本:

  • Python:3.5.1
  • Matplotlib:1.5.1
  • Linux:64位Archlinux

1 个答案:

答案 0 :(得分:1)

Windows 10和Ubuntu 14上的问题仍然存在,最新版本的matplotlib和Python 3.4 / 3.5。一个简单的解决方法是创建一个辅助函数arrow_,它在箭头的开头和结尾创建两个不可见的点。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()

def arrow_(ax, plt, x, y, dx, dy, **kwargs):
    ax.arrow(x, y, dx, dy, **kwargs)
    plt.plot([x, x + dx + 0.1], [y, y + dx + 0.1], alpha=0)

arrow_(ax, plt, 1, 1, 1, 1)
ax.relim()
#plt.plot([1.8], [1.5], 'ro')
ax.autoscale_view()
plt.show()
  • 注释行只是为了证明不可见的点不会干扰图的其余部分。
  • 0.1的附加值只是为了补偿箭头。