我用matplotlib绘制由networkx创建的图。现在,我想向带有圆圈的特定节点添加注释。例如,
我将 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)
)
我得到了这张丑陋的图表,
我有两个问题:
6
画一个圆,如第一个图所示。 xytext
的值。有没有更好的办法? 最佳答案
如果您使用fancyarrow中演示的annotation_demo2 arrowprops
语法,则有一个shrinkA
和shrinkB
选项,可让您以点为单位分别缩小箭头尾部(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_rad
和1.2
的值,直到获得所需的内容。3)我使用了“花式”语法,该语法在字符串中而不是在dict中定义了多个箭头属性。据我所知,如果您不使用花式箭头语法,则
shrinkB
选项不可用。4)我使用了
textcoords='offset points'
,以便可以指定文本相对于该点的位置,而不是轴上的绝对位置。