繁体   English   中英

基于边缘宽度的matplotlib图例

[英]matplotlib legend based on edge width

我有以下网络:

在此处输入图片说明

我想基于边缘宽度创建图例。 类似于以下内容(数字不准确):

在此处输入图片说明

我已经通过颜色图轻松为节点颜色创建了图例,但是基于宽度的图例更成问题。

我是否应该创建一个新的子图并自己绘制线条和宽度? 使用这种方法,我发现它非常复杂,因为要处理一些边缘情况,并要进行一些粗略的假设,例如要绘制的线数(尽管我猜可以假定有8〜10 +条线不同的宽度)。

因此,我只写了一个简单的示例,其中包含节点颜色的图例,还有一个非常简单的基本启动器,用于检查宽度图例。

import networkx as nx
import matplotlib.pyplot as plt

plt.subplot(1, 2, 1)
graph = nx.Graph()
graph.add_edge('a','b',weight=6)
graph.add_edge('a','c',weight=2)
graph.add_edge('c','d',weight=1)
graph.add_edge('c','e',weight=7)
graph.add_edge('c','f',weight=9)
graph.add_edge('a','d',weight=3)
edges = graph.edges()
edges_weight_list = [graph[u][v]['weight'] for u,v in edges]
n_nodes = graph.number_of_nodes()
pos = nx.spring_layout(graph)
nx.draw_networkx_edges(graph, pos, width = edges_weight_list)
nx.draw_networkx_labels(graph, pos)
mcp = nx.draw_networkx_nodes(graph, pos,
                             node_color=list(range(n_nodes)),
                             cmap='Blues')
limits = plt.axis('off')  # turn of axis


# width lines
plt.subplot(1, 2, 2)
edges_weight_list = sorted(edges_weight_list)
for i, current_weight in enumerate(edges_weight_list):
    x=[0, 1]
    y=[i, i]
    plt.plot(x,y, linewidth=current_weight, color='black')

plt.colorbar(mcp)
limits = plt.axis('off')  # turn of axis
plt.show()

此图:

在此处输入图片说明

(显然,在现实生活中,我不会遍历所有行)。

我正在使用Python 3.6,networkx 2.2,matplotlib 2.2.2。

最终,而不是绘制线条,然后手动添加文本-我创建了带有标签和宽度的空Line2D列表-并为其创建了图例。

from matplotlib.lines import Line2D

lines = []
edges_weight_list = sorted(edges_weight_list)
for i, width in enumerate(edges_weight_list):
    lines.append(Line2D([],[], linewidth=width, color='black'))

legend2 = plt.legend(lines, edges_weight_list, bbox_to_anchor=(0, 0.5), frameon=False) 

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM