2012-06-24 14 views
15

यहां पहली पोस्ट, मुझे उम्मीद है कि मैं वेबसाइट शिष्टाचार देख रहा हूं। मुझे साइट पर नहीं मिला और जवाब नहीं मिला और मैंने पहले इसे एक ggplot2 विशिष्ट समूह में पोस्ट किया था, लेकिन अभी तक कोई समाधान नहीं है।ggplot2: रास्टर प्लॉटिंग अल्फा मानों को सेट करते समय अपेक्षित काम नहीं करती है

असल में मैं ggplot2 का उपयोग करके दो रास्टर्स ओवरले करने की कोशिश कर रहा हूं और शीर्ष पर अर्द्ध पारदर्शी होने की आवश्यकता है। मेरे पास एक पहाड़ी छाया रास्टर है जिसे एक ऊंचाई डेटा रास्टर से गणना की जाती है, और मैं ऊंचाई रास्टर को पहाड़ी छाया रास्टर पर ओवरले करना चाहता हूं ताकि परिणामी साजिश 'फ्लैट' न दिखाई दे। आप नीचे देख सकते हैं कि पुन: उत्पादित आर कोड में मेरा क्या मतलब है।

आधार ग्राफिक्स का उपयोग करके मैं वांछित परिणाम प्राप्त कर सकता हूं और मैंने इसे स्पष्ट करने के लिए नीचे दिए गए कोड में एक उदाहरण शामिल किया है, लेकिन मुझे 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 देखो की परतों कर सकते हैं?

प्रश्न 2: मैं रंगीन स्केल को अधिक समझदारी से कैसे निर्दिष्ट कर सकता हूं, इसलिए मेरे पास आरएचएस पर हास्यास्पद किंवदंती नहीं है?

+0

मुझे यकीन है कि किसी तरह से 'annotation_raster' उपयोग करने के लिए नहीं होगा हूँ - लेकिन मेरे प्रयास निरर्थक किया गया है अब तक। आपकी संयुक्त साजिश में विफल होने के कारण (जैसा कि मैंने इसे देखा) कारण है कि 'call_fill_gradientn' – mnel

+0

पर दो कॉल हैं जो इसका क्रूक्स है। ऐसा लगता है कि एक 'ggplot' केवल एक' भरने 'सौंदर्य और एक' रंग 'सौंदर्य हो सकता है।आप 'रंग = डीईएम' के साथ डीईएम परत को 'geom_point' बनाकर और' scale_fill_gradientn' 'के बजाय' scale_colour_gradientn' का उपयोग करके कुछ प्रकार के काम प्राप्त कर सकते हैं, लेकिन यह मूल ग्राफिक्स तरीके के रूप में उतना अच्छा नहीं दिखता है। –

+0

मेरी समस्या को देखने के लिए धन्यवाद, आप दोनों! @mplourde - मुझे लगता है कि ggplot2 में एक प्रति सौंदर्य सौंदर्य भर सकता है, लेकिन मुझे लगता है कि अल्फा पारदर्शिता कहां है, यह परतों को ओवरलैप करते हुए मिश्रित रंग मिश्रण का उपयोग करके रंगों को जोड़ती है। किसी भी तरह यह मिश्रण ग्राउंड ग्राफिक्स की तुलना में ggplot2 में अलग है। मैं इसके बारे में सोच रहा हूं और मुझे लगता है कि मुझे क्या करने की ज़रूरत है मैन्युअल रूप से पहाड़ी छाया रास्टर में प्रासंगिक ग्रेस्केल मान से रंगों की गणना करें (मुझे लगता है कि यह एचसीएल रंग में क्रोमिनेंस है मॉडल) और डीईएम रास्टर से रंग (मुझे लगता है कि यह रंग होगा)। –

उत्तर

11

प्रश्न 1: आप अलग-अलग परतों पर अलग-अलग भरने के स्केल नहीं कर सकते हैं। एक कामकाज डीईएम के लिए भरने सौंदर्यशास्त्र और पहाड़ी छाया के लिए अल्फा सौंदर्य का उपयोग करना है। दुर्भाग्यवश, 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 plus hill shading and colorbar legend

+0

मेरे कोडिंग प्रयासों को ठीक करने के आपके समय और प्रयास के लिए बहुत धन्यवाद। यह मेरे उद्देश्यों के लिए बहुत अच्छा काम करता है। बहुत बहुत धन्यवाद! :-) –

3

ताकि आप से आकर्षित कर सकते हैं रेखापुंज में अल्फा, अगले संस्करण में समर्थन किया जाएगा: वैसे भी बहुत सुंदर साजिश

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 कुछ उपकरणों में अलग लग रहे हो। शायद आपके उद्देश्य के लिए रास्टर बेहतर है।

enter image description here

+0

धन्यवाद! इस फिक्स के साथ अब मैं बिल्कुल प्लॉट कर सकता हूं जैसा मुझे चाहिए। बहुत बहुत धन्यवाद। चीयर्स, साइमन। –

+0

किसी को भी पता है कि आप मानचित्र में रंगों से मेल खाने के लिए पौराणिक कथाओं में रंगों को कैसे समायोजित कर सकते हैं, यह अब भूरे रंग के साथ मुखौटा है? – Dominik

+0

geom_tile() के बजाय geom_raster() का उपयोग करते समय "धुंधला" रास्टर के साथ फ़ाइल-आउटपुट (पीडीएफ) की समस्या थी। उत्तरार्द्ध ने इस मुद्दे को ठीक किया। टिप्पणी के लिए Thx। – Shadow

संबंधित मुद्दे