2012-06-24 37 views
15

olarak ayarlandığında, raster çiziminin beklendiği gibi çalışmaz. İlk gönderiyi görüyorum, umarım web sitesi görgü kurallarını gözlemliyorum. Sitede bulamadım ve cevap veremedim ve daha önce bunu ggplot2'ye özgü bir gruba gönderdim, ancak henüz çözüm bulunamadı.ggplot2: alfa değerleri

Temel olarak ggplot2 kullanarak iki rasterin üzerine basmaya çalışıyorum ve üstteki öğenin yarı saydam olmasını istiyorum. Bir elevasyon veri rasterinden hesaplanan bir hillShade rasterim var ve yükseliş rasterinin tepesi tiftik rasterinin üzerine yerleştirilmesini istiyorum, böylece elde edilen arsa 'düz' görünmüyor. Aşağıdaki tekrarlanabilir R kodunda ne demek istediğimi görebilirsiniz.

Temel grafikleri kullanarak istenen sonucu elde edebilirim ve ne demek istediğimi netleştirmek için aşağıdaki kod örneğini ekledim, ancak bunu ggplot2'de yapmam gerekiyor.

Ggplot2'de çalışamıyorum. Rasterleri birleştirmek renkleri eğlenceli hale getirir (her birini kendi başına çizebilirim). Herkes bana doğru yönde yardım edebilir veya işaret edebilir. Aşağıda yer alan kendinden geçmiş, tekrarlanabilir kod örneği. (Uzunluğun için üzgünüm, ama daha iyi olacağını düşündüm).

# 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) 

Benim sorulara

aşağıdaki gibidir:

S1: yukarıdaki örnekteki baz grafiklerle çizilen ne zaman gibi nasıl p3 görünüm katmanlarını yapabilir?

S2: Renk ölçeklerini daha mantıklı bir şekilde nasıl belirleyebilirim ki RHS'de saçma bir efsaneye sahip değilim?

+0

Ben 'annotation_raster' kullanmak için bir yol olacağını eminim - ama benim girişimleri şimdiye kadar sonuçsuz olmuştur. Kombinasyon arızanızın sebebi (gördüğüm gibi), 'scale_fill_gradientn' – mnel

+0

' un iki katıdır. Görünüşe göre bir “ggplot” sadece bir “dolgu” estetiğine ve bir “renk” estetiğine sahip olabilir.DEM katmanını "color = DEM" ile bir "geom_point" haline getirerek ve "scale_fill_gradientn" yerine "scale_colour_gradientn" yi kullanarak işlerin bu tür şeyler elde edebilirsiniz, ancak temel grafik tarzı kadar iyi görünmüyor. –

+0

Sorunuma baktığınız için teşekkürler, ikiniz de! @mplourde - Ggplot2'nin katman başına bir dolgu estetiğine sahip olabileceğini düşünüyorum, ancak alfa saydamlığının olduğu yerlerde renklerin katmanlar ile örtüştüğü addidtive renk karışımını kullanarak birleştirdiğini düşünüyorum. Her nasılsa bu karıştırma ggplot2'de taban grafiğinden farklıdır. Bunun hakkında düşünüyordum ve yapmam gereken şeyin elle elle çizilmiş renkleri storShade rasterindeki ilgili gri tonlama değerinden hesaplamasıdır (bence bu hcl renginde renkliliktir) model) ve DEM rasterinden gelen ton (bunun renk olacağını düşünüyorum). –

cevap

11

S1: Farklı katmanlardaki farklı dolgu ölçeklerine sahip olamazsınız. Bir çözüm, DEM için dolgu estetiğini ve tepe teli için alfa estetiğini kullanmaktır. Ne yazık ki, geom_raster alfa estetiğini beklediğim şekilde kullanmıyor. Bunun sadece uzun sürer, geom_tile ile aynı etkiyi elde edebilirsiniz:

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() 

S2: ?guide_colorbar göz atın. 100 renk aralığınızda çok güzel çalışmıyor, ancak daha azıyla oldukça iyi.

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 plus hill shading and colorbar legend

+0

Kodlama çabalarımı düzenlerken zaman ve çaba için çok teşekkürler. Bu benim amaçlarım için harika çalışıyor. Çok teşekkürler! :-) –

3

sen tarafından çizebilmeniz cıkarılabilen alfa, sonraki sürümde desteklenecektir: zaten

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() 

çok güzel arsa. bunu hemen kullanmak istiyorsanız

, github dan yüklemeyi deneyin: geom_tile ve geom_raster bazı cihazlarda farklı görünmesini

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

Not. Belki de raster amacınız için daha iyidir.

enter image description here

+0

Teşekkürler! Bu düzeltmeyle, şimdi tam olarak ihtiyacım olanı çizebiliyorum. Çok teşekkür ederim. Şerefe, Simon. –

+0

Herkes, haritadaki renkleri griye gizlendiğinde, efsanedeki renkleri nasıl ayarlayabileceğiniz konusunda herhangi bir fikriniz var mı? – Dominik

+0

geom_tile() yerine geom_raster() kullanırken "bulanık" raster içeren dosya-çıktı (PDF) sorunu yaşadım. İkincisi sorunu çözdü. Yorum için Thx. – Shadow