Bir arka plan eklemeyi ve ggplot2'yi kullanarak bir ön plan rasterini oluşturmayı sağlayan bir işlev yazdım.
Düzenleme:
İki rasterları birleştirmek ve değerleri vardiya, değerler örtüşmeyen şekilde: Ben Bu nasıl çalıştığını olduğu uca
daha iyi bir çözüm eklendi. Ardından, raster katmanını ön plan için renk skalasını içeren bir ölçek çubuğu ile çiziyorum (örneğin, kırmızı -> yeşil), burada arka plan renk skalası kodlanmış (siyah -> beyaz). Renk sayısında bir sınır yoktur.
Tarama katmanının efsanesi görüntülenmiyor. Tüm ölçek çubuğunu (siyah - beyaz -> kırmızı -> yeşil) içermeyen bir efsane elde etmek için arka plana iki kukla puan ekliyorum. Ön plan verilerinin en küçük olanı, biri en büyük olanıdır. Bu sadece ön plan verileri için bir efsane verir.
Birisi ölçeklemeyi ve renk ölçeğini oluşturmanın daha iyi bir yolunu biliyorsa, bunu işleve eklemekten memnuniyet duyarız.
Önplan verileri nicel kullanarak ölçekleme olanağını ekledim; fg.quant
argümanı, verileri "kesmek" için kullanılan iki tam sayıya sahip bir vektör alır. bw.scale
, arka plan rasterinin daha koyu/parlak olmasını sağlar: bw.scale=c(0, 0.5)
, arka plan görüntüsünün örneğin siyahtan griye (0,5) kadar bir renk skalasına sahip olduğu anlamına gelir.
Bunun mükemmel bir işlev olmadığını biliyorum. Ama benim için çok faydalı ve ben bunu geliştireceğim ve boş zamanlarım olduğunda çirkin parçaları ortadan kaldırmaya çalışacağım.
test verisi
# 'background'
r.1 <- raster(x=matrix(rowSums(expand.grid(1:10, 1:10)), nrow=10),
xmn=0, xmx=10, ymn=0, ymx=10)
# 'foreground'
r.2 <- raster(x=matrix(rnorm(16), nrow=4),
xmn=3, xmx=7, ymn=3, ymx=7)
arsa fonksiyonu
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# BGPlot() -- plot data with background raster using ggplot2
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BGPlot <- function(fg,
bg,
cols=c('red', 'green'),
fg.quant=c(0, 1),
bw.scale=c(0, 1),
plot.title='',
leg.name='Value') {
# plot data with background raster using ggplot2
#
# Args
# fg: foreground raster layer
# bg: background raster layer
# cols: colors to use for fg
# fg.quant: scaling fg by quantiles
# bw.scale: makes bg darker/brighter:
# E.g. c(0, 0.9) -> darker/c(0.2, 1) -> brighter
# plot.title: title
# leg.name: name to be displyed at legend
#
# Returns
# ggplot object
# load libraries
library(ggplot2)
# get min/max of foreground raster
fg.q <- quantile(fg, fg.quant)
fg.min <- fg.q[1]
fg.max <- fg.q[2]
# rescale fg
fg.sc <- (fg-fg.q[1])/(fg.q[2]-fg.q[1])
fg.sc[fg.sc<0] <- 0
fg.sc[fg.sc>1] <- 1
fg.sc <- fg.sc + 0.1
# get scale (fg values 0.1, 10, 1000 range?)
ifelse((fg.max-fg.min)/10>=1, n.dgts <- 0, n.dgts <- 1)
# create fg legend breaks/labels
fg.breaks <- round(seq(fg.min, fg.max, l=5), n.dgts)
fg.breaks[1] <- ceiling(fg.min*(10^n.dgts))/(10^n.dgts)
fg.breaks[5] <- floor(fg.max*(10^n.dgts))/(10^n.dgts)
fg.labs <- paste0(c(paste0(round(fg.min, n.dgts+1), '-'),'','','',''),
fg.breaks,
c('','','','',paste0('-', round(fg.max, n.dgts+1)))
)
# rescale bg
bg.sc <- (bg-minValue(bg))/
(maxValue(bg)-minValue(bg)) *
(bw.scale[2]-bw.scale[1]) + bw.scale[1] -1.1
# merge rasters, fg over bg
r <- merge(fg.sc, bg.sc)
# convert raster to data.frame
r.df <- as.data.frame(rasterToPoints(r))
names(r.df) <- c('Longitude', 'Latitude', 'Value')
# get center of r
mid.Lon <- mean(r.df$Longitude)
mid.Lat <- mean(r.df$Latitude)
# set scale positions
vals <-c(-1.1,-0.1, seq(0.1,1.1,l=length(cols)))
# set dummy-point values
dp <-seq(fg.min,fg.max,l=length(cols))
# plotting;
p <-
ggplot() +
# dummy points: points not visible, needed to display custom scale-bar
geom_point(data=data.frame(x = rep(mid.Lon, length(cols)),
y = rep(mid.Lat, length(cols)),
c = dp),
aes(x, y, color=c)) +
scale_color_gradientn(colours = cols,
breaks=fg.breaks,
labels=fg.labs,
name=leg.name) +
# raster; no scale-bar plotted
geom_raster(data=r.df, aes(x=Longitude, y=Latitude, fill=Value)) +
scale_fill_gradientn(colours = c('black', 'white', cols),
values = vals,
rescaler = function(x,...) x,
oob = identity,
guide = "none") +
ggtitle(label=plot.title) +
theme_light() +
labs(list(x='Lon', y='Lat')) +
theme(axis.text.y=element_text(angle=90, hjust=0.5)) +
coord_equal()
return(p)
}
işlev çağrısı
BGPlot(fg=r.2, bg=r.1, cols=c('red', 'green'), fg.quant=c(0.01, 0.99), bw.scale=c(0, 0.8), plot.title='Chlorophyll Concentration', leg.name='CHL')
Bir "gerçek dünya" örnek:
DÜZENLEME: Daha iyi bir çözüm R paketini kullanarak 'RStoolbox'
Bu paket kullanarak çok kolay ve mükemmel çalışma çözümdür RStoolbox
. ggR
işlevi, gri tonlamalı bir arka plan görüntüsü, işlevi bir RGB arka planı olan ggRGB
üretir.
library(ggplot2)
library(RStoolbox)
ggR(BACKGROUND_IMAGE, geom_raster=FALSE) +
geom_raster(...) # here comes standard raster plot
hayal meyal de bu yapmaya çalışıyor ve bu tasarımdan kaçınılmalıdır edildiğini Googling anımsıyorum: – fanli
Teşekkür Fanli Cevabınız için https://github.com/hadley/ggplot2/issues/578. Bağlantıyı kontrol ettim ve son yorumda ggvis'in bunu desteklediği belirtiliyor. Bunu ggvis ile yapmaya çalışacağım ve eğer işe yararsa cevabı göndereceğim. – basil
Ben ggvis bir göz attıktan sonra bu yanlış bir yaklaşım olduğunu düşünüyorum. – basil