如何用ggplot在连续栅格上绘制离散尺度图层?
问题解决:连续高程栅格上叠加离散着色的散点饼图
你遇到的问题是**geom_scatterpie会默认继承ggplot全局的fill尺度**,背景地图用的是连续型scale_fill_gradientn,但散点饼图需要离散型填充,两者尺度类型冲突导致报错。不需要移除高程栅格,以下两种方法可以解决:
方法1:给散点饼图指定独立的填充尺度
显式为散点饼图设置离散填充映射与尺度,和高程的连续填充尺度区分开:
# 先修正饼图的经纬度(西经要写负数,否则会跑到地图外) pie.data <- data.frame(pie = c("a","b", "c"), part.1 = rep(0.5, 3), part.2 = rep(0.5, 3), lat = c(34,36,38), long = c(-122,-120,-118)) # 叠加散点饼图并指定独立填充 background.map + geom_scatterpie(data = pie.data, aes(x = long, y = lat, group = pie, fill = after_stat(piece)), cols = c("part.1", "part.2")) + # 自定义离散填充颜色 scale_fill_manual(values = c("#4287f5", "#f54242"), guide = guide_legend(title = "饼图分区"))
after_stat(piece)是geom_scatterpie内部生成的离散变量,对应饼图的每个分区;scale_fill_manual专门为饼图设置离散颜色,和高程的连续填充互不干扰。
方法2:关闭散点饼图的全局美学继承
让geom_scatterpie忽略全局的fill=elevation映射,独立处理自身的填充逻辑:
# 修正经纬度后的饼图数据 pie.data <- data.frame(pie = c("a","b", "c"), part.1 = rep(0.5, 3), part.2 = rep(0.5, 3), lat = c(34,36,38), long = c(-122,-120,-118)) # 叠加散点饼图并关闭全局aes继承 background.map + geom_scatterpie(data = pie.data, aes(x = long, y = lat, group = pie), cols = c("part.1", "part.2"), inherit.aes = FALSE) + scale_fill_manual(values = c("#2ecc71", "#e67e22"))
inherit.aes = FALSE会让该图层完全不继承之前设置的全局美学映射,避免填充尺度冲突。
内容的提问来源于stack exchange,提问作者Alex Krohn
相关产品推荐
相关产品推荐

