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

标签 python matplotlib plot geometry networkx

我正在尝试将我的 networkx 标签相对于我计算的质心扩展到节点半径之外。例如,如果我们围绕集群 {34, 5, 33} 画一个圆,我们实际上会在每个节点和质心之间画一条线,然后沿着该向量添加 radial_pad code> 到它,所以它有点宽。我这样做的原因是因为我在实际节点中添加饼图,但我一生都无法弄清楚如何让 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/

相关文章:

python - 字符串列表转换为浮点Python

python - PyPlot 将替代 y 轴移动到背景

python - matplotlib/seaborn 热图使用带有日期时间索引的 pandas 数据框

python - Matplotlib:编写从右到左的文本(希伯来语、阿拉伯语等)

python - Scrapy 在恢复之前做一些事情

python - 缩进的 block 错误Python

c# - 在 C# 中使用 R 中的绘图

r - 我需要 ggplot scale_x_log10() 给我负数和正数作为输出

python - 如何正确将从示波器中提取的数据绘制为 .csv 文件

python - tkinter:运行时错误:线程只能启动一次