简体   繁体   English

在 Python 中生成具有平行标记边/顶点的有向图

[英]Generating Directed Graph With Parallel Labelled Edges/Vertices in Python

What is the best way to generate a Directed Graph With Parallel Labelled Edges/Vertices in Python like the one in the Image below??在 Python 中生成具有平行标记边/顶点的有向图(如下图所示)的最佳方法是什么?

I have already tried networkx but it does not work with parallel edges.我已经尝试过 networkx 但它不适用于平行边。

在此处输入图片说明

This is the code I'm using to generate the data for the Graph.这是我用来生成图表数据的代码。

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

You can use the dataframe to read the edges directly into a NetworkX graph using from_pandas_adjacency .您可以使用数据使用from_pandas_adjacency将边直接读入 NetworkX 图中。 In order to do that, lets set the index of the dataframe equal to chosen_currencies , to ensure that the edges are mapped correctly.为了做到这一点,让我们将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

Now set the index现在设置索引

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

Now let's create the graph现在让我们创建图表

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()

货币图表

Note: The number near the arrowhead is the edge weight.注意:箭头附近的数字是边缘权重。

You can also view this Google Colab Notebook with above working example.您还可以使用上述工作示例查看此 Google Colab Notebook

You can adjust the font size, label position, etc. according to your requirements.您可以根据自己的要求调整字体大小、标签位置等。

References:参考:

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

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