python - matplotlib 中 plot 和 annotate 中的 Linestyle 不相等
问题描述
我在 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
and创建精确相等的线条图案annotate
?
对于出版物中的几个图表,我需要两条线具有完全相同的模式。
解决方案
有两个问题。(请注意,我在这里使用 python 语法,因为我对 Julia 没有什么经验)
使线条等长。
默认情况下,annotate 使用两端缩短的线条,这在您想要注释某些内容并且不希望线条与要注释的对象或注释文本重叠的通常情况下很有用。为确保该行不收缩,您可以使用shrinkA
andshrinkB
属性:
arrowprops={"arrowstyle" : "-", "linestyle" : "--",
"shrinkA": 0, "shrinkB": 0}
使线条样式相同。
默认情况下,Line2D
created 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
,因此如果需要,则需要使用解决方法。
推荐阅读
- aws-documentdb-mongoapi - AWS DocumentDB:实例 writeIOPS 和集群 volumeWriteIOPS 有什么区别,为什么 volumeWriteIOPS 是 writeIOPS 的 100 倍?
- swift - 如何在 Swift 中编写宏
- python - 使用python放大图像后如何平滑锯齿状边缘
- javascript - 使用 javascript JSON(而不是 ajax 请求)表征 HTML 页面
- mongodb - 按模型的 ObjectId 类型字段过滤,在猫鼬节点 js 中返回不正确的结果
- python - 在 2 个巨大的列表之间使用 Multiprocess 查找更改
- python - 如何将 API 密钥存储在环境变量中?并在 google colab 中调用相同的
- azure-ad-b2c - B2C 自定义策略 - 将登录错误重定向回应用
- java - 为什么我的操作不允许?
- mysql - Mysql表中有多少重复记录