2016-10-28 4 views
0

Ich versuche, eine Karte mit ggplot auf einem Faktor-Typ-Vektor von 0 bis 4, die ich farblich codiert. Der Vektor befindet sich in dem Datenrahmen, den ich spat.dataframe nannte, und der Vektor ist qt.R: Gibt es eine Möglichkeit, ungenutzte Datenebenen in einer ggplot-Legende hinzuzufügen?

enter image description here

# plot 
ggplot(spat.dataframe, aes(long,lat,group=group)) + # the data 
    geom_polygon(aes(fill=as.factor(qt))) + # make polygons 
    scale_fill_manual(values = c("0"="#F0F0F0","1"="green","2"="red","3"="blue","4"="purple"), 
        labels = c(paste0("white (",length(spat.dataframe[spat.dataframe$qt==0,]),")"), 
           paste0("green (",length(spat.dataframe[spat.dataframe$qt==1,]),")"), 
           paste0("red (",length(spat.dataframe[spat.dataframe$qt==2,]),")"), 
           paste0("blue (",length(spat.dataframe[spat.dataframe$qt==3,]),")"), 
           paste0("pink (",length(spat.dataframe[spat.dataframe$qt==4,]),")")), 
         drop=F, 
         name=NULL) + 
    theme(line = element_blank(), # remove the background, tickmarks, etc 
      axis.text = element_blank(), 
      axis.title = element_blank(), 
      panel.background = element_blank()) + 
    ggtitle(title) + 
    geom_path(colour = "#6b6b6b", size = .5) + 
    coord_equal() 

Mein Problem liegt bei dem Legende Teil, weil das, was ich tun möchte, ist sogar alle der Legende Optionen angezeigt werden, ob es einen in dem Vektor aufgelistet Arent. Also die Werte mit den Farben blau und lila. Es mag ein bisschen wie eine Strecke zu versuchen scheinen, aber ich will es auf meiner Figur, so dass ich auch die Anzahl der möglichen Werte und die Anzahl der Polygone anzeigen kann, die mit diesem Wert verbunden sind. So sind für die Werte 3 und 4 in meinem Vektor qt beide Null (d. H. blue (0) und purple (0)).

Alle Vorschläge würden sehr geschätzt werden. Vielen Dank.

+1

Wenn die Werte existieren, aber Sie wollen, dass sie verstecken, können Sie die Farbe festgelegt für diese Werte auf einen Wert mit einem Alpha (zwei zusätzliche Ziffern auf einer hexadezimalen Farbe) von "00", dh vollständig transparent, z 'ggplot (mtcars, aes (wt, mpg, Farbe = Faktor (cyl))) + geom_point() + scale_color_manual (Werte = c ('blau', '# 00000000', 'rot'))'. Wenn die Werte nicht existieren, können Sie vermutlich ein paar falsche einhacken, damit die Levels erscheinen, aber es könnte einen besseren Weg geben. – alistaire

+0

Danke für die Antwort! Mein grundlegendes Ziel war es, die Optionen unabhängig davon anzuzeigen, ob sie auf der Karte waren. Auf einer anderen Anmerkung erwarte ich, dass ich schließlich Ihren ersten Vorschlag auf ein anderes Problem später später verwenden muss, also danke dafür. Du hattest recht, dass ich einen Weg finden musste, um es zu hacken, und ich denke, Zachs Antwort hat genau das getan. Danke noch einmal! – JellisHeRo

Antwort

2

Hier ist ein Arbeitsbeispiel mit mtcars, entnommen aus der ggplot2 Dokumentation here. Sie können nämlich scale_color_manual mit dem Argument limits stattdessen verwenden.

Edit nach Kommentar unten: die limits Argument ist was wichtig ist, können Sie es sowohl scale_color_manual oder scale_fill_manual übergeben.

cols <- c("8" = "red","4" = "blue","6" = "darkgreen", "10" = "orange") 
plot <- ggplot(mtcars, aes(x = mpg, y = wt, colour = factor(cyl))) + geom_point() 
plot + scale_color_manual(values = cols, 
          limits = c("4", "6", "8", "10"), 
          labels = c("this", "is", "my", "test")) 

enter image description here

Das sollte genug sein, damit Sie es Ihr Problem anzupassen. Es ist schwer für mich sicher sein, dies Ihre tatsächliche Datenmenge, ohne Arbeit, aber hier ist eine Lösung, die sollte Arbeit:

cols= c("0"="#F0F0F0","1"="green","2"="red","3"="blue","4"="purple") 

ggplot(spat.dataframe, aes(long,lat,group=group)) + # the data 
    geom_polygon(aes(fill=as.factor(qt))) + # make polygons 
    scale_fill_manual(limits = c("0", "1", "2", "3", "4") 
        values = cols, 
        labels = c(paste0("white (",length(spat.dataframe[spat.dataframe$qt==0,]),")"), 
           paste0("green (",length(spat.dataframe[spat.dataframe$qt==1,]),")"), 
           paste0("red (",length(spat.dataframe[spat.dataframe$qt==2,]),")"), 
           paste0("blue (",length(spat.dataframe[spat.dataframe$qt==3,]),")"), 
           paste0("pink (",length(spat.dataframe[spat.dataframe$qt==4,]),")")), 
        drop=F, 
        name=NULL) + 
    theme(line = element_blank(), # remove the background, tickmarks, etc 
    axis.text = element_blank(), 
    axis.title = element_blank(), 
    panel.background = element_blank()) + 
    ggtitle(title) + 
    geom_path(colour = "#6b6b6b", size = .5) + 
    coord_equal() 
+0

Danke für die Antwort! Ihr Beispiel funktioniert, der einzige Unterschied besteht darin, dass ich die Polygone durch die verwendeten Werte gefüllt habe. Ich muss 'scale_fill_manual' anstelle von' scale_color_manual' verwenden, was mir eine andere Farbe im Graphen geben würde. Nur für zukünftige Referenz, wenn jemand anderes es wissen möchte. Danke noch einmal! – JellisHeRo

Verwandte Themen