Rに2つの軸を持つ凡例をプロットする方法はありますか?


8

2つの軸を持つ凡例をプロットしたいと思います。具体的には、分類された2つの空間オブジェクトを組み合わせました。1つはイベントの強度を示し、2つ目はその場所でのイベントの確率を示します。結合されたラスターのピクセルが各カテゴリに分類される場所を示す凡例を作成します。作成する凡例は次のようになります 。2つの軸を持つ凡例

ここに画像の説明を入力してください

分類されたデータの通常の凡例は次のようになります:元の凡例

ここに画像の説明を入力してください

これは私が使用しているデータのタイプの再現可能な例です:

library(raster)
library(rasterVis)

# setseed
set.seed(999)

# create raster (example of what would be the outcome of combining intensity and probability rasters)
plot.me<- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40)
val <- c(100:104, 200:204, 300:304, 400:404)
plot.me<- setValues(plot.me, sample(val,ncell(plot.me),replace=T))


######  Plotting

plot.me <- ratify(plot.me)
levelplot(plot.me,att="ID" ,
          col.regions=c("#beffff","#73dfff","#d0ff73","#55ff00",
                        "#73b2ff","#0070ff","#70a800","#267300",
                        "#f5f57a","#ffff00","#e8beff","#df73ff",
                        "#f5ca7a","#ffaa00","#e600a9","#a80084"))

上からの出力のプロット

ここに画像の説明を入力してください

最も簡単な方法は、プロットを作成し、後でグラフィックスエディターで凡例を追加することです。しかし、R自体でこれを実行する方法があるはずです。私は現在、rasterVisパッケージを使用してプロットしていますが、ggplotまたはベースRに回答がある場合は、それらも同様に歓迎されます。

中間ステップの再現可能な例を(つまり、強度/確率ラスターで)持つほうが便利な場合は、私に知らせて、それらを生成できます。


1
githubに住んでいる中で最も近いのはgithub.com/clauswilke/multiscalesですが、これはあなたの例ではありません。
teunbrand

1
この画像を使用しrasterVisて作成しました。これがあなたが探しているものである場合は、ここにあるコード(「2変量の凡例」のセクション)を試してください
OscarPerpiñánMar

@OscarPerpiñán私はあなたの例が私が望んでいるものに最も近いように感じます(地図の上に凡例をプロットすることができます)。コードの一部を理解できません。pListステップの目的は何ですか?後続のステップを正しく機能させるために必要ですか、それとも作成したマップに固有ですか?
dee_2_dee

1
@ dee_2_deeこのステップは、レベルプロットのリストを生成します。各プロットはクラスに対応します(上記の「カテゴリデータ」のコードを参照)。このリストは、Reduceおよびでグローバルプロットに折りたたまれてい+.trellisます。
オスカーペルピニャン

回答:


4

1つの解決策は、2つのプロットを作成し、次のgrid.arrange関数を使用してそれらを結合することです。gridExtra、たとえばパッケージのです

まず、この投稿に投稿された関数を使用して、rasterLayerをティブルに変換します。 マップにラスターレイヤーをオーバーレイしますか?

(PS:valオブジェクトを変更して、指定したカラーパターンに一致する16の異なる色のみを作成しました。この例でvalは、20の異なる値があります)

val <- c(101:104, 201:204, 301:304, 401:404) # correction from OP's question to match 16 different values

library(raster)
gplot_data <- function(x, maxpixels = 50000)  {
  x <- raster::sampleRegular(x, maxpixels, asRaster = TRUE)
  coords <- raster::xyFromCell(x, seq_len(raster::ncell(x)))
  ## Extract values
  dat <- utils::stack(as.data.frame(raster::getValues(x))) 
  names(dat) <- c('value', 'variable')

  dat <- dplyr::as.tbl(data.frame(coords, dat))

  if (!is.null(levels(x))) {
    dat <- dplyr::left_join(dat, levels(x)[[1]], 
                            by = c("value" = "ID"))
  }
  dat
}

df <- gplot_data(plot.me)

次に、最初のプロットであるヒートマップを作成しますgeom_tile

library(ggplot2)
plot <- ggplot(df, aes(x = x, y = y, fill = as.factor(value)))+
  geom_tile(show.legend = FALSE)+
  coord_fixed(ratio = 20/20)+
  scale_fill_manual(values = c("#beffff","#73dfff","#d0ff73","#55ff00",
                               "#73b2ff","#0070ff","#70a800","#267300",
                               "#f5f57a","#ffff00","#e8beff","#df73ff",
                               "#f5ca7a","#ffaa00","#e600a9","#a80084"))+
  scale_y_continuous(name = "Latitude",labels = paste(c(40,45,50,55,60),"°N"))+
  scale_x_continuous(name = "Longitude",labels = paste(c(-110,-105,-100,-95,-90),"°W"))+
  theme_linedraw()+
  theme(panel.border = element_rect(size = 2),
        axis.text = element_text(size = 10),
        axis.title = element_text(size = 10),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())

次に、凡例用に別のデータフレームを作成します。

library(tidyverse)
df_legend <- data.frame(value = unique(df$value))
df_legend <- df_legend %>% rowwise() %>% 
  mutate(Dim1 = unlist(strsplit(as.character(value),""))[1],
         Dim3 = unlist(strsplit(as.character(value),""))[3])

Source: local data frame [16 x 3]
Groups: <by row>

# A tibble: 16 x 3
   value Dim1  Dim3 
   <int> <chr> <chr>
 1   404 4     4    
 2   204 2     4    
 3   304 3     4    
 4   104 1     4    
 5   202 2     2    
 6   302 3     2    
 7   203 2     3    
 8   301 3     1    
 9   402 4     2    
10   401 4     1    
11   303 3     3    
12   102 1     2    
13   201 2     1    
14   103 1     3    
15   403 4     3    
16   101 1     1    

今、私は伝説の陰謀を作りました:

legend <- ggplot(df_legend, aes(x = as.factor(Dim1), y = as.factor(Dim3), fill = as.factor(value)))+
  geom_tile(show.legend = FALSE, color = "black")+
  coord_fixed(ratio = 1)+
  scale_fill_manual(values = c("#beffff","#73dfff","#d0ff73","#55ff00",
                               "#73b2ff","#0070ff","#70a800","#267300",
                               "#f5f57a","#ffff00","#e8beff","#df73ff",
                               "#f5ca7a","#ffaa00","#e600a9","#a80084"))+
  theme_linedraw()+
  labs(x = "Dim1", y = "Dim3")+
  theme(panel.border = element_rect(size = 2),
        axis.text = element_text(size = 10),
        axis.title = element_text(size = 10))

そして最後に、それらを組み合わせます:

library(gridExtra)
grid.arrange(plot, legend, layout_matrix = rbind(c(1,1,2),c(1,1,3)))

ここに画像の説明を入力してください

それはあなたが手に入れようとしているものに見えますか?


注意:おそらくラスターオブジェクトを直接にプロットできますggplot2が、正確な手順はわかりませんでした。また、grid.arrangeプロットを希望どおりに表示するために、レイアウトをいじることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.