Генерация ориентированного графа с параллельными помеченными ребрами / вершинами в Python - PullRequest
2 голосов
/ 17 февраля 2020

Каков наилучший способ создания ориентированного графа с параллельными помеченными краями / вершинами в Python, как показано на рисунке ниже?

Я уже пробовал networkx, но он не работает с параллельным ребра.

enter image description here

Этот код я использую для генерации данных для графика.

from forex_python.converter import CurrencyRates
import pandas as pd

chosen_currencies = ['GBP', 'EUR', 'USD']

c = CurrencyRates()

rates = []


for currency_index in range(len(chosen_currencies)):
    temp_list = []
    for second_index in range(len(chosen_currencies)):
        temp_list.append(c.get_rate(chosen_currencies[currency_index], chosen_currencies[second_index]))
    rates.append(temp_list)

df = (pd.DataFrame.from_records(rates)).transpose()
df.columns = chosen_currencies

1 Ответ

2 голосов
/ 18 февраля 2020

Вы можете использовать фрейм данных для считывания ребер непосредственно в график NetworkX, используя from_pandas_adjacency . Чтобы сделать это, давайте установим индекс dataframe равным chosen_currencies, чтобы обеспечить правильное отображение ребер.

from forex_python.converter import CurrencyRates
import pandas as pd

chosen_currencies = ['GBP', 'EUR', 'USD']

c = CurrencyRates()

rates = []


for currency_index in range(len(chosen_currencies)):
    temp_list = []
    for second_index in range(len(chosen_currencies)):
        temp_list.append(c.get_rate(chosen_currencies[currency_index], chosen_currencies[second_index]))
    rates.append(temp_list)

df = (pd.DataFrame.from_records(rates)).transpose()
df.columns = chosen_currencies
#   GBP         EUR     USD
#0  1.000000    0.83238 0.768233
#1  1.201374    1.00000 0.922935
#2  1.301689    1.08350 1.000000

Теперь установите индекс

df.set_index([pd.Index(chosen_currencies)], inplace=True)
#       GBP         EUR     USD
#GBP    1.000000    0.83238 0.768233
#EUR    1.201374    1.00000 0.922935
#USD    1.301689    1.08350 1.000000

Теперь давайте создадим график

import networkx as nx
import matplotlib.pyplot as plt

G = nx.from_pandas_adjacency(df, create_using=nx.DiGraph)

# Set the figure size
plt.figure(figsize=(8,8))

# Get the edge labels and round them to 3 decimal places
# for more clarity while drawing
edge_labels = dict([((u,v), round(d['weight'], 3))
             for u,v,d in G.edges(data=True)])

# Get the layout
pos = nx.spring_layout(G)

# Draw edge labels and graph
nx.draw_networkx_edge_labels(G,pos,edge_labels=edge_labels,
                             label_pos=0.15, font_size=10)
nx.draw(G, pos, with_labels=True,
        connectionstyle='arc3, rad = 0.15',
        node_size=800)

plt.show()

Currency Graph

Примечание: Число рядом со стрелкой - это вес ребра.

Вы также можете просмотреть этот Google Colab Notebook с приведенным выше рабочим примером.

Вы можете настроить размер шрифта, положение этикетки и т. Д. c. в соответствии с вашими требованиями.

Справочные материалы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...