Python 与标记大小无关的指向标记边缘的箭头
这是朝着与相同的方向发展的 我想把一个箭头从一个分散点指向另一个分散点,这样箭头就位于标记边缘的旁边。如以下示例所示:Python 与标记大小无关的指向标记边缘的箭头,python,matplotlib,plot,Python,Matplotlib,Plot,这是朝着与相同的方向发展的 我想把一个箭头从一个分散点指向另一个分散点,这样箭头就位于标记边缘的旁边。如以下示例所示: import matplotlib.pyplot as plt import matplotlib as mpl fig, ax = plt.subplots() ax.scatter([0,1],[0,1], s=300) arrow = mpl.patches.FancyArrowPatch(posA=(0,0), posB=(1,1), arrowstyle='-|&g
import matplotlib.pyplot as plt
import matplotlib as mpl
fig, ax = plt.subplots()
ax.scatter([0,1],[0,1], s=300)
arrow = mpl.patches.FancyArrowPatch(posA=(0,0), posB=(1,1), arrowstyle='-|>', mutation_scale=20, shrinkA=7, shrinkB=7)
plt.show()
在这里,我手动选择了shrinkA
和shrinkB
的值,以便箭头非常靠近目标散射点的边缘。但是,如果更改标记的大小,则必须更改这些值
我的问题是:知道标记的大小(ax.scatter中的kwargs
),如何选择shrinkA
和shrinkB
,使箭头靠近标记的边缘
我知道s
是在p^2中测量的,其中p是一个印刷点。因此,标记的半径为sqrt(s/pi)
。如果shrinkA
和shrinkB
在相同的印刷点上测量,我们可以只做shrinkB=radius
,其中radius
是标记的半径
对于s==300,这是有意义的,因为半径接近9.8。
FancyArrowPatch
的shrinkA
/shrinkB
参数应以点为单位。点也是线宽或标记大小的单位。对于散点图,大小参数s
是标记大小的平方
因此,给定散点图的size
,s=size
,收缩
的计算方法是取平方根除以2(因为您希望将箭头收缩半径,而不是直径)
例如:
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
fig, ax = plt.subplots()
size = 1000
radius = math.sqrt(size)/2.
points = ax.scatter([0,1], [0,1], s=size)
arrow = mpl.patches.FancyArrowPatch(posA=(0,0), posB=(1,1),
arrowstyle='-|>', mutation_scale=20,
shrinkA=radius, shrinkB=radius)
ax.add_patch(arrow)
plt.show()
所以markersize是标记中最远的两个点之间的长度(在圆的情况下,是直径)?这对圆来说是正确的,是的。对于其他标记,例如,如果您使用
“$.$”
,则无法轻松确定。
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
fig, ax = plt.subplots()
size = 1000
radius = math.sqrt(size)/2.
points = ax.scatter([0,1], [0,1], s=size)
arrow = mpl.patches.FancyArrowPatch(posA=(0,0), posB=(1,1),
arrowstyle='-|>', mutation_scale=20,
shrinkA=radius, shrinkB=radius)
ax.add_patch(arrow)
plt.show()