gpt4 book ai didi

python - 如何在 matplotlib 中放置带注释的圆圈?

转载 作者:太空狗 更新时间:2023-10-29 21:33:48 25 4
gpt4 key购买 nike

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

enter image description here

我使用 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)
)

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

enter image description here

我有两个问题:

  • 如何围绕节点 6 绘制圆圈,如第一张图所示。
  • 为了获得漂亮的图形,我需要多次手动设置xytext 的值。有没有更好的方法?

最佳答案

如果您使用 fancyarrow arrowprops 语法,如 annotation_demo2 中所示, 有一个 shr​​inkAshr​​inkB 选项可以让你收缩你的箭头尾部 (shr​​inkA) 和尖端 (shr​​inkB ) 独立地,以点为单位。

这是一些任意设置代码:

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) 我使用了在字符串中而不是在字典中定义几个箭头属性的“奇特”语法。据我所知,如果您不使用花哨的箭头语法,则 shr​​inkB 选项不可用。

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

enter image description here

关于python - 如何在 matplotlib 中放置带注释的圆圈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com