2017-06-19 3 views
1

Ich versuche ein Histogramm zu erstellen, das auf einen Teil der Daten gezoomt wird. Mein Problem ist, dass ich alles, was außerhalb der Reichweite ist, in die letzte Kategorie "10+" einordnen möchte. Ist es möglich, es mit ggplot2 zu tun?Gruppieren von Daten außerhalb der Grenzwerte im Histogramm mit ggplot2

Beispielcode:

x <- data.frame(runif(10000, 0, 15)) 
ggplot(x, aes(runif.10000..0..15.)) + 
    geom_histogram(aes(y = (..count..)/sum(..count..)), colour = "grey50", binwidth = 1) + 
    scale_y_continuous(labels = percent) + 
    coord_cartesian(xlim=c(0, 10)) + 
    scale_x_continuous(breaks = 0:10) 

Hier ist, wie das Histogramm jetzt aussieht: How the histogram looks now

Und hier ist, wie ich es betrachten möchte: How the histogram should look

Wahrscheinlich ist es possibile zu tue es, indem ich ifelses verschachtel, aber da ich in meinem Problem mehr Fälle habe, gibt es eine Möglichkeit für ggplot, es zu tun?

+2

Die übliche Strategie Mit ggplot2 können Sie die Daten ändern, wenn Sie diese Art von Änderung wünschen. So können Sie beispielsweise eine Variable mit der Kategorie "10+" erstellen, in der alle Werte in diesem und in diesem Bin enthalten sind. Plotten ist dann einfach. (Auch "grupping"? Sie meinen, "Gruppierung"?) – RobertMc

+0

oh! Entschuldigung für meinen Rechtschreibfehler! –

+0

kein Problem! Ich wollte nur sicherstellen, dass es nicht etwas anderes ist :-) – RobertMc

Antwort

1

Sie könnten forcats und dplyr verwenden, um die Werte effizient zu kategorisieren, die letzten "Ebenen" zu aggregieren und dann die Prozentwerte vor dem Diagramm zu berechnen. So etwas sollte funktionieren:

library(forcats) 
library(dplyr) 
library(ggplot2) 

x <- data.frame(x = runif(10000, 0, 15)) 
x2 <- x %>% 
    mutate(x_grp = cut(x, breaks = c(seq(0,15,1)))) %>% 
    mutate(x_grp = fct_collapse(x_grp, other = levels(x_grp)[10:15])) %>% 
    group_by(x_grp) %>% 
    dplyr::summarize(count = n()) 

ggplot(x2, aes(x = x_grp, y = count/10000)) + 
    geom_bar(stat = "identity", colour = "grey50") + 
    scale_y_continuous(labels = percent) 

jedoch der resultierende Graph aus Ihrem Beispiel ist sehr unterschiedlich, aber ich denke, es ist richtig, da wir eine gleichmäßige Verteilung bauen:

enter image description here

Verwandte Themen