如何将GeoDataFrame标记大小按5个数值范围分组设置?
按数值范围分组设置散点图标记大小及图例
需求:基于GeoDataFrame的SpeciesCatch列配置散点图标记大小,将数值划分为5个范围组,同一组内使用统一标记大小,同时让图例按范围分组展示,替代原代码中每个数值对应单独图例项的效果。
原代码:
fig, ax = mpl.pyplot.subplots(1, figsize = (10,10)) sns.scatterplot( data=fishpts_clip, x="Lon", y="Lat", color='Green', size='SpeciesCatch', sizes=(100, 300), legend="full" ) plt.legend(loc='center left', bbox_to_anchor=(1.05, 0.5), ncol=1, title='Sizes')
原效果:
期望效果:
解决方案
核心思路是先对SpeciesCatch列做分箱分组,再基于分组列设置标记大小,具体步骤如下:
对数值列分箱
使用pandas.cut()将SpeciesCatch划分为5个等距(或自定义)区间,生成新的分组列CatchGroup:import pandas as pd # 按等距划分5组,也可自定义bins参数设置区间 fishpts_clip['CatchGroup'] = pd.cut(fishpts_clip['SpeciesCatch'], bins=5)基于分组列绘制散点图
将size参数指定为新的分组列,同时用字典定义每组对应的标记大小,确保同一组大小统一:import matplotlib.pyplot as plt import seaborn as sns fig, ax = plt.subplots(1, figsize=(10,10)) # 自定义每组对应的标记大小,可根据需求调整数值 size_mapping = { fishpts_clip['CatchGroup'].cat.categories[0]: 100, fishpts_clip['CatchGroup'].cat.categories[1]: 150, fishpts_clip['CatchGroup'].cat.categories[2]: 200, fishpts_clip['CatchGroup'].cat.categories[3]: 250, fishpts_clip['CatchGroup'].cat.categories[4]: 300 } sns.scatterplot( data=fishpts_clip, x="Lon", y="Lat", color='Green', size='CatchGroup', sizes=size_mapping, legend="full" ) # 调整图例位置和标题 plt.legend(loc='center left', bbox_to_anchor=(1.05, 0.5), ncol=1, title='Catch Range') plt.show()
关键说明
- 如果需要自定义分组区间,可在
pd.cut()中手动指定bins参数,例如bins=[0, 10, 20, 30, 40, 50] size_mapping的大小值可根据可视化需求调整,保证分组间大小有明显区分- 图例将自动显示每个区间范围,与期望效果一致
内容的提问来源于stack exchange,提问作者Cindy
相关产品推荐
相关产品推荐

