我在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)
结果:
annotate
对象的黑色虚线似乎以某种方式变圆了plot
曲线的蓝色虚线带有尖锐的边缘很奇怪,即使指定的水平坐标相同,两条线在图形中似乎也没有相同的水平起点和终点。对我来说,这不是什么大问题,但也可能与我的线条样式问题有关。
有人知道如何通过plot
和annotate
创建完全相等的线型吗?
我需要这两条线在出版物中的两张图中具有完全相同的图案。
答案 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()
答案 1 :(得分:1)
有两个问题。 (请注意,我在这里使用的是python语法,因为我对Julia的经验很少)
使行等长。
默认情况下,annotate使用两端都为缩短线的行,这在通常情况下很有用,在这种情况下,您想注释某些东西,而不希望该行与要注释的对象或注释文本重叠。为了确保该行没有收缩,可以使用shrinkA
和shrinkB
属性:
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()
目前无法同时将两种样式都“对接”。原因是注释的行是不具有此属性的Patch
。当然,任何带有一行的注释都可以用plot
和text
来模仿,因此,如果需要,则需要使用一种解决方法。
答案 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)
这正是我所需要的。