Python中用Matplotlib修改Choropleth地图的色条及图表属性
解决Choropleth地图的三个问题及优化建议
1. 将图例刻度减少至5个
你当前设置k=4会生成4个数据区间,对应5个刻度(两端+中间3个),但matplotlib可能自动生成多余刻度。可以通过手动指定刻度值实现需求:
- 先提取数据的极值和分位数作为刻度点
- 绘制后获取颜色条对象,设置自定义刻度
修改后的代码片段:
# 提取房价数据的关键值作为刻度 price_data = gdf['Median_House_Price__2013'] min_val = price_data.min() max_val = price_data.max() q25 = price_data.quantile(0.25) median = price_data.median() q75 = price_data.quantile(0.75) # 绘制地图并获取颜色条对象 cbar = gdf.plot('Median_House_Price__2013', ax=ax, figsize=[10,5], legend=True, cax=cax, k=4, cmap='RdPu', legend_kwds={'label': "House Prices", "orientation": "horizontal"}) # 设置5个自定义刻度 cbar.set_ticks([min_val, q25, median, q75, max_val]) # 可选:格式化刻度为易读格式(如带英镑符号和千位分隔符) cbar.set_ticklabels([f'£{x:,.0f}' for x in [min_val, q25, median, q75, max_val]])
2. 调整标题位置与字体
当前plt.title的位置可能被绘图覆盖,改用ax.set_title将标题固定在顶部,并指定目标字体:
- 通过
y参数调整标题位置,避免被地图遮挡 - 指定
fontfamily='Gill Sans MT',若系统无该字体,可替换为sans-serif等兼容字体
修改后的代码:
# 替换原plt.title代码 ax.set_title("Median House Prices of London, 2013", loc='center', y=1.05, # 向上偏移确保在顶部 fontfamily='Gill Sans MT', fontsize=14)
3. 额外优化建议
- 添加行政边界高亮:为伦敦行政区添加黑色细边界,增强区域辨识度:
gdf.boundary.plot(ax=ax, color='black', linewidth=0.5) - 优化颜色映射:若房价数据偏态,使用对数刻度映射,让低价值区间差异更明显:
from matplotlib.colors import LogNorm # 绘制时替换k参数为norm参数 gdf.plot('Median_House_Price__2013', ..., norm=LogNorm(vmin=min_val, vmax=max_val), ...) - 添加数据来源标注:在图的角落标注数据源,提升专业性:
ax.text(0.01, 0.01, 'Data Source: [你的数据源名称]', transform=ax.transAxes, fontsize=8, fontfamily='Gill Sans MT') - 调整画布尺寸:在创建画布时设置更大尺寸,避免绘图压缩变形:
fig, ax = plt.subplots(1, 1, figsize=[12,8])
完整修改后的代码
import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib.colors import LogNorm # 可选,用于对数刻度 # 创建画布 fig, ax = plt.subplots(1, 1, figsize=[12,8]) divider = make_axes_locatable(ax) cax = divider.append_axes("bottom", size="5%", pad=0.1) # 设置标题 ax.set_title("Median House Prices of London, 2013", loc='center', y=1.05, fontfamily='Gill Sans MT', fontsize=14) # 提取房价数据关键值 price_data = gdf['Median_House_Price__2013'] min_val = price_data.min() max_val = price_data.max() q25 = price_data.quantile(0.25) median = price_data.median() q75 = price_data.quantile(0.75) # 绘制地图 cbar = gdf.plot('Median_House_Price__2013', ax=ax, legend=True, cax=cax, k=4, cmap='RdPu', legend_kwds={'label': "House Prices", "orientation": "horizontal"}) # 设置自定义刻度及格式化标签 cbar.set_ticks([min_val, q25, median, q75, max_val]) cbar.set_ticklabels([f'£{x:,.0f}' for x in [min_val, q25, median, q75, max_val]]) # 添加行政区边界高亮 gdf.boundary.plot(ax=ax, color='black', linewidth=0.5) # 添加数据来源标注 ax.text(0.01, 0.01, 'Data Source: [请填入你的数据源]', transform=ax.transAxes, fontsize=8, fontfamily='Gill Sans MT') # 关闭坐标轴 ax.set_axis_off() plt.show()
内容的提问来源于stack exchange,提问作者curiousfrog
相关产品推荐
相关产品推荐

