19

ここに初めて投稿します。ウェブサイトのマナーを守っていただければ幸いです。サイトで見つけて答えることができず、以前にこれをggplot2固有のグループに投稿しましたが、まだ解決策はありません.

基本的に、ggplot2 を使用して 2 つのラスターを重ね合わせようとしており、一番上のラスターを半透明にする必要があります。標高データ ラスターから計算された HillShade ラスターがあり、標高ラスターを Hillshade ラスターにオーバーレイして、結果のプロットが「平坦」にならないようにしたいと考えています。以下の再現可能な R コードで、私が何を意味するかを確認できます。

基本グラフィックを使用すると、目的の結果を得ることができます。意味を明確にするために、以下のコードに例を含めましたが、ggplot2 でこれを行う必要があります。

ggplot2 で動作させることができません。ラスターを組み合わせると、色が面白くなります (それぞれを単独でプロットできます)。誰かが私を助けたり、正しい方向に向けたりできますか。自己完結型の再現可能なコード例を以下に示します。(長くなって申し訳ありませんが、明確にしたほうがよいと思いました)。

#   Load relevant libraries
library(ggplot2)
library(raster)


#   Download sample raster data of Ghana from my Dropbox
oldwd <- getwd()
tmp <- tempdir()
setwd(tmp)
url1 <- "http://dl.dropbox.com/s/xp4xsrjn3vb5mn5/GHA_HS.asc"
url2 <- "http://dl.dropbox.com/s/gh7gzou9711n5q7/GHA_DEM.asc"
f1 <- file.path(tmp,"GHA_HS.asc")
f2 <- file.path(tmp,"GHA_DEM.asc")
download.file(url1,f1)  #File is ~ 5,655Kb
download.file(url2,f2)  #File is ~ 2,645Kb


#   Create rasters from downloaded files
hs <-  raster(f1)
dem <- raster(f2)


#   Plot with base graphics to show desired output
plot(hs,col=grey(1:100/100),legend=F)
plot(dem,col=rainbow(100),alpha=0.4,add=T,legend=F)


#   Convert rasters TO dataframes for plotting with ggplot
hdf <- rasterToPoints(hs); hdf <- data.frame(hdf)
colnames(hdf) <- c("X","Y","Hill")
ddf <- rasterToPoints(dem); ddf <- data.frame(ddf)
colnames(ddf) <- c("X","Y","DEM")


#   Create vectors for colour breaks
b.hs <- seq(min(hdf$Hill),max(hdf$Hill),length.out=100)
b.dem <- seq(min(ddf$DEM),max(ddf$DEM),length.out=100)


#   Plot DEM layer with ggplot()
p1 <- ggplot()+
    layer(geom="raster",data=ddf,mapping=aes(X,Y,fill=DEM))+
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
    coord_equal()
print(p1)


#   Plot hillShade layer with ggplot()
p2 <- ggplot()+
    layer(geom="raster",data=hdf,mapping=aes(X,Y,fill=Hill))+
    scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
    coord_equal()
print(p2)


#   Try to plot both together with transparency on the DEM layer
p3 <- ggplot(hdf)+
    geom_raster(aes(X,Y,fill=Hill))+
    scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
    geom_raster(data=ddf,aes(X,Y,fill=DEM),alpha=I(0.4))+
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+
    coord_equal()
 print(p3)


#   Cleanup downloaded files and return to previous wd
unlink(tmp,recursive=T)
setwd(oldwd)

私の質問は次のとおりです。

Q1: 上記の例でベース グラフィックスをプロットしたときのように p3 のレイヤーを表示するにはどうすればよいですか?

Q2: RHS にばかげた凡例が表示されないように、カラー スケールをより賢明に指定するにはどうすればよいですか?

4

2 に答える 2

15

Q1:レイヤーごとに異なる塗りつぶしスケールを設定することはできません。回避策の1つは、DEMに塗りつぶしの美学を使用し、陰影起伏にアルファの美学を使用することです。残念ながら、geom_raster私が期待したようにアルファ美学を使用していないようです。で同じ効果を得ることができますが、geom_tile時間がかかります。

ggplot(hdf) +
  geom_raster(data=ddf,aes(X,Y,fill=DEM)) +
  scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem) +
  geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") +
  scale_alpha(range = c(0, 0.5)) +
  scale_x_continuous(name=expression(paste("Longitude (",degree,")")),
    limits=c(-4,2),expand=c(0,0)) +
  scale_y_continuous(name=expression(paste("Latitude (",degree,")")),
    limits=c(4,12),expand=c(0,0)) +
  coord_equal() 

Q2:チェックアウトしてください?guide_colorbar。100のカラーブレイクではうまく機能しませんが、それより少ないとかなり良いです。

ggplot(hdf)+
  geom_raster(data=ddf,aes(X,Y,fill=DEM))+
  scale_fill_gradientn(name="Altitude",colours = rainbow(20))+
  guides(fill = guide_colorbar()) +
  geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") +
  scale_alpha(range = c(0, 0.5)) +
  scale_x_continuous(name=expression(paste("Longitude (",degree,")")),
    limits=c(-4,2),expand=c(0,0)) +
  scale_y_continuous(name=expression(paste("Latitude (",degree,")")),
    limits=c(4,12),expand=c(0,0)) +
  coord_equal() 

DEMに加えて、丘の陰影とカラーバーの凡例

于 2012-06-25T19:36:38.287 に答える
5

ラスターのアルファは次のバージョンでサポートされるため、次の方法で描画できます。

ggplot(NULL, aes(X, Y)) + 
  geom_raster(data = ddf, aes(fill = DEM)) + 
  geom_raster(data = hdf, aes(alpha = Hill)) +
  scale_fill_gradientn(name="Altitude",colours = rainbow(20))+
  guides(fill = guide_colorbar()) +
  scale_alpha(range = c(0, 0.5), guide = "none") +
  scale_x_continuous(name=expression(paste("Longitude (",degree,")")), limits=c(-4,2),expand=c(0,0)) +
  scale_y_continuous(name=expression(paste("Latitude (",degree,")")), limits=c(4,12),expand=c(0,0)) +
  coord_equal()

とにかく美しいプロット。

これをすぐに使用したい場合は、github からインストールしてみてください。

library(devtools)
install_github("ggplot2", "kohske", "fix/geom-raster-alpha")

一部のデバイスでは と が異なって見えるgeom_tileことに注意してください。geom_rasterおそらくラスターの方が目的に適しています。

ここに画像の説明を入力

于 2012-06-26T00:42:43.793 に答える