8 Stimmen

Wie man eine räumliche Rasterkarte mit ggplot im Vergleich zu spplot verbessern kann?

Wie kann ich die Legende des räumlichen Rasterkartenplots mit ggplot im Vergleich zu einer spplot() Legende verbessern?

Ich möchte räumliche Karten mit ggplot() anstelle von spplot() erstellen, aber es gibt ein paar Dinge, die ich verbessern möchte im Vergleich zur spplot:

  1. Erstellen Sie eine ggplot Legende, die von kleinen (unten) zu großen Werten (oben) geht
  2. Legen Sie die Unterbrechungen in der ggplot Legende ähnlich wie bei der spplot() Legende fest, damit ich weiß, wo die Grenzen jeder Farbe liegen.

## Pakete laden
require(raster)
require(ggplot2)
require(rgdal)
require(RColorBrewer)
set.seed(1)

r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40,
          crs="+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100
+ellps=WGS84")
r <- setValues(r,matrix(rnorm(1600, mean=0.4,sd=0.2))) 

## 1. Räumliche Karte mit spplot
cuts <-seq(minValue(r),maxValue(r),length.out=8)
cuts = round(cuts,digits=2)
col.regions = brewer.pal(length(cuts)+3-1, "RdYlGn")
print( 
spplot(as(r, 'SpatialGridDataFrame'),at=cuts,
col.regions=col.regions,
colorkey=list(labels=list(at=cuts),at=cuts), pretty=TRUE,
scales=list(draw=T)
) 
)

## 2. Räumliche Karte mit ggplot
p = rasterToPoints(r); df = data.frame(p)
colnames(df) = c("x", "y", "NDVI")

p  <- ggplot(data=df) + geom_tile(aes(x, y, fill=NDVI)) +
coord_equal() + labs(x=NULL, y=NULL) + 
scale_fill_gradient2(low="red", mid="yellow",high="green",
limits=c(minValue(r),maxValue(r)), midpoint = 0.4) + theme_bw() +
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
print(p)

Ergebnis von spplot() spplot

Ergebnis von ggplot() ggplot

10 Stimmen

Bitte verwenden Sie keine Rot-Grün-Farbkombinationen. Die 5-10% der Männer mit Rot-Grün-Farbschwäche finden sie sehr schwer zu lesen.

0 Stimmen

Der Link zur Website von Koske - veranschaulicht mehr oder weniger, was ich gerne tun würde. Ich werde die Kapazität von ggplot() weiter erforschen, Farben anpassen, die Legende verbessern und ein Update unten posten. Alle Tipps/Beispiele sind willkommen. Danke

5voto

kohske Punkte 63276

Danke @joran für den Hinweis darauf.

Hier ist ein Beispielcode und Output mit der Entwicklerversion:

br <- seq(min(df$NDVI), max(df$NDVI), len=8)

ggplot(data=df) + 
  geom_tile(aes(x, y, fill=NDVI)) + 
  scale_fill_gradient(low="red", high="green", 
    breaks=br, labels=sprintf("%.02f", br), 
    guide=guide_colorbar(title=NULL, nbin=100, barheight=unit(0.75, "npc"), label.hjust=1)) + 
  scale_x_continuous(expand=c(0,0)) + 
  scale_y_continuous(expand=c(0,0))

Bildbeschreibung eingeben

Du kannst das wahrscheinlich so ausprobieren:

# nach Hadley's Anweisung
install.packages("devtools")
library(devtools)
dev_mode() # um nicht in Konflikt mit deiner bestehenden Installation zu geraten
install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable")
library(ggplot2)

AKTUALISIERT:

Hier sind die Anweisungen für die Installation von Grund auf:

install.packages(
  c('devtools', 'digest', 'memoise', 'plyr', 'reshape2', 'RColorBrewer', 'stringr', 'dichromat', 'munsell', 'plyr', 'colorspace'), 
  dep=TRUE)

library(devtools)
dev_mode()

install_github("scales")
install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable")

0 Stimmen

Ich habe es gerade ausprobiert, aber ich bekomme den folgenden Fehler: Beim Erstellen von 'ggplot2_0.9.0.tar.gz' FEHLER: Die Abhängigkeit 'scales' ist nicht verfügbar für das Paket 'ggplot2', es sagt, dass scales nicht verfügbar ist für 2.13.0, wo kann ich es finden? Es wäre toll, Legenden wie die oben zu erstellen. Super.

0 Stimmen

Ich habe Scales auf github gefunden github.com/hadley/scales, wie installiere ich dies am besten in R?

0 Stimmen

Die Antwort wurde aktualisiert. Versuche install_github("scales"). Wenn Fehler wie fehlende Pakete RColorBrewer, stringr, dichromat, munsell, plyr, colorspace auftreten, versuche dann install.packages(c('RColorBrewer', 'stringr', 'dichromat', 'munsell', 'plyr', 'colorspace'), dep=TRUE)

4voto

joran Punkte 163857

Ich bin mir nicht sicher, wie ich (1) spontan ansprechen soll. Aber hier sind einige mögliche Lösungen für (2) und (3).

Ich glaube nicht, dass ggplot2 derzeit in der Lage ist, die Legende auf diese Weise zu beschriften. Allerdings hat Koske an einem Code gearbeitet, der möglicherweise in Zukunft in ggplot2 integriert wird und Legenden erstellt, die auf diese Weise gestaltet sind. Hier ist ein Link, obwohl die Installation einiger zusätzlicher Pakete erforderlich ist und es nur eine Alpha-Version ist.

Um die spezifischen Pausen zu erhalten, die Sie suchen, probieren Sie dies aus:

br <- c(-0.25,-0.05,0.15,0.35,0.56,0.76,0.96,1.16)
p  <- ggplot(data=df) + geom_tile(aes(x, y, fill=NDVI)) +
coord_equal() + labs(x=NULL, y=NULL) + 
scale_fill_gradient(low="red", mid="yellow",high="green",
breaks = br) + theme_bw() +
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
print(p)

das hat auf meinem Gerät folgendes Diagramm erzeugt:

Bildbeschreibung eingeben

Ich habe nicht getestet, wie dies mit dem oben erwähnten experimentellen Code aussehen würde.

0 Stimmen

Der einzige Weg, den ich kenne, um eine Legende von hoch zu niedrig zu erhalten, ohne in den internen Code von ggplot einzugreifen, ist, die Skala in einen Faktor mit cut umzuwandeln, die Farben manuell zuzuweisen und die Reihenfolge der Ebenen umzukehren...

0 Stimmen

Vielen Dank für den Link zur Seite von Koske, das ist genau das, was ich gerne mit der Legende einer ggplot-Raumkarte machen würde. Ich werde einige Tests durchführen und bald unten ein Endergebnis posten.

0 Stimmen

Beachten Sie, dass die Codes veraltet sind. Bitte finden Sie diesen Beitrag in der ggplot2-Liste: groups.google.com/group/ggplot2/browse_thread/thread/…

0voto

AF7 Punkte 3020

Antw: (2) Zuerst cut() Ihre Daten, um einen gruppierten Datensatz zu erhalten. Verwenden Sie die Optionen breaks und labels in cut(), um die richtigen Bezeichnungen zu erhalten, z.B.:

dat$col <- cut(
  df$NDVI, 
  breaks=c(-Inf, -0.25, 0.05, ...whatever..., Inf), 
  labels=c(-0.25, 0.05, ...whatever..., "")
)

Dann können Sie mit ggplot plotten und die Bezeichnungen verschieben, sodass sie direkt an den Farbgrenzen liegen, mit:

 scale_fill_manual (Ihre Optionen...) + guides(fill=guide_legend(label.vjust = 1.2)) #1.2= was am besten zu Ihrer Legende passt. Verwenden Sie label.hjust, wenn Sie eine horizontale Farbleiste verwenden

Siehe auch: Generieren einer Farblegende mit verschobenen Bezeichnungen mit ggplot2

Alternativ können Sie die Farblegende mit einem externen Skript erstellen (z.B. GrADS erstellt schöne Farblegenden mit den richtigen Skripts) und dieselben Farben manuell in scale_fill_manual angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X