2011-12-19 37 views
8

पर बिंदु डेटासेट के औसत मान मैं ggplot के लिए अपेक्षाकृत नया हूं, इसलिए कृपया मेरी क्षमा करें यदि मेरी कुछ समस्याएं वास्तव में सरल हैं या हल करने योग्य नहीं हैं।एक ग्रिड डेटासेट

जो मैं करने की कोशिश कर रहा हूं वह उस देश का "हीट मैप" उत्पन्न करता है जहां आकार भरना निरंतर होता है। इसके अलावा मेरे पास देश का आकार .RData है। मैंने अपने स्पेटियल पॉलीगॉन डेटा को डेटा फ्रेम में बदलने के लिए hadley wickham's script का उपयोग किया। मेरे डेटा फ्रेम का लंबा और लेट डेटा अब इस

head(my_df) 
long  lat   group 
6.527187 51.87055 0.1 
6.531768 51.87206 0.1 
6.541202 51.87656 0.1 
6.553331 51.88271 0.1 

यह लंबा/लेट डेटा जर्मनी की रूपरेखा तैयार करता है। शेष डेटा फ्रेम यहां छोड़ा गया है क्योंकि मुझे लगता है कि इसकी आवश्यकता नहीं है। मेरे पास कुछ लंबे/अक्षांश बिंदुओं के लिए मूल्यों का दूसरा डेटा फ्रेम भी है। यह लग रहा है इस

my_fixed_points 
long  lat   value 
12.817  48.917  0.04 
8.533  52.017  0.034 
8.683  50.117  0.02 
7.217  49.483  0.0542 

मैं अब क्या करना चाहते हैं क्या की तरह, रंग सब नियत बिन्दु है कि उस समय की एक निश्चित दूरी के भीतर झूठ से अधिक एक औसत मूल्य के अनुसार नक्शा के प्रत्येक बिंदु है। इस तरह से मुझे देश के पूरे मानचित्र का एक (लगभग) निरंतर रंग मिल जाएगा। क्या मैं अब तक है देश के नक्शे को साजिश रची ggplot2 के साथ

ggplot(my_df,aes(long,lat)) + geom_polygon(aes(group=group), fill="white") + 
geom_path(color="white",aes(group=group)) + coord_equal() 

मेरी पहली आइडिया अंक कि नक्शा है कि तैयार की गई है के भीतर स्थित उत्पन्न करने के लिए और उसके बाद तो जैसे हर उत्पन्न बिंदु my_generated_point के लिए मूल्य की गणना था

value_vector <- subset(my_fixed_points, 
    spDistsN1(cbind(my_fixed_points$long, my_fixed_points$lat), 
    c(my_generated_point$long, my_generated_point$lat), longlat=TRUE) < 50, 
    select = value) 
point_value <- mean(value_vector) 

हालांकि मुझे इन बिंदुओं को उत्पन्न करने का कोई तरीका मिला है। और पूरी समस्या के साथ, मुझे यह भी पता नहीं है कि इस तरह से हल करना संभव है या नहीं। मेरा सवाल यह है कि यदि इन बिंदुओं को उत्पन्न करने का कोई तरीका मौजूद है और/या यदि समाधान में आने का कोई और तरीका है।

समाधान

पॉल के लिए धन्यवाद मैं लगभग मैं चाहता था मिल गया। नीदरलैंड के नमूना डेटा के साथ यहां एक उदाहरण दिया गया है।

library(ggplot2) 
library(sp) 
library(automap) 
library(rgdal) 
library(scales) 

#get the spatial data for the Netherlands 
con <- url("http://gadm.org/data/rda/NLD_adm0.RData") 
print(load(con)) 
close(con) 

#transform them into the right format for autoKrige 
gadm_t <- spTransform(gadm, CRS=CRS("+proj=merc +ellps=WGS84")) 

#generate some random values that serve as fixed points 
value_points <- spsample(gadm_t, type="stratified", n = 200) 
values <- data.frame(value = rnorm(dim(coordinates(value_points))[1], 0 ,1)) 
value_df <- SpatialPointsDataFrame(value_points, values) 

#generate a grid that can be estimated from the fixed points 
grd = spsample(gadm_t, type = "regular", n = 4000) 
kr <- autoKrige(value~1, value_df, grd) 
dat = as.data.frame(kr$krige_output) 

#draw the generated grid with the underlying map 
ggplot(gadm_t,aes(long,lat)) + geom_polygon(aes(group=group), fill="white") + geom_path(color="white",aes(group=group)) + coord_equal() + 
geom_tile(aes(x = x1, y = x2, fill = var1.pred), data = dat) + scale_fill_continuous(low = "white", high = muted("orange"), name = "value") 

autoKrige Netherlands

+0

कृपया एक पुन: उत्पन्न उदाहरण बनाएं। –

+0

मुझे एहसास है कि आप एक इंटरपोलेशन एल्गोरिदम की तलाश में हैं, कृपया मेरी पोस्ट को क्रिगिंग (भूगर्भीय विज्ञान) का उपयोग करके उदाहरण के लिए देखें। –

+0

बढ़िया आपने समाधान पोस्ट किया है, +1। एकमात्र चीज जिसे मैं इंगित करना चाहता हूं वह यह है कि "म्यूट" फ़ंक्शन के लिए लाइब्रेरी (स्केल) गायब है। – Eduardo

उत्तर

15

मुझे लगता है कि क्या आप चाहते हैं इन पंक्तियों के साथ कुछ न कुछ है। मैं भविष्यवाणी करता हूं कि यह होमब्रू बड़े डेटासेट के लिए बहुत अक्षम होगा, लेकिन यह एक छोटे से उदाहरण डेटासेट पर काम करता है। मैं कर्नेल घनत्व और शायद raster पैकेज में देखता हूं। लेकिन शायद यह आपको अच्छी तरह से उपयुक्त बनाता है ...

कोड का निम्न स्निपेट मूल बिंदु डेटासेट को ओवरले करने वाले बिंदुओं के ग्रिड की कैडमियम एकाग्रता के औसत मूल्य की गणना करता है। 1000 मीटर से अधिक अंक केवल माना जाता है।

library(sp) 
library(ggplot2) 
loadMeuse() 

# Generate a grid to sample on 
bb = bbox(meuse) 
grd = spsample(meuse, type = "regular", n = 4000) 
# Come up with mean cadmium value 
# of all points < 1000m. 
mn_value = sapply(1:length(grd), function(pt) { 
    d = spDistsN1(meuse, grd[pt,]) 
    return(mean(meuse[d < 1000,]$cadmium)) 
}) 

# Make a new object 
dat = data.frame(coordinates(grd), mn_value) 
ggplot(aes(x = x1, y = x2, fill = mn_value), data = dat) + 
    geom_tile() + 
    scale_fill_continuous(low = "white", high = muted("blue")) + 
    coord_equal() 

निम्न छवि की ओर जाता है जो:

enter image description here

एक वैकल्पिक दृष्टिकोण एक प्रक्षेप एल्गोरिथ्म का प्रयोग है। एक उदाहरण kriging है।

library(automap) 
kr = autoKrige(cadmium~1, meuse, meuse.grid) 
dat = as.data.frame(kr$krige_output) 

ggplot(aes(x = x, y = y, fill = var1.pred), data = dat) + 
    geom_tile() + 
    scale_fill_continuous(low = "white", high = muted("blue")) + 
    coord_equal() 

जो निम्न छवि की ओर जाता है: यह काफी automap पैकेज का उपयोग आसान (स्पॉट आत्म पदोन्नति :), मैं पैकेज लिखा था) है

enter image description here

लेकिन, जैसा कि ज्ञान के बिना इस मानचित्र के साथ आपका लक्ष्य क्या है, यह देखना मेरे लिए मुश्किल है कि आप वास्तव में क्या चाहते हैं।

2

यह slideshow एक और दृष्टिकोण प्रदान करता है - क्या परिणाम स्लाइड निर्माता के लिए की तरह लग रहा था के एक दृश्य के लिए दृष्टिकोण और page 21 के वर्णन के लिए page 18 देखते हैं।

ध्यान दें कि स्लाइड निर्माता ने spg पैकेज और spplot फ़ंक्शन का उपयोग ggplot2 और इसके साजिश कार्यों के बजाय किया था।

+0

... इसके अलावा, स्पप्लॉट हुड के नीचे जाली का उपयोग करता है। –