[英]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.