2017-08-02 2 views
0

Ich habe einige Skripte (vor über einem Jahr kodiert) reproduziert und herausgefunden, dass ich nicht mehr die gleichen Plots bekomme. Ich verwende den gleichen Datensatz und den gleichen Code. Der einzige Unterschied ist die Version meiner R-Installation und ggplot2 --- also nehme ich an, dass das hier das Problem ist.(ggplot2 update?) Stacked Barplot mit prozentualen Labels

Lassen Sie mich Ihnen das Problem mit ein paar albernen Plots zeigen. Wenn gestapelt barplots mit Prozentetikett würde ich so etwas wie:

ess2 <- ddply(ess, .(essround2), function(.){ 
res <- cumsum(prop.table(table(factor(.$contplt2)))) 
    res2 <- prop.table(table(factor(.$contplt2))) 
    data.frame(lab=names(res), y=c(res), res2=res2, pos=cumsum(res2)-0.5*res2) 
}) 

ggplot(ess[ess$contplt2!="NA",], aes(x=essround2))+ 
    geom_bar(aes(fill=contplt2), position="fill")+ 
    geom_text(data=ess2[ess2$lab!="NA",], 
      aes(label=round(res2.Freq, 2), x=essround2, y=pos.Freq))+ 
    labs(x="ESS Round", y="Percent")+ 
    scale_x_discrete(breaks=c("R1", "R2", "R3", "R4", "R5", "R6"), 
        labels=c("2002", "2004", "2006", "2008", "2010", "2012"))+ 
    ggtitle("Contacted politicians")+ 
    scale_fill_manual(name="Contacted politician", values=c("#31a354", "#a1d99b")) 

Das Ergebnis wäre etwas, wie:

Stacked barplot#1

Wie heute, wenn ich versuche, den exakt gleichen Code mit dem exakt gleichen Dataset, erhalte ich die folgende Handlung:

Stacked barplot#2

Wie Sie die l sehen können Abels sind nicht richtig auf den Stäben positioniert, und die Farben werden invertiert, was das Lesen der Zeichnung unangenehm macht (als ob gestapelte Barplots nicht schon peinlich genug wären).

Entschuldigung dafür, dass ich Ihnen keinen reproduzierbaren Code gebe, aber ich glaube mein Problem ist nur, dass ich meinen Code nicht aktualisiere, da ggplot2 entwickelt wurde (oder ist plyr das Problem?) Wenn Sie etwas "altes" in meinem Code finden könnten die zweite, wackelige Handlung produzierend wäre ich sehr dankbar und glücklich, von dort selbst zu untersuchen.

Danke !!!

EDIT: Dank eines Vorschlags in den Kommentaren unterscheiden sich die Prozentsätze in den Plots, weil ich verschiedene Länder (aber den gleichen Code und den gleichen Datensatz) verwendet habe. Ich habe das genaue-exakt gleiche Grundstück mit einer anderen Version von R und ggplot2 und Sie können sehen, dass das Problem weiterhin besteht: Stacked barplot#3

+0

seine Daten .... das Ja/Nein Spalte formatiert werden muss als 'factor' mit' level = c ("Ja", „Nein)' dann soll sie arbeiten – cephalopod

+0

Vielen Dank für Ihre Antwort, die zweite Handlung wurde erstellt, nachdem die Variable "contplt2" in einen Faktor mit diesen zwei Stufen umgewandelt wurde.Ich verstehe vielleicht Ihren Vorschlag nicht vollständig: Ich werde die Variable erneut faktorisieren, aber wie oben erwähnt es hatte bereits diese zwei Ebenen und eine dritte mit "NA" (die ich im Code weglasse) – YSC

+0

Stellen Sie sicher, dass die Ebenen des Faktors die richtige Reihenfolge sind – Gregor

Antwort

0

Versuchen zweimal die Etikett von contplt2 Schalten, vor und nach ess2 zu erzeugen.
Ich hoffe, es kann Ihnen helfen.

# Here I try to reproduce your dataset 
ess <- data.frame(
essround2 = c(
c(rep(2002,76),rep(2002,100-76)), 
c(rep(2004,78),rep(2004,100-78)), 
c(rep(2006,81),rep(2006,100-81)), 
c(rep(2008,79),rep(2008,100-79)), 
c(rep(2010,79),rep(2010,100-79)), 
c(rep(2012,82),rep(2012,100-82)) 
), 
contplt2 = c(
c(rep("No",76),rep("Yes",100-76)), 
c(rep("No",78),rep("Yes",100-78)), 
c(rep("No",81),rep("Yes",100-81)), 
c(rep("No",79),rep("Yes",100-79)), 
c(rep("No",79),rep("Yes",100-79)), 
c(rep("No",82),rep("Yes",100-82)) 
) 
) 

# First switch of contplt2 levels 
ess$contplt2 <- factor(ess$contplt2, levels=levels(ess$contplt2)[c(2,1)]) 

library(plyr) 
library(ggplot2) 
ess2 <- ddply(ess, .(essround2), function(.){ 
res <- cumsum(prop.table(table(factor(.$contplt2)))) 
    res2 <- prop.table(table(factor(.$contplt2))) 
    data.frame(lab=names(res), y=c(res), res2=res2, pos=cumsum(res2)-0.5*res2) 
}) 

# Second switch of contplt2 levels 
ess$contplt2 <- factor(ess$contplt2, levels=levels(ess$contplt2)[c(2,1)]) 


ggplot(ess[ess$contplt2!="NA",], aes(x=essround2))+ 
    geom_bar(aes(fill=contplt2), position="fill")+ 
    geom_text(data=ess2[ess2$lab!="NA",], 
      aes(label=round(res2.Freq, 2), x=essround2, y=pos.Freq))+ 
    labs(x="ESS Round", y="Percent")+ 
    scale_x_discrete(breaks=c("R1", "R2", "R3", "R4", "R5", "R6"), 
        labels=c("2002", "2004", "2006", "2008", "2010", "2012"))+ 
    ggtitle("Contacted politicians")+ 
    scale_fill_manual(name="Contacted politician", values=c("#a1d99b", "#31a354")) 

enter image description here

+0

Vielen Dank für Ihre Antwort. Deine Lösung hat total funktioniert, aber ich habe immer noch eine Frage: "Warum?" Was hat mich dazu gebracht, die Ebenen meiner Variablen zu berücksichtigen und neu zu bestimmen? Ist es eine _gpplot2_ Sache? Oder ist es die Art, wie _plyr_ bei der Berechnung der Prozentsätze funktioniert? Oder vielleicht verpasse ich noch etwas? Danke noch einmal. – YSC

+0

#YSC Gute Frage YSC. Ich denke, wenn Sie die Antwort finden wollen, sollten Sie die Ergebnisse von 'plyr' und' ggplot2' auf den alten und neuen R-Systemen vergleichen ... –

Verwandte Themen