我用matplotlib绘制由networkx创建的图。现在,我想向带有圆圈的特定节点添加注释。例如,

python - 如何在matplotlib中添加带注释的圆?-LMLPHP

我将 plt.annotate(*args, **kwargs) 与以下代码结合使用,

# add annotate text
pos = nx.get_node_attributes(G, 'pos')
pos_annotation_node = pos['Medici']
ax2.annotate('Midici',
            xy=pos_annotation_node,
            xytext=(i+0.2 for i in pos_annotation_node),
            color='blue',
            arrowprops=dict(facecolor='blue', shrink=0.01)
        )

我得到了这张丑陋的图表,

python - 如何在matplotlib中添加带注释的圆?-LMLPHP

我有两个问题:
  • 我如何围绕节点6画一个圆,如第一个图所示。
  • 要获得一个漂亮的外观,我需要多次手动设置xytext的值。有没有更好的办法?
  • 最佳答案

    如果您使用fancyarrow中演示的annotation_demo2 arrowprops语法,则有一个shrinkAshrinkB选项,可让您以点为单位分别缩小箭头尾部(shrinkA)和尖端(shrinkB)。

    这是一些任意的设置代码:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Some data:
    dat = np.array([[5, 3, 4, 4, 6],
                    [1, 5, 3, 2, 2]])
    
    # This is the point you want to point out
    point = dat[:, 2]
    
    # Make the figure
    plt.figure(1, figsize=(4, 4))
    plt.clf()
    ax = plt.gca()
    # Plot the data
    ax.plot(dat[0], dat[1], 'o', ms=10, color='r')
    ax.set_xlim([2, 8])
    ax.set_ylim([0, 6])
    

    这是在这些点之一周围画一个圆并绘制一个仅在尖端缩小的箭头的代码:
    circle_rad = 15  # This is the radius, in points
    ax.plot(point[0], point[1], 'o',
            ms=circle_rad * 2, mec='b', mfc='none', mew=2)
    ax.annotate('Midici', xy=point, xytext=(60, 60),
                textcoords='offset points',
                color='b', size='large',
                arrowprops=dict(
                    arrowstyle='simple,tail_width=0.3,head_width=0.8,head_length=0.8',
                    facecolor='b', shrinkB=circle_rad * 1.2)
    )
    

    注意这里:

    1)我已使用mfc='none'将圆的标记面颜色设为透明,并将圆的大小(直径)设置为半径的两倍。

    2)我将箭头缩小了圆半径的120%,以便它稍微偏离圆弧。显然,您可以使用circle_rad1.2的值,直到获得所需的内容。

    3)我使用了“花式”语法,该语法在字符串中而不是在dict中定义了多个箭头属性。据我所知,如果您不使用花式箭头语法,则shrinkB选项不可用。

    4)我使用了textcoords='offset points',以便可以指定文本相对于该点的位置,而不是轴上的绝对位置。

    python - 如何在matplotlib中添加带注释的圆?-LMLPHP

    10-05 22:49