为此,您需要将节点位置设置为属性,并使用占位符作为节点名称。因此,一种方法可能是按节点出现的顺序仅enumerate 节点,并遵循与您相同的逻辑,但将压缩坐标元素添加为pos 属性:
x = [4.5 , 420, 67, 620, 68]
y = [6.7, 68, 56, 231, 380]
G = nx.DiGraph()
coords = list(zip(x,y))
for node, coo in enumerate(coords, start=1):
G.add_node(node, pos=coo)
if node<len(coords):
G.add_edge(node, node+1)
然后您可以创建一个字典为node:(x,y),这是nx.draw 中的pos 所期望的格式,并且节点以这种方式位于指定坐标上:
nodes = G.nodes(data=True)
pos = {node:attr['pos'] for node, attr in nodes}
plt.figure(figsize=(12,5))
nx.draw(G,
nodelist=nodelist,
pos=pos,
node_size=500,
node_color='orange')
为了在现有图像上重叠图表,您必须确保它们共享相同的extent。这很好解释here:
多张图片叠加时,图片需要相同
程度。这并不意味着它们需要具有相同的形状,而是
他们都需要渲染到相同的坐标系,由
xmin, xmax, ymin, ymax
为此,您可以在一定程度上对图形坐标和图像强制执行。该值将取决于图像大小,因此您必须将图形和图像的范围调整为图像的实际大小。我将使用来自klearn.datasets.load_sample_image 的示例图像作为示例,但对于您自己的图像,您可以使用matplotlib.image.imread('my_image.jpg') 加载它。
from sklearn.datasets import load_sample_image
img = load_sample_image('flower.jpg')
x = [4.5 , 420, 67, 620, 68]
y = [6.7, 68, 56, 231, 380]
y_lim, x_lim = img.shape[:-1]
extent = 0, x_lim, 0, y_lim
G = nx.DiGraph()
coords = list(zip(x,y))
for node, coo in enumerate(coords, start=1):
G.add_node(node, pos=coo)
if node<len(coords):
G.add_edge(node, node+1)
fig = plt.figure(frameon=False, figsize=(10,19))
plt.imshow(img, extent=extent, interpolation='nearest')
nodes = G.nodes(data=True)
pos = {node:attr['pos'] for node, attr in nodes}
nx.draw(G,
nodelist=nodelist,
pos=pos,
node_size=200,
edge_color='w',
width=4,
extent=extent,
node_color='orange',
interpolation='nearest')
plt.show()