如何基于两个DataFrame数据绘制带权重连线的散点图?
实现基于DataFrame的点连线可视化(按关联度调整线条粗细)
先准备所需库和示例数据:
import pandas as pd import matplotlib.pyplot as plt # 构造conn表 conn_data = { 'A': [1, 2, 5, 6], 'B': [3, 7, 20, 2], 'relevance': [0.7, 0.1, 2, 7] } conn = pd.DataFrame(conn_data) # 构造point表 point_data = { 'Point': [1, 2, 3, 20], 'Lat': [45.3, 34.4, 40.2, 40.4], 'Lon': [-65.2, -60.2, -60.1, -63.1] } point = pd.DataFrame(point_data).set_index('Point') # 设置Point为索引,方便快速查找
数据关联与可视化步骤:
- 关联起点/终点的经纬度:通过
point表的索引快速匹配conn表中A、B对应的坐标 - 绘制散点图:先画出所有点位
- 循环绘制连线:根据
relevance值设置线条粗细,关联度越高线条越粗
完整可视化代码:
# 创建画布 plt.figure(figsize=(10, 6)) # 绘制所有点位的散点图 plt.scatter(point['Lon'], point['Lat'], s=100, c='blue', label='点位') # 循环处理conn表的每一行(注意是iterrows()不是interrows()) for _, row in conn.iterrows(): start_id = row['A'] end_id = row['B'] rel = row['relevance'] # 跳过point表中不存在的点(比如示例中的7、5、6) if start_id not in point.index or end_id not in point.index: continue # 获取起点和终点的经纬度 start_lon, start_lat = point.loc[start_id, 'Lon'], point.loc[start_id, 'Lat'] end_lon, end_lat = point.loc[end_id, 'Lon'], point.loc[end_id, 'Lat'] # 绘制连线,线条粗细与relevance成正比,乘以2放大差异 plt.plot([start_lon, end_lon], [start_lat, end_lat], linewidth=rel*2, color='red', alpha=0.7) # 添加图表元素 plt.xlabel('经度(Lon)') plt.ylabel('纬度(Lat)') plt.title('点位关联可视化(线条粗细=关联度×2)') plt.legend() plt.grid(alpha=0.3) # 显示图形 plt.show()
关键说明:
- 把
point表的Point列设为索引,用loc快速匹配坐标,比循环查找更高效 - 加入了不存在点位的判断,避免因point表中无对应数据报错
- 线条粗细用
rel*2是为了放大不同关联度的视觉差异,可根据需求调整倍数 - 原代码中
interrows是拼写错误,正确为iterrows();且row[1][3]索引错误,推荐用列名row['relevance']更清晰易读
内容的提问来源于stack exchange,提问作者Nosequinposar Tampoc
相关产品推荐
相关产品推荐

