【问题标题】:autoscaling not working on drawing arrow自动缩放不适用于绘图箭头
【发布时间】:2016-06-20 01:28:57
【问题描述】:

尝试使用以下方法在 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

【问题讨论】:

  • 对我来说似乎是一个错误或未指定的行为。自动缩放时不添加箭头会给出相同的 x/y 比例。你的箭头从 1,1 开始,向上移动 1 和向右移动 1,因此你需要 xlim 和 ylim。如果您仅将 xlim 设置为 0,5,您的窗口将为 x:0,5 和 y:0,1,并且箭头仍将位于您的框架之外。
  • @Ashafix 谢谢,你对为什么需要xlimylim 的解释是有道理的。

标签: python matplotlib


【解决方案1】:

使用最新版本的 matplotlib 和 Python 3.4/3.5 的 Windows 10 和 Ubuntu 14 上问题仍然存在。一个简单的解决方法是创建一个辅助函数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的附加值只是为了补偿箭头。

【讨论】:

  • 几年后得出这个答案。我不认为这个错误已经解决了?我试图在ax.arrow(10,50,12,3) 上绘制一个箭头,该图没有显示任何内容,并且在两个轴上都限制为 1.0 和 1.0。
  • 是的,我也有同样的问题
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多