【问题标题】:Plot a bivariate map in R在 R 中绘制二元映射
【发布时间】:2018-02-01 22:23:13
【问题描述】:

我正在尝试在 R 的地图上绘制取自栅格数据集的两个变量,以生成看起来有点像这样的东西:

但是,理想情况下,我希望从左下角到右上角的比例为灰度(从浅灰色到黑色),从而突出显示两个变量差异很小的区域。

到目前为止,这就是我使用包colorplaner

#load packages
require(raster)
require(colorplaner)
require(ggplot2)


#here's some dummy data
r1<- raster(ncol=10, nrow=10)
set.seed(0)
values(r1) <- runif(ncell(r1))
r2<- raster(ncol=10, nrow=10)
values(r2) <- runif(ncell(r2))

#here I create a grid with which I can  extract information on the raster datasets
grid<-raster(ncol=10, nrow=10)
grid[] <- 1:ncell(grid)
grid.pdf<-as(grid, "SpatialPixelsDataFrame")
grid.pdf$r1<-(extract(r1,grid.pdf))
grid.pdf$r2<-(extract(r2,grid.pdf))

#here I convert the grid to a dataframe for plotting in ggplot2
grid.df<-as.data.frame(grid.pdf)
ggplot(data=grid.df,aes(x,y,fill=r1,fill2=r2))+geom_raster()+scale_fill_colourplane("")

这给了我这个:

这个默认色阶并不真正适合我的需要 - 我更喜欢看起来像这样的色阶,取自 this website

但是我发现修改函数 scale_fill_colourplane 中的颜色方案很棘手

我能得到的最接近我想要的色阶是这样的:

ggplot(data=grid.df,aes(x,y,fill=r1,fill2=r2))+
geom_raster()+
scale_fill_colourplane(name = "",na.color = "white",
color_projection = "interpolate",vertical_color = "#FAE30C",
horizontal_color = "#0E91BE", zero_color = "#E8E6F2",
limits_y = c(0,1),limits=c(0,1))

这给了我这个,但这不是我想要的:

有关于如何修改scale_fill_colourplane 函数here 中使用的色阶的信息,这使我看起来应该能够做我想做的事,但我不太明白。

有没有人知道如何实现我想要的?我愿意使用其他软件包,但如果可能的话,我更喜欢使用ggplot2 进行绘图,以便该数字与我目前正在制作的其他软件包一致。

【问题讨论】:

    标签: r ggplot2 geospatial raster r-raster


    【解决方案1】:

    您可以通过思考 HSV 空间来做到这一点。 https://en.wikipedia.org/wiki/HSL_and_HSV

    沿 45 度线的距离是值(从亮到暗)。

    到那条线的距离是饱和度(单色到彩色)

    两种不同的颜色只是色调的两种选择。

    # hsv
    # Position along diagonal is value
    # Distance from the diagonal is saturation
    # upper triangle or lower triangle is hue.
    
    col_func <- function(x, y){
    
      x[x == 0] <- 0.000001
      y[y == 0] <- 0.000001
      x[x == 1] <- 0.999999
      y[y == 1] <- 0.999999
    
      # upper or lower triangle?
      u <- y > x
    
      # Change me for different hues.
      hue <- ifelse(u, 0.3, 0.8)
    
    
      # distace from (0,0) to (x,y)
      hyp <- sqrt(x^2 + y^2) 
    
      # Angle between x axis and line to our point
      theta <- asin(y / hyp)
    
      # Angle between 45 degree line and (x,y)
      phi <- ifelse(u, theta - pi/4, pi/4 - theta)
      phi <- ifelse(phi < 0, 0, phi)
    
      # Distance from 45 degree line and (x,y)
      s <- hyp * sin(phi) / sqrt(2)
    
      # Draw line from (x, y) to 45 degree line that is at right angles.
      # How far along 45 degree line, does that line join.
      v <- 1 - hyp * cos(phi) / sqrt(2)
    
      # Get hsv values.
      sapply(seq_along(x), function(i) hsv(hue[i], s[i], v[i]))
    
    }
    
    
    
    ggplot(data=grid.df,aes(x,y,fill=r1,fill2=r2))+
      geom_raster()+
      scale_fill_colourplane(name = "",
                             na.color = "white",
                             color_projection = col_func,
                             limits_y = c(0,1),limits=c(0,1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2013-08-01
      • 2015-09-30
      • 2020-10-22
      • 2012-06-20
      相关资源
      最近更新 更多