设置绘制箭头时的虚线长度

4 投票
2 回答
3423 浏览
提问于 2025-04-18 04:03

使用matplotlib库,我们可以很简单地绘制带有自定义虚线样式的线条,方法是使用

plt.plot([0, 5], [0, 5], dashes=(20.0, 20.0))
plt.show()

或者

lines = plt.plot([0, 5], [0, 5])
lines[0].set_dashes((20.0, 20.0))
plt.show()

虽然我们可以用虚线样式来绘制箭头

plt.arrow(0, 0, 5, 5, linestyle='dashed')
plt.show()

但我似乎找不到方法来绘制带有自定义虚线样式的箭头

arrow = plt.arrow(0, 0, 5, 5)
?
plt.show()

因为使用plot函数的dashes参数会导致

AttributeError: 'FancyArrow' object has no attribute 'set_dashes'

而且错误信息提到返回的FancyArrow没有set_dashes()这个方法。这样做有可能吗?

2 个回答

3

你可以传递一个(偏移量,线条样式),

其中线条样式是一个包含开和关墨水点的偶数长度元组。

具体可以参考 set_linestyle

举个例子,ax.arrow(0, 0, 3, 3, linestyle=(5, (3,6))) 这个代码会画出一条虚线箭头,其中“开”的部分的长度是“关”的部分的两倍;而 ax.arrow(0, 0, 3, 3, linestyle=(5, (3,9))) 则是“开”的部分的长度是“关”的部分的三倍。

另外,offset 这个参数在设置箭头的 linestyle 时似乎没有什么效果,至少在我使用的 3.0.3 版本的 matplotlib 中是这样的。

2

目前,我觉得这是不可能的,因为 Arrow 类只支持四种线条样式:'solid' | 'dashed' | 'dashdot' | 'dotted'。如果想使用自定义的虚线样式,那个对象必须有一个叫 ._dashSeq 的属性,而 Arrow 是没有这个属性的。所以我能理解为什么会有 .set_dashes 这个方法。

不过,虽然现在 Arrow 提供了 .set_linestyle 方法,但你不能设置成其他任何样式,除了上面提到的四种。这就意味着像 .set_linestyle('-') 这样的设置是不可行的。

撰写回答