2016-04-08 6 views
1

Ich versuche, eine Rasterkarte mit einigen Daten und Rand Plots dieser Daten zu plotten. Art von wie die levelplot()rasterVis Funktion, oder noch besser mit Farben (die Farben innerhalb der Handlung widerspiegeln) statt mit einer Linie. Es wird im Folgenden klar sein, was ich versuche zu tun. rasterVis Beispiel (mit Dichte Linie):Plotten Rand Plots für geom_ Raster() in ggplot2

http://i.stack.imgur.com/QiaUu.png

Allerdings möchte ich ggplot2 verwenden. Laden Sie die data used in this example (8KB) ​​herunter.

Ich versuchte grid.arrange() zu verwenden:

library(ggplot2) 
library(raster) 
library(maps) 
library(grid) 
library(scales) #for muted() 
library(gridExtra) 

load("example.Rsave") #load data 

#prepare data for the margin plot 
var=tp_rlim; min=0; max=1; mid=0.5 
varname <- colnames(var)[3] 
zonal <- aggregate(var[,3], list(var$Lat), mean) 
colnames(zonal) <- c("Lat", varname) 

#plot the margin plot 
ggzonal <- ggplot(zonal, aes(x="", y=Lat, fill=tp))+ 
      geom_raster() + 
      theme(legend.position="none", 
        axis.title.x = element_blank(), 
        axis.title.y = element_blank(), 
        axis.ticks = element_blank(), 
        axis.text.x = element_blank(), 
        axis.text.y = element_blank() 
        ) + 
      scale_fill_gradient2(limits=c(min, max), space="Lab", midpoint=mid) 

#plot main plot 
    gg <- ggplot(var, aes_string(x="Lon", y="Lat", fill=varname)) + 
      geom_raster() + 
      coord_quickmap(xlim = range(var$Lon), ylim = range(var$Lat)) + 
      scale_fill_gradient2(limits=c(min, max), space="Lab", midpoint=mid) + 
      theme(legend.position="bottom", 
        legend.key.width = unit(1.5, "cm"), 
        legend.key.height = unit(0.3, "cm"), 
        legend.title=element_blank() 
       ) + 
      borders(region=unique(na.omit(map.where("world", var$Lon, var$Lat))), colour="black") 

    grid.arrange(gg, ggzonal, ncol=2, widths=c(5, 1)) 

Aber das Ergebnis ist nicht zufriedenstellend: enter image description here

ich auch ggExtra::ggMarginal zu verwenden versucht, aber:

ggExtra::ggMarginal(gg) 

enter image description here

Oder

:

ggExtra::ggMarginal(gg, type="histogram") 

enter image description here

Wie kann ich das tun?

Antwort

3

dies funktionieren könnte,

# fix the ylim of annotation plot 
gg2 = ggzonal + coord_cartesian(ylim = range(var$Lat)) 
# devtools::install_github("baptiste/egg") 
library(egg) 
ggarrange(gg, gg2, widths = c(10,1)) 

enter image description here

+0

Sie sehen jedoch, die rechte Spalte ist leicht, etwas kürzer? Ich bin ein Perfektionist, leider, und kann damit nicht umgehen :( – AF7

+0

das Panel hat die richtige Größe, so denke ich, dass etwas stimmt nicht mit den Daten in diesem Plot. – baptiste

+1

tatsächlich hatte die RHS-Plot nicht die gleichen y Grenzen als der andere – baptiste

2

Mit dem wunderbaren cowplot Paket und die Anweisung gefunden here, können wir wie folgt vor:

library(cowplot) 

grobs <- ggplotGrob(gg + theme(legend.position="bottom"))$grobs 
legend_b <- grobs[[which(sapply(grobs, function(x) x$name) == "guide-box")]] 

prow <- plot_grid(gg + theme(legend.position="none"), ggzonal, align = 'h', rel_widths = c(5, 1)) 

plot_grid(prow, legend_b, ncol = 1, rel_heights = c(1, .2)) 
ggsave('stack.png', w = 5, h = 5) 

Ergebnis:

enter image description here

+0

Das ist erstaunlich, danke! – AF7

+0

Ich habe eine Frage tho. Wenn ich in Ihrer Antwort 'rel_widths = c (10, 1)' anstelle von 'rel_widths = c (5, 1)' setze, wird das rechte Diagramm etwas komprimiert. Warum das? Es ist zu breit wie es jetzt ist. EDIT: ok, ich muss rel_heights auch teilen, obwohl das für mich keinen Sinn ergibt. – AF7

+0

Ein kleines Niggle: Mit diesem Ansatz wird die coord_quickmap() abgebrochen, wobei offensichtlich auf coord_equal() zurückgegriffen wird. Kann ich etwas tun, um das zu beheben? – AF7