如何在Python中按检测月份在地图上绘制鱼类分组位点
按月份分组绘制鱼类检测位点地图的实现方案
数据预处理(核心步骤)
先从Dates列提取月份,建立月份与颜色的映射关系:
import pandas as pd # 读取示例数据(替换为你的实际数据读取逻辑) data = [ [49.302005, -67.684971, "2019-08-06"], [49.302031, -67.684960, "2019-08-12"], [49.302039, -67.684983, "2019-08-21"], [49.302039, -67.684979, "2019-08-30"], [49.302041, -67.684980, "2019-09-03"], [49.302041, -67.684983, "2019-09-10"], [49.302042, -67.684979, "2019-09-18"], [49.302043, -67.684980, "2019-09-25"], [49.302045, -67.684980, "2019-10-01"], [49.302045, -67.684983, "2019-10-09"], [49.302048, -67.684979, "2019-10-14"], [49.302049, -67.684981, "2019-10-21"], [49.302049, -67.684982, "2019-10-29"], ] df = pd.DataFrame(data, columns=["LAT", "LON", "Dates"]) # 转换日期格式并提取月份 df["Dates"] = pd.to_datetime(df["Dates"]) df["Month"] = df["Dates"].dt.month # 定义月份-颜色映射 month_color_map = {8: "blue", 9: "red", 10: "yellow"} df["Color"] = df["Month"].map(month_color_map)
方案1:交互式地图(Folium)
适合网页展示,支持缩放、点击查看位点详情:
import folium # 计算地图中心坐标(所有位点的平均经纬度) center_lat = df["LAT"].mean() center_lon = df["LON"].mean() # 创建地图实例 m = folium.Map(location=[center_lat, center_lon], zoom_start=18) # 遍历每个位点添加标记 for idx, row in df.iterrows(): folium.CircleMarker( location=[row["LAT"], row["LON"]], radius=6, color=row["Color"], fill=True, fill_color=row["Color"], fill_opacity=0.8, popup=f"日期: {row['Dates'].strftime('%Y-%m-%d')}<br>月份: {row['Month']}" ).add_to(m) # 添加手动图例 legend_html = """ <div style="position: fixed; bottom: 50px; left: 50px; z-index:9999; font-size:14px; background:white; padding:8px; border-radius:4px;"> <b>月份颜色图例</b><br> 8月: <span style="color:blue;">●</span><br> 9月: <span style="color:red;">●</span><br> 10月: <span style="color:yellow;">●</span> </div> """ m.get_root().html.add_child(folium.Element(legend_html)) # 保存地图 m.save("鱼类季节性位移地图.html")
方案2:静态地图(Matplotlib + Contextily)
适合论文、报告的静态输出,可直接导出高清图片:
import matplotlib.pyplot as plt import contextily as ctx from pyproj import Transformer # 转换地理坐标(WGS84)为Web墨卡托(适配底图) transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True) df["x"], df["y"] = transformer.transform(df["LON"], df["LAT"]) # 创建画布 fig, ax = plt.subplots(figsize=(10, 8)) # 按月份分组绘制散点 for month, group in df.groupby("Month"): ax.scatter( group["x"], group["y"], color=month_color_map[month], s=100, alpha=0.7, label=f"{month}月" ) # 添加开源底图 ctx.add_basemap(ax, source=ctx.providers.OpenStreetMap.Mapnik) # 隐藏坐标轴刻度,优化地图展示 ax.set_axis_off() # 添加图例和标题 ax.legend(title="检测月份", loc="upper right") ax.set_title("鱼类海底检测位点季节性位移分布") # 保存图片 plt.savefig("鱼类季节性位移分布图.png", dpi=300, bbox_inches="tight") plt.show()
内容的提问来源于stack exchange,提问作者toms
相关产品推荐
相关产品推荐

