2017-03-22 8 views
0

Ich habe folgende R-Code, um zu bestellen, wo ich die Daten transformieren und um sie dann nach einer bestimmten Spalte:Wie ggplot machen ein gestapeltes Balkendiagramm

df2 <- df %>% 
group_by(V2, news) %>% 
tally() %>% 
complete(news, fill = list(n = 0)) %>% 
mutate(percentage = n/sum(n) * 100) 

df22 <- df2[order(df2$news, -df2$percentage),] 

ich die bestellten Daten „df22“ anwenden möchten in ggplot:

ggplot(df22, aes(x = V2, y = percentage, fill = factor(news, labels = c("Read","Otherwise")))) + 
geom_bar(stat = "identity", position = "fill", width = .7) + 
coord_flip() + guides(fill = guide_legend(title = "Online News")) + 
scale_fill_grey(start = .1, end = .6) + xlab("Country") + ylab("Share") 

Leider ggplot gibt mir noch ein Grundstück ohne Bestellung:

enter image description here

Weiß jemand, was mit meinem Code falsch ist? Dies ist nicht das Gleiche wie ein Balkendiagramm mit einem einzelnen Wert pro Balken wie hier Reorder bars in geom_bar ggplot2 zu bestellen. Ich versuche, den Einkaufswagen nach einer bestimmten Kategorie eines Faktors zu sortieren. Insbesondere möchte ich Länder mit dem größten Anteil von Read News zuerst sehen. Hier

die Daten:

   V2  news  n percentage 
1 United States News Read 1583 1.845139 
2 Netherlands News Read 1536 1.790356 
3  Germany News Read 1417 1.651650 
4  Singapore News Read 1335 1.556071 
5 United States Otherwise 581 0.6772114 
6 Netherlands Otherwise 350 0.4079587 
7  Germany Otherwise 623 0.7261665  
8  Singapore Otherwise 635 0.7401536 

ich verwendet, um die folgenden R-Code:

df2 <- df %>% 
group_by(V2, news) %>% 
tally() %>% 
complete(news, fill = list(n = 114)) %>% 
mutate(percentage = n/sum(n) * 100) 

df2 <- df2[order(df2$news, -df2$percentage),] 

df2 <- df2 %>% group_by(news, percentage) %>% arrange(desc(percentage)) 
df2$V2 <- factor(df2$V2, levels = unique(df2$V2)) 


ggplot(df2, aes(x = V2, y = percentage, fill = news))+ 
geom_bar(stat = "identity", position = "stack") + 
guides(fill = guide_legend(title = "Online News")) + 
coord_flip() + 
scale_x_discrete(limits = rev(levels(df2$V2))) 

Alles war in Ordnung, außer in einigen Ländern den Auftrag aus irgendeinem Grund brechen, und ich verstehe nicht, warum. Hier ist das Bild:

enter image description here

Was ich mit den Andeutungen von Jungs habe, habe ich "arrangieren" Befehl statt dplyr

df4 <- arrange(df2, news, desc(percentage)) 

Hier ist das Ergebnis:

enter image description here

+1

Versuchen ein reproduzierbares Beispiel zu liefern. Wo ist dein data.frame 'df'? – aelwan

+0

@aelwan Ich habe mehr als 100 Beobachtungen. Wie soll ich es hier hochladen? – Laura

+0

@Jaap das ist eine ganz andere Frage von dem, was Sie in http://stackoverflow.com/questions/25664007/reorder-bars-in-geom-bar-ggplot2 – Laura

Antwort

4

Hier ist, was ich habe - hoffe, das ist nützlich. Wie bereits erwähnt @ Axeman - der Trick ist, die Etiketten als Faktoren neu zu ordnen. Bei Verwendung von coord_flip() werden die Etiketten in umgekehrter Richtung neu angeordnet, sodass scale_x_discrete() benötigt wird.

Ich benutze die kleine Probe, die Sie zur Verfügung gestellt haben.

library(ggplot2) 
library(dplyr) 

df <- read.csv("data.csv") 

df <- arrange(df, news, desc(Percentage)) 
df$V2 <- factor(df$V2, levels = unique(df$V2)) 

ggplot(df, aes(x = V2, y = Percentage, fill = news))+ 
    geom_bar(stat = "identity", position = "stack") + 
    guides(fill = guide_legend(title = "Online News")) + 
    coord_flip() + 
    scale_x_discrete(limits = rev(levels(df$V2))) 

enter image description here

+1

Oder verwende direkt 'df $ V2 <- Faktor (df $ V2, levels = rev (unique (df $ V2)))'. – Axeman

+0

Danke! Obwohl einige Länder immer noch die Ordnung brechen (ich habe ungefähr 50 Länder). Ich habe ein Bild des obigen Ergebnisses hochgeladen. – Laura

+0

Ich werde nicht ganz sicher sein, warum das passiert, bis ich sehe, dass der gesamte Datensatz – royr2

Verwandte Themen