如何基于双数据集按聚类组批量绘制同色坐标点
嘿,我来帮你优化这个绘图方案!原来循环所有46个cluster确实有点冗余——毕竟很多cluster可能根本没有对应的数据点。我们可以通过合并数据集+按cluster分组绘图的方式来高效实现需求,代码更简洁,运行也更高效,还能完美满足你同一cluster用同色绘制的要求。
具体实现步骤
- 合并两个数据集:把df1的经纬度数据和df2的cluster分组信息通过id关联起来,这样每个经纬度点都能带上对应的cluster标签。
- 构建颜色映射:为每个存在的cluster分配唯一颜色,确保同一cluster的所有点颜色一致。
- 分组绘图:按cluster分组,遍历每个组绘制对应的经纬度点,自动把同属一个cluster的id(比如1531和14318)的点用同色展示。
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 先构造你提供的示例数据(实际使用时替换成你的真实数据即可) df1 = pd.DataFrame({ 'id_first': [403, 403, 1249, 1249, 1249, 1531, 1531, 14318], 'latitude': [45.0714, 45.0739, 45.0745, 45.1067, 45.1062, 45.1088, 45.1005, 45.1047], 'longitude': [7.6187, 7.6195, 7.6152, 7.6451, 7.6482, 7.6528, 7.6155, 7.6056] }) df2 = pd.DataFrame({ 'id_now': [403, 1249, 1531, 14318], 'cluster_group': [0, 1, 3, 3] }) # 1. 合并数据集:通过id关联,确保每个经纬度点都有cluster标签 merged_df = pd.merge(df1, df2, left_on='id_first', right_on='id_now', how='left') # 2. 为每个存在的cluster分配颜色 unique_clusters = merged_df['cluster_group'].unique() # 用matplotlib内置的区分度高的colormap,也可以自定义颜色 cmap = plt.get_cmap('tab10') color_map = {cluster: cmap(i) for i, cluster in enumerate(unique_clusters)} # 3. 分组绘制散点图 plt.figure(figsize=(10, 6)) for cluster, group in merged_df.groupby('cluster_group'): plt.scatter( x=group['longitude'], y=group['latitude'], color=color_map[cluster], label=f'Cluster {cluster}', s=60, alpha=0.8 ) # 添加图表装饰 plt.xlabel('Longitude', fontsize=12) plt.ylabel('Latitude', fontsize=12) plt.title('Geographic Points Grouped by Cluster', fontsize=14) plt.legend(fontsize=10) plt.grid(True, alpha=0.3) plt.show()
方案优势
- 高效性:只循环实际存在数据的cluster,不需要遍历46个可能为空的cluster,节省计算资源;
- 准确性:自动将同属一个cluster的不同id(比如1531和14318)的点归为一组,用同色绘制,完全符合你的需求;
- 可维护性:代码逻辑清晰,后续如果要调整颜色、点的样式,只需要修改对应参数即可。
可选自定义优化
如果你想使用自己指定的颜色,只需要替换颜色映射部分的代码:
# 自定义颜色列表,数量要不少于unique_clusters的数量 custom_colors = ['#FF6B6B', '#4ECDC4', '#45B7D1'] color_map = {cluster: custom_colors[i] for i, cluster in enumerate(unique_clusters)}
内容的提问来源于stack exchange,提问作者Mamed
相关产品推荐
相关产品推荐

