pyplot:FancyArrowPatch的虚线

时间:2017-11-08 12:55:57

标签: python matplotlib

我正在使用pythonmatplotlib.pyplot来生成复杂的图形输出。我想将dotted linestyle与FancyArrowPatch结合使用,但未能这样做。

MWE:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

style="Simple,head_width=4,head_length=8"
linestyle="dotted" # or "solid"
kw = dict(arrowstyle=style, linestyle=linestyle, color="b", connectionstyle="arc3,rad=1")
plt.gca().add_patch(patches.FancyArrowPatch((0,1), (1,1), **kw))
plt.savefig("MWE.pdf")

这会生成以下图像:

Zoom of MWE.pdf

但是,我希望得到类似的内容:

GIMPed version using linestyle solid

问题:我需要在MWE中更改以获得较低的图像?

2 个答案:

答案 0 :(得分:1)

正如评论中所说,我怀疑是否有可能轻松改变FancyArrowPatch的线型。这实际上是一个多边形意义上的补丁,由13个点组成,这些点由线连接。如果更改了linestyle,则无法仅为部分补丁更改它。

选项可能确实将补丁分成箭头和尾部。对于尾部,您只能参与其中并沿着这些点创建一条新线。这条线可以有自己的linestyle。头部可以保持填充补丁,您可以选择不同的线型。

您可以通过arrow.get_path()获取原始箭头的路径。请注意,这将固定坐标,即箭头的所有变换都将丢失。因此,只有在设置了最终轴限制和图形尺寸后才需要确保这样做,并且如果稍后更改它们中的任何一个将以不希望的方式挤压箭头。

import matplotlib.pyplot as plt
import matplotlib.path
import matplotlib.patches as patches


style="Simple,head_width=40,head_length=80"
kw = dict(arrowstyle=style, linestyle=None, lw=1,color="b",connectionstyle="arc3,rad=0.2")
arrow = patches.FancyArrowPatch((0,1), (1,1), **kw)

plt.gca().add_patch(arrow)
plt.gca().axis([0,1.03,0,1.1])

def split_arrow(arrow, color_tail="C0",color_head="C0", 
                ls_tail="-", ls_head="-",lw_tail=1.5, lw_head=1.5):    
    v1 = arrow.get_path().vertices[0:3,:]
    c1 = arrow.get_path().codes[0:3]
    p1 = matplotlib.path.Path(v1,c1)
    pp1 = patches.PathPatch(p1, color=color_tail, linestyle=ls_tail, 
                            fill=False, lw=lw_tail)
    arrow.axes.add_patch(pp1)

    v2 = arrow.get_path().vertices[3:8,:]
    c2 = arrow.get_path().codes[3:8]
    c2[0] = 1
    p2 = matplotlib.path.Path(v2,c2)
    pp2 = patches.PathPatch(p2, color=color_head, lw=lw_head, linestyle=ls_head)
    arrow.axes.add_patch(pp2)
    arrow.remove()

split_arrow(arrow, color_tail="crimson",color_head="limegreen", 
                ls_tail="--", lw_tail=3)

plt.show()

enter image description here

答案 1 :(得分:-1)

另一种实现方式是将箭头分为两部分:

  • 箭头轴(虚线)
  • 箭头头(未虚线)

I used this workaround绘制虚线相量。

Phasor diagram created by EE.jl