Легенда непрерывной ширины участка, обозначающая вес ребра - PullRequest
1 голос
/ 10 февраля 2020

Я создаю сетевой график с пакетом networkx, ширина ребер которого находится в непрерывном масштабе (в данном примере это значение корреляции), что прекрасно работает. Но у меня возникли проблемы с созданием легенды для этого.

До того, как у меня было значение корреляции, отображаемое непрерывной серой картой цветов, и у меня была цветовая полоса в качестве легенды. Мой вопрос сейчас: есть ли возможность создать что-то вроде цветовой шкалы, но для ширины моих краев? Это должно выглядеть как длинный треугольник, я думаю.

1 Ответ

1 голос
/ 10 февраля 2020

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

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import networkx as nx

# Number of lines to include in legend
NUM_INTERVALS = 6

# Set up random graph with random weights
G = nx.Graph()
for i in range(50):
    G.add_edge(random.randint(1,10), random.randint(1,10), weight = random.uniform(0,8))
pos = nx.circular_layout(G)

# Get weights from graph
weights = [G[s][e]['weight'] for s, e in G.edges()]

# Get evenly distributed points over range of weights
lines = np.linspace(min(weights), max(weights), NUM_INTERVALS)

# Create lines from the weights
line2ds = [Line2D([],[], linewidth=width, color='black') for width in lines]

# Draw graph
nx.draw(G, pos, width=weights)

# Draw legend (rounding decimals to 2 places)
legend2 = plt.legend(line2ds, np.round(lines, decimals=2), bbox_to_anchor=(0, 1))

Вывод:

enter image description here

...