求助Python实现等值线图叠加到地理地图的绘制方法
你当前混用了两套不兼容的绘图框架:Geopandas默认基于Matplotlib渲染底图,等值线代码用的是Plotly渲染,二者无法直接叠加。选择以下任意一种统一技术栈的方案即可实现需求:
方案1:全Matplotlib技术栈(静态出图,代码改动最小)
import matplotlib.pyplot as plt import geopandas as gpd import pandas as pd import numpy as np from scipy.interpolate import griddata # 加载亚洲区域底图 world_map = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) asia = world_map[world_map.continent == 'Asia'] # 创建绘图轴 fig, ax = plt.subplots(figsize=(14,10)) # 先绘制亚洲底图 asia.plot(ax=ax, color='white', edgecolor='black') # 处理温度插值数据 df = pd.read_csv('./temperature_2d.csv') x = np.array(df.lon) y = np.array(df.lat) z = np.array(df.value) xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) X,Y = np.meshgrid(xi,yi) Z = griddata((x,y),z,(X,Y), method='cubic') # 在同一轴上叠加温度等值线热力图,alpha设置透明度避免盖住底图边界 contour = ax.contourf(X, Y, Z, cmap='hot', alpha=0.7) # 可选:叠加等值线轮廓 ax.contour(X, Y, Z, colors='gray', linewidths=0.5) # 添加颜色条 plt.colorbar(contour, ax=ax, label='温度') # 限制坐标范围匹配温度数据的经纬度,避免显示多余区域 ax.set_xlim(x.min(), x.max()) ax.set_ylim(y.min(), y.max()) plt.show()
方案2:全Plotly技术栈(交互式出图,支持缩放、hover查看数值)
import plotly.graph_objects as go import geopandas as gpd import pandas as pd import numpy as np from scipy.interpolate import griddata # 加载亚洲边界数据,转成plotly支持的geojson格式 world_map = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) asia = world_map[world_map.continent == 'Asia'] asia_geojson = asia.__geo_interface__ # 处理温度插值数据 df = pd.read_csv('./temperature_2d.csv') x = np.array(df.lon) y = np.array(df.lat) z = np.array(df.value) xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) X,Y = np.meshgrid(xi,yi) Z = griddata((x,y),z,(X,Y), method='cubic') # 创建画布 fig = go.Figure() # 先添加亚洲底图图层 fig.add_trace(go.Choropleth( geojson=asia_geojson, locations=asia.index, z=[1]*len(asia), # 统一设置底图颜色为白色 colorscale=[[0, 'white'], [1, 'white']], marker_line_color='black', marker_line_width=1, showscale=False, featureidkey='id' )) # 叠加温度等值线图层 fig.add_trace(go.Contour( z=Z, x=xi, y=yi, colorscale = 'Hot', contours_coloring='heatmap', opacity=0.7, colorbar_title='温度' )) # 设置地图坐标系,匹配经纬度范围 fig.update_geos( projection_type='mercator', lonaxis_range=[x.min(), x.max()], lataxis_range=[y.min(), y.max()], visible=False # 隐藏plotly默认自带的世界底图,只用自定义的亚洲底图 ) fig.update_layout(height=800, width=1100) fig.show()
内容的提问来源于stack exchange,提问作者user15980977
相关产品推荐
相关产品推荐

