matplotlib 中正确的突变比例值

rod*_*dor 3 python matplotlib python-3.x

mutational_scale我想知道关键论点的目的matplotlibmatplotlib.patches.FancyArrowPatch在用于绘制箭头的情况下,默认mutational_scale设置为。1来自文档:

标量,可选(默认值:1)

将缩放 arrowstyle 属性(例如 head_length)的值。

当我在两个大小为 300 的散点之间绘制箭头时,如下所示:

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((0,0), (1,1), arrowstyle='-|>')
plt.show()
Run Code Online (Sandbox Code Playgroud)

箭头是不可见的。

在此输入图像描述

但是,当我使用:

arrow = mpl.patches.FancyArrowPatch((0,0), (1,1), arrowstyle='-|>', mutational_aspect=20)
Run Code Online (Sandbox Code Playgroud)

我得到了正确的箭头。 在此输入图像描述

我的猜测是,整个数字按大于 1 的系数缩放,接近 20,使得箭头在突变比例为 1 时不可见,但在使用 20 时可见。但这只是一个猜测。

如果是这样,有没有办法知道整个图形的突变缩放来决定箭头的适当缩放值?

Imp*_*est 5

在文档中的“用箭头注释”小节中,arrowstyle介绍了参数。对于-|>它所说的风格

-|>头长=0.4,头宽=0.2

这意味着箭头的头部0.4*mutation_scale又长又2*0.2*mutation_scale宽。单位是点。

由于FancyArrowPatches 被设计为与注释一起使用,因此在绘制注释时,突变比例将设置为以点为单位的字体大小。例如,对于 15 pt 字体大小,mutation_scale=15.

FancyArrowPatch当单独使用时,请设置所需的大小(以磅为单位)

arrow = mpl.patches.FancyArrowPatch((0,1), (1,1), arrowstyle='-|>', mutation_scale=15)
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有完整箭头宽度2*0.2*15=6点的箭头。

import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots(dpi=100)
ax.set_xlim([-0.6,5])
for i in [5,10,15,20,25]:
    ax.scatter([0,1],[i,i], s=(2*.2*i)**2)
    arrow = mpl.patches.FancyArrowPatch((0,i), (1,i), arrowstyle='-|>',
                                        mutation_scale=i)
    ax.add_patch(arrow)
    ax.text(1.2,i,"mutation_scale = {}".format(i), 
            va="center")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者,您可以直接以点为单位指定 head_length 和 head_width,

arrow = mpl.patches.FancyArrowPatch((0,1), (1,1),
                    arrowstyle='-|>,head_width=3,head_length=6')
Run Code Online (Sandbox Code Playgroud)

因此,以下将产生与上面相同的图像:

import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots(dpi=100)
ax.set_xlim([-0.6,5])
for i in [5,10,15,20,25]:
    ax.scatter([0,1],[i,i], s=(2*.2*i)**2)
    arrow = mpl.patches.FancyArrowPatch((0,i), (1,i), 
                        arrowstyle='-|>,head_width={},head_length={}'.format(i/5.,.4*i))
    ax.add_patch(arrow)
    ax.text(1.2,i,"mutation_scale = {}".format(i), 
            va="center")
plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 0.2是箭头的半宽,所以箭头头是2*0.2宽。 (2认同)