首页 > 解决方案 > matplotlib 中 plot 和 annotate 中的 Linestyle 不相等

问题描述

我在 Julia 中使用 PyPlot,它基本上依赖于 matplotlib。但是,我怀疑 Python 中的问题是相同的:当我使用相同属性plot的线条和箭头(无头)时,我希望这两个对象具有相同的线条样式。但这显然不是这样的:annotatelinestyle

using PyPlot
plot([0,1],[-0.05,-0.05],linestyle="--",linewidth=1)
annotate("",xy=(1,0.05),xytext=(0,0.05),xycoords="data",
  arrowprops=Dict("arrowstyle"=>"-","linestyle"=>"--","linewidth"=>1))
ylim(-0.5,0.5)

结果:

在此处输入图像描述

奇怪的是,即使指定的水平坐标相同,两条线在图中的水平起点和终点似乎也不相同。这对我来说不是什么大问题,但也可能与我的线条样式问题有关。

有谁知道如何通过plotand创建精确相等的线条图案annotate

对于出版物中的几个图表,我需要两条线具有完全相同的模式。

标签: pythonmatplotlibjulia

解决方案


有两个问题。(请注意,我在这里使用 python 语法,因为我对 Julia 没有什么经验)

使线条等长。

默认情况下,annotate 使用两端缩短的线条,这在您想要注释某些内容并且不希望线条与要注释的对象或注释文本重叠的通常情况下很有用。为确保该行不收缩,您可以使用shrinkAandshrinkB属性:

arrowprops={"arrowstyle" : "-", "linestyle" : "--",
            "shrinkA": 0, "shrinkB": 0}

使线条样式相同。

默认情况下,Line2Dcreated byplot有一个“对接”的capstyle,而注解线有一个圆角的 capstyle。

为两者设置“圆角”帽子样式相对容易。使用以下dash_capstyle="round"选项plot

import matplotlib.pyplot as plt

plt.plot([0,1],[-0.05,-0.05],linestyle="--",linewidth=3, dash_capstyle="round")
plt.annotate("",xy=(1,0.05),xytext=(0,0.05),xycoords="data",
             arrowprops={"arrowstyle" : "-", "linestyle" : "--",
                         "linewidth" : 3, "shrinkA": 0, "shrinkB": 0})
plt.ylim(-0.5,0.5)
plt.show()

在此处输入图像描述

目前不可能使两种帽子样式都“对接”。原因是注释的行是Patch没有这个属性的。当然,任何带有线条的注释都可以被 aplot和 a模仿text,因此如果需要,则需要使用解决方法。


推荐阅读