Matplotlib 注释详细文档

2 投票
2 回答
749 浏览
提问于 2025-04-18 02:03

抱歉,我真的很努力想在文档中找到以下内容:

在plt.annotate中,armA、armB、angleA和angleB分别是什么意思?比如在:

ax.annotate('arc', xy=(1.5, -1),  xycoords='data',
            xytext=(-40, -30), textcoords='offset points',
            arrowprops=dict(arrowstyle="->", connectionstyle=
            "arc,angleA=0,armA=20,angleB=-90,armB=15,rad=7"),)

非常感谢!

2 个回答

0

在这些地方的文档信息非常少,而且没有地方定义角度angleA、angleB,和臂长armA、armB,所以这真的需要通过反复尝试来摸索。

我写了一个脚本,提供了单选按钮让你选择不同的连接样式,比如angle3arc3anglearc,然后又提供了滑块来输入angleAarmAangleBarmBrad。我发现每种连接样式只接受自己特定的参数,如果你比如给angle3提供一个半径(rad),或者给arc3提供一个angleA,就会出错。换句话说,你需要用这种if语句来确保只传递不同连接类型所期望的参数:

if connStyle == 'angle3':
    connstyle="angle3,angleA=%4.2f,angleB=%4.2f"%(angleA,angleB)
elif connStyle == 'arc3':
    connstyle="arc3,rad=%4.2f"%(radius)
elif connStyle == 'angle':
    connstyle="angle,angleA=%4.2f,angleB=%4.2f,rad=%4.2f"%(angleA,angleB,radius*10.)
elif connStyle == 'arc':
    connstyle="arc,angleA=%4.2f,angleB=%4.2f,armA=%4.2d,armB=%4.2f,rad=%4.2f"%(angleA,angleB,armA,armB,radius)

角度angleA和angleB似乎是以0度指向左边,90度指向下方的方式来定向的,也就是说,左边的逆时针方向是正角度,单位是度。但是在中心范围之外,曲线会表现得非常奇怪。

这里是整个脚本,你可以自己动手试试。这个东西几乎没有文档,而且有点奇怪。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

# Global variables
angleA = 90.0
armA = 1.0
angleB = 0.0
armB = 1.0
connStyle = 'angle3'
# connStyle = 'arc3'
# connStyle = 'angle'
# connStyle = 'arc'
radius=0.1


plt.close('all')
fig = plt.figure(figsize=(10,10))
ax = fig.add_axes([.25,.4,.7,.5])
plt.axis([0, 10, 0, 10])

axcolor = 'w'
axAngleA = plt.axes([0.25, 0.25,   0.65, 0.03],  axisbg=axcolor)
axArmA   = plt.axes([0.25, 0.2,  0.65, 0.03],  axisbg=axcolor)
axAngleB = plt.axes([0.25, 0.15,   0.65, 0.03],  axisbg=axcolor)
axArmB   = plt.axes([0.25, 0.1,  0.65, 0.03],  axisbg=axcolor)
axRadius = plt.axes([0.25, 0.05,  0.65, 0.03],  axisbg=axcolor)

SlAngleA = Slider(axAngleA, 'AngleA', -180.0, 180.0, valinit=angleA)
SlArmA   = Slider(axArmA,   'ArmA', -10., 10., valinit=armA)
SlAngleB = Slider(axAngleB, 'AngleB', -180.0, 180.0, valinit=angleB)
SlArmB   = Slider(axArmB,   'ArmB', -10., 10., valinit=armB)
SlRadius = Slider(axRadius, 'Rad', -10., 10., valinit=radius)

# Display function
def display(connstyle):
    ax.cla()
    plt.annotate("ArrowTest",
                 xytext=(8, 8),
                 xy=(2,2),
                 arrowprops=dict(arrowstyle="->",
                                 connectionstyle=connstyle))

    # plt.show()
    fig.canvas.draw_idle()


# Update function
def update(val):
    global angleA, angleB, armA, armB, connStyle, radius
    angleA = SlAngleA.val
    armA   = SlArmA.val
    angleB = SlAngleB.val
    armB   = SlArmB.val
    radius = SlRadius.val

    if connStyle == 'angle3':
        connstyle="angle3,angleA=%4.2f,angleB=%4.2f"%(angleA,angleB)
    elif connStyle == 'arc3':
        connstyle="arc3,rad=%4.2f"%(radius)
    elif connStyle == 'angle':
        connstyle="angle,angleA=%4.2f,angleB=%4.2f,rad=%4.2f"%(angleA,angleB,radius*10.)
    elif connStyle == 'arc':
        connstyle="arc,angleA=%4.2f,angleB=%4.2f,armA=%4.2d,armB=%4.2f,rad=%4.2f"%(angleA,angleB,armA,armB,radius)

    # print 'connstyle = "%s"'%connstyle    

    display(connstyle)

SlAngleA.on_changed(update)
SlArmA.on_changed(update)
SlAngleB.on_changed(update)
SlArmB.on_changed(update)
SlRadius.on_changed(update)

resetax = plt.axes([0.8, 0.005, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')
def reset(event):
    SlangleA.reset()
    SlangleB.reset()
    SlRad.reset()
    ax.cla()
button.on_clicked(reset)

rax = plt.axes([0.025, 0.5, 0.15, 0.15], axisbg=axcolor)
radio = RadioButtons(rax, ('angle3', 'arc3', 'angle', 'arc'), active=0)
def connstylefunc(label):
    global connStyle
    connStyle = label
    # print "Switch connstyle to %s"%connStyle
    display(connStyle)
    fig.canvas.draw_idle()
radio.on_clicked(connstylefunc)

# Plot first time
plt.sca(ax)
display("angle3,angleA=%4.2f,angleB=%4.2f"%(angleA,angleB))

plt.show()
figmgr=plt.get_current_fig_manager()
figmgr.canvas.manager.window.raise_()
geom=figmgr.window.geometry()
x,y,dx,dy=geom.getRect()
figmgr.window.setGeometry(10,10,dx,dy)

我有一个脚本运行的截图,但我想我没有足够的声望分数来发布它。

2

这些参数是用来初始化 ConnectionStyle.Arc 类的。你可以在这里看到更详细的信息。

类 ConnectionStyle.Arc(angleA=0, angleB=0, armA=None, armB=None, rad=0.0)

基类:matplotlib.patches._Base

这个类创建了一条在两个点之间的分段连续的二次贝塞尔曲线。这个路径可以有两个经过的点,一个是从点 A 开始,距离 armA 的长度和 angleA 的角度;另一个是相对于点 B 的点。边缘会用 rad 参数进行圆角处理。

angleA:路径的起始角度

angleB:路径的结束角度

armA:起始臂的长度

armB:结束臂的长度

rad:边缘的圆角半径

connect(posA, posB)

撰写回答