Python 打印和注释中的线型在matplotlib中不相等
我在Julia中使用PyPlot,它基本上依赖于matplotlib。但是,我怀疑Python中的问题是相同的:当我使用相同的Python 打印和注释中的线型在matplotlib中不相等,python,matplotlib,julia,Python,Matplotlib,Julia,我在Julia中使用PyPlot,它基本上依赖于matplotlib。但是,我怀疑Python中的问题是相同的:当我使用相同的linestyle属性plot一行和annotation箭头(无头)时,我希望这两个对象具有相同的线样式。但情况显然并非如此: using PyPlot plot([0,1],[-0.05,-0.05],linestyle="--",linewidth=1) annotate("",xy=(1,0.05),xytext=(0,0.05),xycoords="data",
linestyle
属性plot
一行和annotation
箭头(无头)时,我希望这两个对象具有相同的线样式。但情况显然并非如此:
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)
结果:
对象的黑色虚线以某种方式显示为圆形注释
曲线的蓝色虚线显示为锐边绘图
plot
和annotate
创建精确的等高线图案吗
我需要这两条线对于出版物中的两个图具有完全相同的模式 我也可以重现这个问题。一个解决方法可能是使用。在
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()
有两个问题。(请注意,我在这里使用python语法,因为我对Julia几乎没有经验)
使线条同样长。
默认情况下,“注释”使用两端较短的线条,这在通常情况下非常有用,在这种情况下,您希望注释某些内容,而不希望线条与要注释的对象或注释文本重叠。为确保行未收缩,您可以使用shrinkA
和shrinkB
属性:
arrowprops={"arrowstyle" : "-", "linestyle" : "--",
"shrinkA": 0, "shrinkB": 0}
使线条的样式相同。
默认情况下,plot
创建的Line2D
具有“对接”,而注释线具有圆角样式
为这两个设置“圆形”capstyle相对容易。对于绘图
,使用dash\u capstyle=“round”
选项:
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()
目前不可能使两种capstyles“对接”。原因是注释的行是一个
补丁
,它没有此属性。当然,任何带有线条的注释都可以用绘图
和文本
模拟,因此如果需要,需要使用变通方法。@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)
这正是我需要的