2017-08-25 24 views
1

Ich habe eine generische plot_data(data) Methode. Manchmal haben die eingehenden Daten alle NAs für die Variable I für füllen verwenden und dies bewirkt, dass der Fehlerggplot2 Fehler, wenn Füllwerte alle sind NA: Fehler in seq.default (h [1], h [2], length.out = n):

Error in seq.default(h[1], h[2], length.out = n) : 
    'to' must be a finite number 

Zum Beispiel:

df <- data.frame(
    x = c(1, 2, 3, 4), 
    y = c(10, 15, 20, 25), 
    foo = factor(c(NA, NA, NA, "yes"), levels=c("yes", "no")) 
) 

ggplot(df, aes(x=x, y=y, fill=foo))+geom_bar(stat = "identity") # works 
ggplot(df[1:3, ], aes(x=x, y=y, fill=foo))+geom_bar(stat = "identity") # error 

Ich sehe nicht, warum die Handlung soll nicht machen im Fall 2 (nur mit allen grauen Balken). Gibt es einen einfachen Weg, dies zu überwinden?

Antwort

1

Art ekligen ...

ggplot(df[1:3,], aes(x=x, y=y, if(!all(is.na(foo))){fill=foo})) + 
    geom_bar(stat = "identity") 
0

grau bedeutet keine Füllung. Zum Beispiel wird die folgenden eine graue Zeichnung geben:

ggplot(df, aes(x=x, y=y))+geom_bar(stat = "identity") In Ihrem Beispiel, wenn die Zeile mit foo = "yes" enthalten war, wurden die Zeilen mit foo = NA eigentlich nicht mit Farben gefüllt, und nur die letzte Reihe gefüllt war. Wenn die letzte Zeile jedoch ausgeschlossen wurde, werden alle Werte in der Spalte foo zu NA. Wie der Fehler andeutet, muss das Ende von to im Füllmapping eine endliche Zahl sein, nicht NA. Eine Möglichkeit, dies zu umgehen, ist NA in Strings zu konvertieren, wie zB:

ggplot(df[1:3, ], aes(x=x, y=y, fill=ifelse(is.na(foo), "NA", foo)))+geom_bar(stat = "identity")

2

Sie fct_explicit_na vom forcats Paket verwenden kann, um Werte eine explizite Faktor Ebene zu machen fehlt. (Beachten Sie, dass addNA aus dem Basispaket wird hier nicht arbeiten, letztere fügt NA als Ebene, sondern bewirkt, dass es nicht in Parzellen zeigen.)

ggplot(df[1:3, ], 
     aes(x=x, y=y, fill=forcats::fct_explicit_na(foo)))+ 
    geom_bar(stat = "identity") 

Abgesehen: Wenn Sie andere Werte zu tun haben & wollen nur eine andere Standardfarbe für NA, können Sie die Option in scale_fill_discrete(na.value = "some colour other than grey")

ändern
Verwandte Themen