请给出完整的网络拓扑图改进代码
时间: 2024-10-09 13:03:14 浏览: 24
上位机程序设计-改进的网络拓扑图.pptx
以下是改进后的完整网络拓扑图代码,包括了节点标签的定制、字体设置以及节点形状的更改。同时,我还添加了一个简单的缩进处理来提高代码可读性。
```python
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from itertools import chain
# 定义美化标签函数
def customize_label(node):
port_info = node.split(',')
if len(port_info) > 1: # 如果包含城市和国家信息
city = port_info[0][:5].strip() # 城市名最多显示5个字符
country = ", ".join(port_info[1:]) if len(port_info) > 2 else ""
label = f"{city}{country}"
else:
label = node[:5] # 没有详细信息,仅显示前5个字符
return label
# 读取CSV文件并处理
def read_routes_from_csv(file_path):
try:
df = pd.read_csv(file_path, header=None, names=['航线编号', '出发港', '挂靠港', '目的港'], encoding='utf-8')
except Exception as e:
print(f"解码错误: {e}")
return None
# 简单地处理可能出现的连续逗号导致的空值
df["挂靠港"] = df["挂靠港"].replace(r'\s*,\s*', ',', regex=True).astype(str)
return df
# 创建网络拓扑图
def create_network(df):
G = nx.Graph()
for index, row in df.iterrows():
start_port = customize_label(row["出发港"])
intermediate_ports = [customize_label(port) for port in row["挂靠港"].split(",")] if pd.notna(row["挂靠港"]) else []
end_port = customize_label(row["目的港"])
# 添加起始港到第一个挂靠港的边
if intermediate_ports:
first_intermediate = intermediate_ports[0]
G.add_edge(start_port, first_intermediate)
# 添加相邻挂靠港之间的边
for i in range(len(intermediate_ports) - 1):
port_a = intermediate_ports[i]
port_b = intermediate_ports[i + 1]
G.add_edge(port_a, port_b)
# 添加最后一个挂靠港到目的港的边
last_intermediate = intermediate_ports[-1]
G.add_edge(last_intermediate, end_port)
else:
# 如果没有挂靠港,则直接添加起始港到目的港的边
G.add_edge(start_port, end_port)
return G
# 可视化网络
def visualize_network(G):
plt.figure(figsize=(15, 10))
pos = nx.spring_layout(G) # 使用spring布局算法
node_font_size = 8
node_shape = 'o'
labels = {node: customize_label(node) for node in G.nodes()}
nx.draw(G, pos, with_labels=True, font_size=node_font_size, font_weight='bold',
node_color='lightblue', edge_color='gray', node_shape=node_shape, node_size=300)
nx.draw_networkx_labels(G, pos, labels, font_size=node_font_size - 2, font_color='black')
plt.title('海运网络拓扑图', fontsize=12)
plt.grid(True, linestyle=':', color='gray', alpha=0.5)
plt.show()
# 主函数
def main():
file_path = "your_file_path.csv" # 将此替换为实际的CSV文件路径
df = read_routes_from_csv(file_path)
if df is not None:
G = create_network(df)
visualize_network(G)
else:
print("读取CSV文件失败")
if __name__ == "__main__":
main()
```
在这个版本中,我增加了对端点标签的处理,使得城市和国家信息可以一起展示,而且节点的颜色和形状也有所调整。如果你有更多关于如何进一步优化或自定义的疑问,欢迎提问。
阅读全文