gpt4 book ai didi

python - 如何相对于质心径向填充 matplotlib 文本对象? (Python)

转载 作者:行者123 更新时间:2023-12-04 07:42:40 24 4
gpt4 key购买 nike

我正在尝试扩展我的 networkx相对于我计算的质心,节点半径之外的标签。例如,如果我们围绕集群 {34, 5, 33} 画一个圆圈我们基本上会在每个节点和质心之间画一条线,然后沿着该向量添加 radial_pad到它所以它有点宽。我这样做的原因是因为我在我的实际节点中添加了饼图,我一生都无法弄清楚如何让 zorder 工作以显示标签(我已将 zorder 设置为高数字,计算最大 zorder,手动添加文本对象等)。下一个最好的事情是将节点标签移到节点之外。
在与极坐标之间转换和从极坐标转换并偏移质心而不是它在原点的那一刻,几何图形有点超出我的头脑。

import matplotliob.pyplot as plt
import pandas as pd
import networkx as nx
import numpy as np

edge_data = [(9, 24, {'weight': 262.65595290640806}), (34, 5, {'weight': 143.01364809653174}), (34, 33, {'weight': 51.394542826823496}), (7, 14, {'weight': 389.22142801036125}), (0, 25, {'weight': 486.6995764468493}), (0, 30, {'weight': 233.1311348728954}), (0, 13, {'weight': 730.2831849050106}), (25, 30, {'weight': 87.14652833884263}), (25, 13, {'weight': 195.41994950707715}), (13, 30, {'weight': 131.22242872081216}), (33, 5, {'weight': 113.96755067449318}), (21, 35, {'weight': 100.30461510188701}), (21, 12, {'weight': 185.51533865658521}), (12, 35, {'weight': 106.65748950363549})]
graph = nx.Graph(edge_data)
pos = nx.nx_agraph.graphviz_layout(graph,prog="neato")

radial_pad = 1
with plt.style.context("seaborn-white"):
fig, ax = plt.subplots(figsize=(5,5))
nx.draw_networkx_nodes(graph, pos, ax=ax, node_size=500, node_color="white", edgecolors="black")
nx.draw_networkx_edges(graph, pos, ax=ax)
nx.draw_networkx_labels(graph, pos, ax=ax)
for community in nx.connected_components(graph):
centroid = np.stack(pd.Series(pos)[list(community)].map(list)).mean(axis=0)
ax.scatter(*centroid, c="black")
for node in community:
x, y = pos[node]
# How do I pad them with respect to the centroid?
enter image description here
这是我正在尝试做的一个非常粗略的例子:
enter image description here
  • 红色是我想移动标签的地方
  • 蓝色是当前节点标签和质心之间的半径
  • 绿色是radius_pad我们添加的值以增加标签结束位置的半径

  • 请注意,我不是要添加颜色,但我认为它只会在视觉上有所帮助。

    最佳答案

    首先计算从质心到节点的向量:

    delta = pos[node] - centroid
    然后转换为单位向量:
    unit_vector = delta / np.linalg.norm(delta)
    最后,计算单位向量方向的偏移量,保存结果,并在新位置绘制标签:
    label_pos = dict()
    label_pos[node] = pos[node] + 0.05 * unit_vector
    ...
    nx.draw_networkx_labels(graph, label_pos, ax=ax)

    关于python - 如何相对于质心径向填充 matplotlib 文本对象? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67378132/

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