【问题标题】:Inconsistent figure coordinates in matplotlib with equal aspect ratiomatplotlib中具有相同纵横比的图形坐标不一致
【发布时间】:2017-06-08 15:57:37
【问题描述】:

我正在准备一个带有从一个到另一个的子图和箭头的图形,在这里解决:Drawing lines between two plots in Matplotlib

在我的图中,子图都具有相同的纵横比,这似乎扰乱了从数据坐标到图形坐标的转换,所以我创建的 Line2D 对象不会去我想要的地方。

这是一个简单的例子(从上面的链接修改),它演示了这个问题,甚至不需要子图:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6,4))
ax = fig.add_subplot(111)
ax.set_aspect('equal')

x = [0.2, 0.9]
y = [0.3, 0.7]

ax.plot(x,y,'k--', lw=4)

transFigure = fig.transFigure.inverted()

coord1 = transFigure.transform(ax.transData.transform([x[0],y[0]]))
coord2 = transFigure.transform(ax.transData.transform([x[1],y[1]]))

line = matplotlib.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),
                           transform=fig.transFigure)

fig.lines.append(line)

plt.show()

通过改变图形的尺寸,很容易看到 Line2D 对象改变了斜率,而轴上的图保持了它的斜率(对于相等的纵横比)。

是否有一种直接的方法来获取这些图形坐标(或使用不同的变换),以使 Line2D 对象与绘制的线保持一致?

【问题讨论】:

  • 你能说出为什么你不按照 cmets 对链接问题的建议使用 ConnectorPatch 吗?
  • 我实际上是在使用 PathPatch 绘制一些曲线(将许多曲线从一个绘图折叠到另一个绘图),然后还在这些曲线的末端添加 FancyArrows。看起来 ConnectorPatch 会接近我想要的,但我想将曲线指定为贝塞尔曲线以收敛并在一侧以相同的斜率结束。

标签: python matplotlib


【解决方案1】:

问题在于,当将纵横比设置为等于轴的尺寸和位置时,只有在画布上绘制了某些东西后才能由 matplotlib 确定。在绘制数据之前,它无法知道坐标轴在最终图中的位置。使用像x = [0.2, 0.9]; y = [0.55, 0.6] 这样的更极端的点会更清楚。

最简单的解决方法是调用

fig.canvas.draw()

就在plot 命令之后,但在进行任何转换之前。通过这种方式,图形被绘制到画布上,应用相等的方面;从此时起,可以使用正确的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2014-02-16
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多