【发布时间】:2020-02-27 16:45:08
【问题描述】:
我正在尝试以虚线样式绘制matplotlib.patches.FancyArrowPatch 的一部分。使用这篇帖子pyplot: Dotted line with FancyArrowPatch,我设法接近它:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
plt.figure()
kw = dict(arrowstyle = '-', shrinkA = 0, shrinkB = 0, color = 'k', connectionstyle = "arc3, rad = -0.9" )
arrow = mpatches.FancyArrowPatch((0, 0), (5, 3), **kw)
plt.gca().add_patch(arrow)
points = np.array([i[0] for i in arrow.get_path().iter_segments(curves = False)])
# arrow.remove()
a, = plt.plot(points[:-3,0], points[:-3,1])
plt.plot(points[-4:,0], points[-4:,1], linestyle = '--', color = a.get_color())
plt.tight_layout()
plt.show()
据我了解,蓝线与黑线不匹配,因为 iter_segments() 将曲线转换为点密度过低的直线。
我应该怎么做才能得到更好的结果?
【问题讨论】:
-
链接的答案使用
PathPatch,而不是plot。原因是路径的点是贝塞尔曲线的支点。因此曲线本身根本不会碰到它们。 -
哦,对了。关于如何将贝塞尔曲线正确转换为一系列点的任何提示?这是我必须绘制这条曲线半纯线半虚线的唯一想法。
-
哦,由于使用了
curves = False,这些点至少应该位于曲线上。他们不这样做的事实是由于在显示空间中评估路径,而不是在数据空间中。您可以查看plt.gca().set_aspect("equal")。因此,您是否需要新箭头来遵循确切的后曲线,或者它是否需要是任何曲线。 -
我想只要它尊重起点和终点,它就可以是任何曲线。此外,我没有设法使用
ax.transData和ax.transData.transform使这些点位于曲线上。这里面有些东西我不明白...
标签: python matplotlib annotate