如何在Python geoplot中成功应用自定义seaborn调色板
问题描述
制作地图时需使用符合工作样式规范的自定义调色板,目前已通过seaborn成功生成目标调色板,实现代码如下:
detcity =["#004445", "#279989", "#9FD5B3", "#FEB70D", "#18252A", "#F2F2F2"] detcity = sns.color_palette(detcity) sns.palplot(sns.color_palette(detcity))
(附自定义调色板预览图)
始终无法找到在geoplot中成功替换默认调色板的正确方法,当前绘图代码如下:
fig,ax = plt.subplots(figsize = (30,30)) gplt.pointplot( geo_duplex, hue='Close_Year', legend = True, ax=ax ) xlim = (-83.2, -82.9) ylim = (42.25, 42.45) ax.set_xlim(xlim) ax.set_ylim(ylim) cx.add_basemap(ax, crs=crs)
当前运行输出使用的是geoplot默认调色板,而非创建的自定义调色板,尝试过的多数指定调色板的操作均触发报错,附当前默认配色的输出效果图,寻求可行的解决方案。
可行解决方案
geoplot的pointplot及其他支持颜色映射的图层函数,原生支持通过palette参数传入自定义配色,之前触发报错基本是两个原因:一是传参位置错误,二是连续/离散调色板和hue字段的数据类型不匹配。
按以下步骤修改即可正常加载自定义调色板:
- 先根据
hue字段类型处理调色板格式:如果Close_Year是连续数值型(未做分箱的原始年份值),需要把十六进制颜色列表转为matplotlib可识别的连续色带,不要直接传入seaborn生成的离散调色板对象;如果Close_Year是分类型字段(已做年份分段/分箱),可以直接传入seaborn生成的离散调色板 - 把处理好的调色板作为
palette参数直接传入gplt.pointplot(),不要把该参数嵌套在legend配置项中
修改后的可运行代码:
import matplotlib.pyplot as plt import seaborn as sns import geoplot as gplt import contextily as cx from matplotlib.colors import LinearSegmentedColormap # 自定义工作规范配色 detcity_colors = ["#004445", "#279989", "#9FD5B3", "#FEB70D", "#18252A", "#F2F2F2"] # 连续hue场景(对应原始年份数值):生成连续插值色带 detcity_pal = LinearSegmentedColormap.from_list("detcity", detcity_colors) # 分类hue场景(对应分箱后的年份类别):替换为下面这行即可 # detcity_pal = sns.color_palette(detcity_colors) fig,ax = plt.subplots(figsize = (30,30)) gplt.pointplot( geo_duplex, hue='Close_Year', palette=detcity_pal, # 传入自定义调色板 legend = True, ax=ax ) xlim = (-83.2, -82.9) ylim = (42.25, 42.45) ax.set_xlim(xlim) ax.set_ylim(ylim) # 注意crs参数必须和矢量数据geo_duplex的坐标系保持一致,避免底图偏移 cx.add_basemap(ax, crs=geo_duplex.crs) plt.show()
常见报错排查
- 报“颜色数量和数据类别不匹配”错误:是因为把离散调色板传给了连续型hue字段,换成上面的连续色带写法即可
- 旧版本geoplot不识别seaborn调色板对象:直接传入原始十六进制颜色列表,或者转成
LinearSegmentedColormap对象即可兼容 - 调色板不生效:检查是否把
palette参数错写到了legend配置的字典里,必须作为pointplot的顶层参数传入
内容的提问来源于stack exchange,提问作者CKay
相关产品推荐
相关产品推荐

