2017-01-28 2 views
2

Da ich über die Mathematik last time I tried asking this verwirrt war, hier ist ein weiterer Versuch. Ich möchte ein Histogramm mit einer geglätteten Verteilungsanpassung kombinieren. Und ich möchte, dass die y-Achse in Prozent ist.Scale geom_density zu geom_bar mit Prozent auf y

Ich kann keine gute Weg finden, um dieses Ergebnis zu erhalten. Letztes Mal habe ich einen Weg gefunden, die geom_bar auf den gleichen Maßstab wie geom_density zu skalieren, aber das ist das Gegenteil von dem, was ich wollte.

Meine aktuellen Code erzeugt diese Ausgabe:

ggplot2::ggplot(iris, aes(Sepal.Length)) + 
    geom_bar(stat="bin", aes(y=..density..)) + 
    geom_density() 

enter image description here

Die Dichte und die Bar y-Werte übereinstimmen, aber die Skalierung ist unsinnig. Ich will Prozent auf den y-Achsen, nicht gut, die Dichte.

Einige neue Versuche. Wir beginnen mit einem Balkendiagramm geändert Prozentsätze zu zeigen, statt zählt:

gg = ggplot2::ggplot(iris, aes(Sepal.Length)) + 
    geom_bar(aes(y = ..count../sum(..count..))) + 
    scale_y_continuous(name = "%", labels=scales::percent) 

enter image description here

Dann versuchen wir, einen geom_density hinzufügen, dass es irgendwie richtig zu skalieren erhalten:

gg + geom_density() 

enter image description here

gg + geom_density(aes(y=..count..)) 

enter image description here

gg + geom_density(aes(y=..scaled..)) 

enter image description here

gg + geom_density(aes(y=..density..)) 

Gleiche wie die erste.

gg + geom_density(aes(y = ..count../sum(..count..))) 

enter image description here

gg + geom_density(aes(y = ..count../n)) 

enter image description here

scheint off-Faktor von etwa 10 zu sein ...

gg + geom_density(aes(y = ..count../n/10)) 

gleiche wie:

gg + geom_density(aes(y = ..density../10)) 

enter image description here

Aber Ad-hoc-Zahlen eingefügt scheint wie eine schlechte Idee.

Ein nützlicher Trick besteht darin, die berechneten Werte des Diagramms zu überprüfen. Diese werden normalerweise nicht im Objekt gespeichert, wenn eines gespeichert wird. Allerdings kann man verwenden:

gg_data = ggplot_build(gg + geom_density()) 
gg_data$data[[2]] %>% View 

Da wir die Dichte wissen passen um x = 6 sollte etwa 0,04 (4%), können wir um für ggplot2 berechneten Werte suchen, die uns dorthin zu gelangen, und die einzige Was ich sehe, ist Dichte/10.

Wie bekomme ich geom_density passen auf die gleiche y-Achse skalieren wie die modifizierte geom_bar?

Bonus Frage: Warum sind die Gruppierungen der Bars unterschiedlich? Die aktuelle Funktion hat keine Leerzeichen zwischen Balken.

+0

Der Kommentar, den Sie letzte Mal bekam das ist, dass Sie versuchen, auf der gleichen Kurve, die zwei Achsen verwenden immer noch gilt. Ich glaube, dass ggplot dies gerade erst unterstützt. Auch im neueren ggplot sind sie viel klarer über die Unterscheidung zwischen Histogrammen und Balkendiagrammen und Sie wollen wahrscheinlich ein Histogramm. Ich denke, das grundlegende Problem ist, dass Sie denken, dass eine Dichte ein Prozent ist, aber es ist nicht. Ich bin mir wirklich nicht sicher, warum du sagst, das erste sei unsinnig. – Elin

+0

Ich möchte eine Y-Achse, die für die meisten Leser Sinn macht, nicht Dichte, die für die meisten Leser keinen Sinn macht. – Deleet

Antwort

1

ist eine einfache Lösung:

library(scales) # ! important 
library(ggplot2) 
ggplot(iris, aes(Sepal.Length)) + 
stat_bin(aes(y=..density..), breaks = seq(min(iris$Sepal.Length), max(iris$Sepal.Length), by = .1), color="white") + 
geom_line(stat="density", size = 1) + 
scale_y_continuous(labels = percent, name = "percent") + 
theme_classic() 

Plot is here

+0

Die Ergebnisse sind falsch. – Deleet

+0

Vielen Dank für den Hinweis. Ich habe vergessen, hier anzugeben ** Bibliothek (Skalen) **. Ich habe den Code korrigiert, jetzt sollte es funktionieren! – AnnaZ

0

Versuchen Sie, diese

ggplot2::ggplot(iris, aes(x=Sepal.Length)) + 
geom_histogram(stat="bin", binwidth = .1, aes(y=..density..)) + 
geom_density()+ 
scale_y_continuous(breaks = c(0, .1, .2,.3,.4,.5,.6), 
     labels =c ("0", "1%", "2%", "3%", "4%", "5%", "6%")) + 
ylab("Percent of Irises") + 
xlab("Sepal Length in Bins of .1 cm") 

Ich denke, Ihr erstes Beispiel ist das, was Sie wollen, Sie wollen einfach nur die Etiketten ändern, um es scheint, wie es Prozent, also genau das tun und nicht herumspielen. Hier

Verwandte Themen