python - 来自数据框的 Python 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, 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()
解释
您首先需要检索航班数量,这pandas
很容易做到。有了这里的答案,我创建了一个只有三列(“from”、“to”、“count”)的新数据框。之后,您需要在创建图形时包含边缘属性,即 add edge_attr="count"
。然后,我按照这个答案来控制边缘宽度。
最后,将标签添加到图中with_labels=True
是draw
. 您可以使用 的所有参数draw_networkx
。
推荐阅读
- mysql - 错误:在 MySQL 中将 Varchar 值更新为 Datetime
- java - 内置的 HashTable 类可以显示上一个和下一个键吗?
- cookies - Cookie 未在浏览器上设置
- html - 将图像粘贴到 div 的底部 - 响应式图像问题(网格/填充)
- discord.js - 让 Rock、Paper、Scissors 在 discord.js 中通过反应工作
- c# - 将多个文本框中的值插入一列,但为每个文本框值创建一个新行
- video-streaming - raspberrypi 中的 AWS kinesis 视频流。无法创建 Kinesis 视频流
- python - 如何在 Django 中列出从答案模型到我的问题模型的所有答案?多对一的关系?
- javascript - 填写字段+活动复选框时,我们激活按钮
- firebase - Firestore RESTful API 查询仅返回 readTime 作为有效负载