2017-02-27 8 views
0

Ich möchte zwei nebeneinander Kreisdiagramme mit ggplot2 machen, aber habe Schwierigkeiten, beide Kreisdiagramme "ganze" Hier ist ein Beispiel für meine Daten.Mehrere ggplot Kreisdiagramme mit ganzen Kuchen

> test 
    New York Berlin   group 
1  474 755 Never Visited 
2  214 123 Visited Once 
3  66 122 Visited > 1 
4  142  64  Resided 

Wenn ich versuche:

pie <- ggplot(data = melted2, aes(x = "", y = Cnt, fill = Type)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(label = Cnt), position = position_stack(vjust = 0.5)) + 
    coord_polar(theta = "y") + 
    facet_grid(facets=. ~ City) + 
    theme(
    axis.title.x = element_blank(), 
    axis.title.y = element_blank()) + theme(legend.position='bottom') + guides(fill=guide_legend(nrow=2,byrow=TRUE)) 

pie 

Aber das erzeugt: enter image description here

EDIT:Changing facet_grid(facets=. ~ City)-facet_grid(City ~ ., scales = "free") funktioniert, aber es produziert vertikal Diagramme wie folgt gestapelt:

enter image description here

Haben Sie Vorschläge, wie Sie zwei ganze Tortendiagramme erstellen können, die horizontal sind? Hier

die Daten:

> dput(melted2) 
structure(list(Type = structure(c(1L, 4L, 3L, 2L, 1L, 4L, 3L, 
2L), .Label = c("Never Visited", "Resided", "Visited > 1", "Visited Once" 
), class = "factor"), City = structure(c(1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L), .Label = c("New York", "Berlin"), class = "factor"), 
    Cnt = c(474L, 214L, 66L, 142L, 755L, 123L, 122L, 64L)), row.names = c(NA, 
-8L), .Names = c("Type", "City", "Cnt"), class = "data.frame") 
+0

Vielleicht möchten Sie 'position_fill' anstelle von' position_stack' wie hier [hier] (http://stackoverflow.com/questions/18537378/faceted-piechart-with-ggplot2)? – aosmith

+0

'position_stack' platziert die Etiketten an der richtigen Stelle, das wird nicht funktionieren –

+1

Haben Sie es versucht? Weil ich 'position_fill' gefunden habe, um den Text recht gut an den richtigen Platz zu bringen. – aosmith

Antwort

4

T zeigt relative Anteile für jede Facette, eine Option ist position_fill zu verwenden. Es funktioniert sowohl für die Balken als auch für den Textstapel.

ggplot(data = melted2, aes(x = "", y = Cnt, fill = Type)) + 
    geom_bar(stat = "identity", position = position_fill()) + 
    geom_text(aes(label = Cnt), position = position_fill(vjust = 0.5)) + 
    coord_polar(theta = "y") + 
    facet_wrap(~ City) + 
    theme(
     axis.title.x = element_blank(), 
     axis.title.y = element_blank()) + theme(legend.position='bottom') + guides(fill=guide_legend(nrow=2,byrow=TRUE)) 

enter image description here

+0

Dies ist wahrscheinlich die beste Option. Vielleicht fügen Sie 'scale_y_continuous (labels = scales :: percent)' hinzu. Nur eine andere Option sehe ich darin, die Facettierung aufzugeben und separate Plots zu kombinieren. – Axeman

0

Vielleicht ist es das, was Sie suchen (in Prozent statt Zählungen angezeigt):

library(tidyverse) 
melted3 <- melted2 %>% group_by(City) %>% mutate(Percent = Cnt/sum(Cnt)) 

pie <- ggplot(data = melted3, aes(x = "", y = Percent, fill = Type)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(label = round(Percent, digits = 2)), position = position_stack(vjust = 0.5)) + 
    coord_polar(theta = "y") + 
    facet_grid(facets = . ~ City) + 
    theme(
    axis.title.x = element_blank(), 
    axis.title.y = element_blank()) + theme(legend.position = 'bottom') +  guides(fill = guide_legend(nrow = 2, byrow = TRUE)) 
+0

Runden Sie die Prozentsätze nicht selbst ab, sondern runden Sie die Beschriftungen ab (oder lassen Sie ggplot mit 'position_fill' arbeiten). – Axeman

+0

@Axeman, aktualisiert nach Ihrem Feedback. – jsb

2

Wenn Sie die Proportionen ggplot2 füttern, es funktioniert:

library(dplyr); library(ggplot2) 
melted2 <- melted2 %>% group_by(City) %>% mutate(per = Cnt/sum(Cnt)) 
pie <- ggplot(data = melted2, aes(x = "", y = per, fill = Type)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(label = Cnt), position = position_stack(vjust = 0.5)) + 
    coord_polar(theta = "y") + 
    facet_grid(facets=. ~ City) + 
    theme(
    axis.title.x = element_blank(), 
    axis.title.y = element_blank()) + theme(legend.position='bottom') + guides(fill=guide_legend(nrow=2,byrow=TRUE)) 

pie 

enter image description here

Verwandte Themen