Matplotlib颜色映射(colormap)未在图例中显示问题求助
飓风佛罗伦萨路径图颜色映射图例不显示的问题解决
问题描述
在Datacamp的Python地理空间数据分析入门教程中,复现飓风佛罗伦萨路径图代码时,其他结果正常,但颜色映射图例未显示。原代码如下:
fig, ax = plt.subplots(1, figsize=(20,20)) base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E') florence.plot(ax=base, column='Wind', marker="<", markersize=10, cmap='cool', label="Wind speed(mph)") _ = ax.axis('off') plt.legend() ax.set_title("Hurricane Florence in US Map", fontsize=25) plt.savefig('Hurricane_footage.png',bbox_inches='tight')
预期生成带风速颜色映射图例的路径图,但实际仅显示空图例或无颜色对应关系。
原因分析
plt.legend()仅能识别单一绘图元素的label(如单个线条、marker),无法捕获Geopandas通过column参数生成的数值型颜色映射(基于ScalarMappable对象)。- 原代码中
label参数对column驱动的颜色映射无效,因为该参数仅作用于单一图层标识,而非颜色映射的图例说明。
解决方法
改用plt.colorbar()生成对应颜色映射的图例,步骤如下:
- 保存Geopandas绘图返回的ScalarMappable对象;
- 通过
plt.colorbar()将其绑定到坐标轴,添加标签说明。
修正后的代码:
fig, ax = plt.subplots(1, figsize=(20,20)) # 绘制美国本土基础地图 country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E') # 绘制飓风路径,保存颜色映射的ScalarMappable对象 wind_sm = florence.plot(ax=ax, column='Wind', marker="<", markersize=10, cmap='cool') # 关闭坐标轴 ax.axis('off') # 添加颜色条图例,设置标签 cbar = plt.colorbar(wind_sm, ax=ax) cbar.set_label("Wind speed(mph)", fontsize=15) # 设置标题 ax.set_title("Hurricane Florence in US Map", fontsize=25) plt.savefig('Hurricane_footage.png',bbox_inches='tight')
可选进阶:分区间类别图例
若需要显示风速区间的类别式图例,可先对Wind列分箱,再按分类变量绘图:
import pandas as pd # 对风速分箱 florence['Wind_bin'] = pd.cut(florence['Wind'], bins=[0, 50, 100, 150], labels=['0-50 mph', '50-100 mph', '100-150 mph']) fig, ax = plt.subplots(1, figsize=(20,20)) country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E') # 按分类变量绘图,此时label参数生效 florence.plot(ax=ax, column='Wind_bin', marker="<", markersize=10, cmap='cool', legend=True, legend_kwds={'title': 'Wind speed(mph)'}) ax.axis('off') ax.set_title("Hurricane Florence in US Map", fontsize=25) plt.savefig('Hurricane_footage.png',bbox_inches='tight')
内容的提问来源于stack exchange,提问作者Samuel Jaramillo
相关产品推荐
相关产品推荐

