Python networkx从dataframe打印,线宽取决于列值

Python networkx从dataframe打印,线宽取决于列值,python,plot,label,networkx,Python,Plot,Label,Networkx,我正在研究不同机场之间的航线表示,并希望使用networkx绘图来表示它们 输入数据是一个数据帧,例如: from, to, airline, trip_number Paris, New York, Air France, AF001 Paris, Munich, Air France, AF002 Paris, New York, Air France, AF003 Toronto, Paris, Air Canada, AC001 Toronto, Munich, Air Canada,

我正在研究不同机场之间的航线表示,并希望使用networkx绘图来表示它们

输入数据是一个数据帧,例如:

from, to, airline, trip_number
Paris, New York, Air France, AF001
Paris, Munich, Air France, AF002
Paris, New York, Air France, AF003
Toronto, Paris, Air Canada, AC001
Toronto, Munich, Air Canada, AC002
Munich, New York, Lufthansa, LF001
Franfort, Los Angeles, Lufthansa, LF002
Francfort, Paris, Lufthansa, LF003
Paris, Francfort, Lufthansa, LF004
Paris, Francfort, Air France, AF004
Paris, Francfort, Air Berlin, AB001
我设法获得网络表示,但缺少两项:

  • 每个节点的标签
  • 当行程数增加时,增加连接线的尺寸(例如:多伦多-巴黎小,有1次行程;巴黎-弗朗克福特宽,有3次行程)
当前最小代码,df为数据帧:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from nxviz.plots import CircosPlot

G = nx.from_pandas_edgelist(df, 'from', 'to')
nx.draw(G, node_size=5, node_color='red')
plt.show()

感谢您的帮助

以下人员应完成此项工作:

import pandas as pd
from io import StringIO
import networkx as nx
import matplotlib.pyplot as plt

data = ('from, to, airline, trip_number\n'
        'Paris, New York, Air France, AF001\n'
        'Paris, Munich, Air France, AF002\n'
        'Paris, New York, Air France, AF003\n'
        'Toronto, Paris, Air Canada, AC001\n'
        'Toronto, Munich, Air Canada, AC002\n'
        'Munich, New York, Lufthansa, LF001\n'
        'Franfort, Los Angeles, Lufthansa, LF002\n'
        'Francfort, Paris, Lufthansa, LF003\n'
        'Paris, Francfort, Lufthansa, LF004\n'
        'Paris, Francfort, Air France, AF004\n'
        'Paris, Francfort, Air Berlin, AB001')

df = pd.read_csv(StringIO(data), sep=", ")

# see https://stackoverflow.com/a/10374456
short_df = pd.DataFrame({'count': df.groupby(["from", "to"]).size()}).reset_index()

G = nx.from_pandas_edgelist(short_df, source='from', target='to', edge_attr="count")

# edge size, see https://stackoverflow.com/a/25651827
weights = [G[u][v]['count'] for u,v in G.edges()]

nx.draw(G, node_size=5, node_color='red', with_labels=True, width=weights)
plt.show()
解释 首先,您需要检索航班的计数,这很容易做到。使用from的答案,我创建了一个只有三列的新数据框(“from”、“to”、“count”)。之后,您需要在创建图形时包含edge属性,即添加
edge_attr=“count”
。然后,我跟随控制边缘宽度


最后,将标签添加到绘图中是
绘图中的
参数with_labels=True
。您可以使用的所有参数。

非常感谢!