4 Stimmen

Setzen von Haltepunkten für Daten mit der Funktion scale_fill_brewer() in ggplot2

Ich erstelle eine Karte (Choropleth), wie sie in der ggplot2 wiki . Alles funktioniert wie ein Charme, außer, dass ich in ein Problem Mapping einen kontinuierlichen Wert auf die Polygon-Füllfarbe über die scale_fill_brewer() Funktion laufen.

Diese Frage beschreibt das Problem, das ich habe. Wie in der Antwort, hat mein Workaround gewesen, um meine Daten in Bins mit der gtools quantcut() Funktion vorgeschnitten:

UPDATE: Dieses erste Beispiel ist tatsächlich der richtige Weg, dies zu tun

require(gtools) # needed for quantcut()

...

fill_factor <- quantcut(fill_continuous, q=seq(0,1,by=0.25))
ggplot(mydata) + 
aes(long,lat,group=group,fill=fill_factor) +
geom_polygon() +
scale_fill_brewer(name="mybins", palette="PuOr")

Das funktioniert, aber ich habe das Gefühl, dass ich den Schritt des Vorschneidens meiner Daten überspringen und etwas Ähnliches mit der Option "Pausen" tun können sollte:

ggplot(mydata) +
aes(long,lat,group=group,fill=fill_continuous) +
geom_polygon() +
scale_fill_brewer(names="mybins", palette="PuOr", breaks=quantile(fill_continuous))

Aber das funktioniert nicht. Stattdessen erhalte ich eine Fehlermeldung in der Art:

Kontinuierliche Variable (zusammengesetzte Punktzahl), die an diskrete scale_brewer geliefert wird.

Habe ich den Zweck der Option "Pausen" missverstanden? Oder ist "Pausen" kaputt?

4voto

krlmlr Punkte 23448

Ein Hauptproblem beim Vorschneiden kontinuierlicher Daten besteht darin, dass drei Informationen an verschiedenen Stellen des Codes verwendet werden:

  • Die Brewer-Palette - bestimmt die maximale Anzahl der verfügbaren Farben
  • Die Anzahl der Haltepunkte (oder die Bin-Breite) -- muss mit den Daten angegeben werden
  • Die tatsächlichen Daten, die gezeichnet werden sollen - beeinflusst die Wahl der Brewer-Palette (sequentiell/divergierend)

Ein wahrer Teufelskreis. Dieser kann durch die Bereitstellung einer Funktion durchbrochen werden, die die Daten und die Palette akzeptiert, automatisch die Anzahl der Haltepunkte ableitet und ein Objekt zurückgibt, das der ggplot Objekt. Etwas in der Art der folgenden Zeilen:

fill_brewer <- function(fill, palette) {
  require(RColorBrewer)
  n <- brewer.pal.info$maxcolors[palette == rownames(brewer.pal.info)]
  discrete.fill <- call("quantcut", match.call()$fill, q=seq(0, 1, length.out=n))
  list(
    do.call(aes, list(fill=discrete.fill)),
    scale_fill_brewer(palette=palette)
  )
}

Verwenden Sie es so:

ggplot(mydata) + aes(long,lat,group=group) + geom_polygon() +
  fill_brewer(fill=fill_continuous, palette="PuOr")

3voto

Peter Punkte 4129

Wie Hadley erklärt, verschiebt die Option "Breaks" die Ticks, macht die Daten aber nicht kontinuierlich. Daher ist das Vorschneiden der Daten gemäß dem ersten Beispiel in der Frage der richtige Weg, um den Befehl scale_fill_brewer zu verwenden.

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