легенда matplotlib на основе ширины кромки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая сеть:

enter image description here

Я хочу создать легенду на основе ширины кромки.Подобно следующему (числа не точны):

enter image description here

Я легко создал легенду для цветов узла с помощью цветовых карт, но легенду на основе ширины,более проблематично.

Должен ли я просто создать новый подграф и самостоятельно построить линии и ширину?Используя этот метод, я нахожу его очень сложным, потому что есть некоторые крайние случаи, о которых нужно позаботиться, и некоторые грубые предположения, такие как количество линий для построения (хотя я предполагаю, что можно предположить, что есть 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()

Это графики:

enter image description here

(Очевидно, в реальном примере я не буду повторять все строки).

I 'm с использованием Python 3.6, networkx 2.2, matplotlib 2.2.2.

1 Ответ

0 голосов
/ 26 октября 2018

В конечном итоге вместо того, чтобы рисовать линии, а затем добавить текст вручную - я создал список пустых 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) 

enter image description here

...