ama, soruyu açıklamak verileri, bazılarında kod :) sağlamakVeriler düzensiz bir ızgarada olduğunda ggplot2 ile harita üzerinde kontür çizimi nasıl yapılır? Metnin duvarına için üzgünüm
SORU: Ben R. kullanarak çizmek istiyorum Bazı iklim verilerine sahip
Düzensiz, 277x349 ızgara üzerindeki verilerle çalışıyorum (x = boylam, y = enlem, z = gözlem). Z, bir basınç ölçüsüdür (500 hPa yükseklik (m)). Ggplot2 paketini kullanarak bir haritanın üst kısmındaki konturları (veya izobarları) çizmeye çalıştım, ancak verilerin yapısından dolayı sorun yaşıyorum.
Veriler, Lambert konformal projeksiyonunda düzenli, eşit aralıklı bir 277x349 ızgaradan gelir ve her grid noktası için gerçek boylam, enlem ve basınç ölçümüne sahibiz. Bu projeksiyonda düzenli ızgara, ama gözlemler kaydedildi gerçek enlem ve boylam kullanarak bir harita üzerinde nokta olarak veri arsa, ben şu olsun:
bunu yapabilir en sağdaki parçayı sola çevirerek biraz daha hoş görünüyorsun (belki bu bir işlevle yapılabilir, ancak bunu manuel olarak yaptım) veya en sağdaki parçayı görmezden gelmek. Burada sola çevrilen sağ parçasıyla komplodur: (Bir kenara)
Sadece eğlence için, orijinal projeksiyon yeniden uygulamak için elimden geleni. Projeksiyonun veri kaynağından uygulanması için bazı parametrelerim var, ama bu parametrelerin ne anlama geldiğini bilmiyorum.
kullanıyorum kontur çizgilerini eklemek çalıştı: Ayrıca, (Ben ... yardım dosyalarını okumak vermedi) R projeksiyonları nasıl işleyeceğini bilmiyoruz, bu nedenle bu arsa bazı deneme yanılma yoluyla üretildi ggplot2'de geom_contour işlevi, ancak R'mı dondurdu. Verilerin çok küçük bir alt kümesi üzerinde denedikten sonra, ggplot'un şikayette bulunmasından sonra bazı verilerden sonra verilerin düzensiz bir ızgarada olduğunu öğrendim. Ben de geom_tile çalışma değildi nedeni olduğunu öğrendim. Tahmin ettiğim noktaların eşit aralıklarla yerleştirilmesi gerektiğini tahmin ediyorum - muhtemelen orijinal izdüşümüne (?) Geri yansıtılarak veya verilerimi düzenli aralıklarla (?) Örnekleyerek ya da puanlar arasında tahmin yaparak (?).
Sorularım şunlardır:
nasıl veri için (tercihen ggplot2 kullanarak) haritanın üzerine hatlarını çıkarabiliriz?
Bonus sorular: Ben Lambert konformal projeksiyon düzenli ızgarasına verilerimi geri dönüşümü nasıl
? Veri dosyasına göre projeksiyon parametreleri aşağıdakileri içerir (mpLambertParallel1F = 50, mpLambertParallel2F = 50, mpLambertMeridianF = 253, köşeler, La1 = 1, Lo1 = 214.5, Lov = 253). Bunun ne olduğu hakkında hiçbir fikrim yok.
Haritalarımı, bir taraf kırpılmayacak şekilde nasıl ortalarım (ilk haritada olduğu gibi)?
Haritanın projelendirilmiş çiziminin nasıl güzel görünmesini sağlarım (haritanın gereksiz kısımlarında asılı kalmadan)? Xlim ve ylim'i ayarlamayı denedim, ancak projeksiyondan önce eksenlerin sınırlarını uyguladığı görülüyor.
VERİ:
Google sürücüde rds dosyaları gibi verileri yüklendi. Sen readRDS R.
işlevinilat2d kullanarak dosyaları okuyabilir: 2d ızgara
lon2d gözlemleri gerçek enlem: gözlemler için gerçek boylam 2d ızgarada
z500 (ggplot2 için) güzel veri çerçevesi içinde düzenlenmiş veri
: basınç 500 milibardat gözlenen boy (m)Verilerin North American Regional Reanalysis veri tabanından geldiğini söylüyorum.
MY KOD (BÖYLECE FAR):
library(ggplot2)
library(ggmap)
library(maps)
library(mapdata)
library(maptools)
gpclibPermit()
library(mapproj)
lat2d <- readRDS('lat2d.rds')
lon2d <- readRDS('lon2d.rds')
z500 <- readRDS('z500.rds')
dat <- readRDS('dat.rds')
# Get the map outlines
outlines <- as.data.frame(map("world", plot = FALSE,
xlim = c(min(lon2d), max(lon2d)),
ylim = c(min(lat2d), max(lat2d)))[c("x","y")])
worldmap <-geom_path(aes(x, y), inherit.aes = FALSE,
data = outlines, alpha = 0.8, show_guide = FALSE)
# The layer for the observed variable
z500map <- geom_point(aes(x=lon, y=lat, colour=z500), data=dat)
# Plot the first map
ggplot() + z500map + worldmap
# Fix the wrapping issue
dat2 <- dat
dat2$lon <- ifelse(dat2$lon>0, dat2$lon-max(dat2$lon)+min(dat2$lon), dat2$lon)
# Remake the outlines
outlines2 <- as.data.frame(map("world", plot = FALSE,
xlim = c(max(min(dat2$lon)), max(dat2$lon)),
ylim = c(min(dat2$lat), max(dat2$lat)))[c("x","y")])
worldmap2 <- geom_path(aes(x, y), inherit.aes = FALSE,
data = outlines2, alpha = 0.8, show_guide = FALSE)
# Remake the variable layer
ggp <- ggplot(aes(x=lon, y=lat), data=dat2)
z500map2 <- geom_point(aes(colour=z500), shape=15)
# Try a projection
projection <- coord_map(projection="lambert", lat0=30, lat1=60,
orientation=c(87.5,0,255))
# Plot
# Without projection
ggp + z500map2 + worldmap2
# With projection
ggp + z500map + worldmap + projection
teşekkürler! Spacedman önerilerine
GÜNCELLEME 1
sayesinde ben bazı ilerlemeler kaydetmiştir düşünüyorum. raster paketini kullanarak, doğrudan bir netcdf dosyasından okuyup hatlarını belirleyebiliriz:
library(raster)
# Note: ncdf4 may be a pain to install on windows.
# Try installing package 'ncdf' if this doesn't work
library(ncdf4)
# band=13 corresponds to the layer of interest, the 500 millibar height (m)
r <- raster(filename, band=13)
plot(r)
contour(r, add=TRUE)
Şimdi haritayı almak yapmanız gereken tüm hatlarına altında göstermeye özetliyor! Kulağa kolay geliyor, ama tahmin ediyorum ki projeksiyon için parametrelerin doğru bir şekilde yapılması için doğru bir şekilde girilmesi gerekiyor.
file netcdf biçiminde, ilgilenenler için. 2
GÜNCELLEME çok hafiyelik sonra biraz daha ilerleme kaydetmiştir. Bence şimdi doğru PROJ4 parametrelerine sahibim. Ayrıca sınırlayıcı kutu için uygun değerleri buldum (sanırım). En azından, ggplot'ta yaptığım gibi aynı alanı kabaca çizebiliyorum.
# From running proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-107
# in the command line and inputting the lat/lon corners of the grid
x2 <- c(-5628.21, -5648.71, 5680.72, 5660.14)
y2 <- c(1481.40, 10430.58,10430.62, 1481.52)
plot(x2,y2)
# Read in the data as a raster
p4 <- "+proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-107 +lat_0=1.0"
r <- raster(nc.file.list[1], band=13, crs=CRS(p4))
r
# For some reason the coordinate system is not set properly
projection(r) <- CRS(p4)
extent(r) <- c(range(x2), range(y2))
r
# The contour map on the original Lambert grid
plot(r)
# Project to the lon/lat
p <- projectRaster(r, crs=CRS("+proj=longlat"))
p
extent(p)
str(p)
plot(p)
contour(p, add=TRUE)
Yardımı için Spacedman'a teşekkürler. Bir şeyleri anlayamazsam, şekil dosyalarının üst üste gelmesiyle ilgili yeni bir soru başlatabilirim!
Bu veri kümesi için orijinal (lambert) koordinatlarını aldınız mı, yoksa alabilir misiniz? Yoksa dönüştürülmüş bir ızgaraya atıldınız mı? Veriler için bir EPSG kodu da ideal olacaktır ... – Spacedman
@Spacedman Orijinal koordinatları almak için neler yapabileceğimi göreceğim. Bir EPSG kodunun ne olduğunu bilmiyorum, bu yüzden bunu elde edebileceğimi düşünmüyorum. – ialm
@Spacedman, orijinal GRIB dosyalarından birini aldıktan sonra, ızgarayla ilgili bazı bilgileri öğrenebildim. Kılavuz açıklaması "AWIPS - Bölgesel - NOAMHI - Yüksek Çözünürlüklü Kuzey Amerika Ana Izgarası (Lambert Conformal)" girişine sahiptir. Bazı googling'lerden sonra, bu sayfayı http://stommel.tamu.edu/~baum/narr.html, bana EPSG kodu 9802'yi bildirdim. – ialm