为 ggplot 多边形的背景着色以匹配轮廓层的较低值

Colour the background of a ggplot polygon to match the lower value of the contour layer

我使用核密度估计制作了一张地图,我之前使用 kernsmooth 包中的 'bkde2d' 函数生成了该估计。我正在使用 ggplot 像这样在我的 shapefile 下绘制密度表面。测试 = 我的数据框包含坐标值(IDLon 和 IDLat)以及核密度估计 (KDEst)。 ScotMap.df 是我的 shapefile 数据框。

ggplot() +
  geom_contour(data=test, aes(x=IDLon, y=rev(IDLat), z=KDEst)) +
  stat_contour(data=test, geom="polygon", aes(x=IDLon, y=rev(IDLat), z=KDEst, fill=..level..)) +
  geom_polygon(data=ScotMap.df, aes(x=long,y=lat, group=group, col="lightgrey"), fill="lightgrey") +
  scale_x_continuous(limits = b[1,]) +
  scale_y_continuous(limits = b[2,]) +
  theme_bw()

产生这个情节:

我想要做的是将密度表面颜色的下端从“..level..”匹配到绘图的其余部分,以便当前显示为白色的所有内容都是深蓝色。这将使密度表面在整个图像上看起来是连续的,并有效地将特定坐标处的 0 值分配给与下端值相同的颜色。我尝试通过手动匹配颜色来伪造它,但调色板上没有任何东西是相同的,所以我能做的最好的是:

ggplot() +
  geom_contour(data=test, aes(x=IDLon, y=rev(IDLat), z=KDEst)) +
  stat_contour(data=test, geom="polygon", aes(x=IDLon, y=rev(IDLat), z=KDEst, fill=..level..)) +
  geom_polygon(data=ScotMap.df, aes(x=long,y=lat, group=group, col="lightgrey"), fill="lightgrey") +
  scale_x_continuous(limits = b[1,]) +
  scale_y_continuous(limits = b[2,]) +
  theme_bw() +
  theme(panel.background = element_rect(fill = "blue4"))

有什么想法吗?

In the documentation for scale_fill_gradient 比例尺的最低值为 low = "#132B43",而最高值为 high = "#56B1F7".

data_frame(x = sample(1:5, 5), y = sample(1:5, 5), z = rnorm(5)) %>% 
  ggplot(aes(x, y, fill = z)) + geom_tile(width = 1, height = 1, colour = "white") + 
  theme(panel.background = element_rect(fill = "#132B43"))

此外,删除 geom_polygon(aes(...)) 内的 col = "lightgrey" 或将其移到 aes(...) 外以删除额外的图例条目(这也是它出现的原因错误的颜色)。

编辑:

require(scales)
data_frame(x = sample(1:5, 5), y = sample(1:5, 5), z = rnorm(5)) %>% 
  ggplot(aes(x, y, fill = z)) + geom_tile(width = 1, height = 1, colour = "white") + 
  scale_fill_distiller(type = "seq", palette = "YlGnBu") +
  theme(panel.background = element_rect(fill = brewer_pal(type = "seq", palette = "YlGnBu")(6)[6]))

   require(viridis)
    data_frame(x = sample(1:5, 5), y = sample(1:5, 5), z = rnorm(5)) %>% 
      ggplot(aes(x, y, fill = z)) + geom_tile(width = 1, height = 1, colour = "white") + 
      scale_fill_viridis() +
      theme(panel.background = element_rect(fill = viridis_pal()(6)[1]))