图和注释中的线型在matplotlib中

时间:2018-08-08 12:10:19

标签: python matplotlib julia

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

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)

结果:

enter image description here

  • annotate对象的黑色虚线似乎以某种方式变圆了
  • plot曲线的蓝色虚线带有尖锐的边缘

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

有人知道如何通过plotannotate创建完全相等的线型吗?

我需要这两条线在出版物中的两张图中具有完全相同的图案。

3 个答案:

答案 0 :(得分:1)

我也可以重现该问题。一种解决方法是使用hlines。在hlines中使用与plot相同的线型会产生完全相同的结果:

请注意,我仅在Python中对此进行了测试。

import matplotlib.pyplot as plt

plt.plot([0,1],[-0.05,-0.05],linestyle="--",linewidth=4)

plt.annotate("", xy=(1,0.05), xytext=(0,0.05), xycoords="data",
             arrowprops={"arrowstyle":"-", "linestyle":"--", "linewidth":4})

plt.hlines(0.15, 0,1, linestyles="--", linewidth=4)

plt.ylim(-0.5,0.5)
plt.show()

enter image description here

答案 1 :(得分:1)

有两个问题。 (请注意,我在这里使用的是python语法,因为我对Julia的经验很少)

使行等长。

默认情况下,annotate使用两端都为缩短线的行,这在通常情况下很有用,在这种情况下,您想注释某些东西,而不希望该行与要注释的对象或注释文本重叠。为了确保该行没有收缩,可以使用shrinkAshrinkB属性:

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

使线条样式相同。

默认情况下,由Line2D创建的plot具有“对接” 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()

enter image description here

目前无法同时将两种样式都“对接”。原因是注释的行是不具有此属性的Patch。当然,任何带有一行的注释都可以用plottext来模仿,因此,如果需要,则需要使用一种解决方法。

答案 2 :(得分:0)

@ImportanceOfBeingErnest:我可以忍受舍入而不是“对接”的破折号。您的建议肯定解决了我的问题。将您的Python代码转换为Julia时,它显示为:

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

这正是我所需要的。

enter image description here