2016-09-16 6 views
1

Ich habe den folgenden Weg verwendet, um 3 Histogramme zu erstellen. Die vierte hat plötzlich eine umgekehrte Reihenfolge auf der x-Achse. Es gibt jedoch nichts (zumindest nichts, was ich weiß) in dem Snippet, das die Reihenfolge beeinflussen sollte.x-Achse in umgekehrter Reihenfolge

The x-axis is expected to start with the lowest value on the left

Die x-Achse wird erwartet, dass mit dem niedrigsten Wert auf der linken Seite zu starten.

Hier ist der R-Code:

df <- mydata %>% mutate(length.class=cut(mydata$count,breaks = c(1,10,100,1000,10000,100000,1000000,10000000),include.lowest=TRUE,dig.lab=8)) %>% group_by(length.class) %>% summarise(count = n()) 
dftext <- as.data.frame(table(df$length.class)) 
colnames(dftext)[1] <- "x" 
dftext$lab[dftext$x == "[1,10]"] <- 1063393 
dftext$lab[dftext$x == "(10,100]"] <- 65986 
dftext$lab[dftext$x == "(100,1000]"] <- 3206 
dftext$lab[dftext$x == "(1000,10000]"] <- 386 
dftext$lab[dftext$x == "(10000,100000]"] <- 32 
dftext$lab[dftext$x == "(100000,1000000]"] <- 0 
dftext$lab[dftext$x == "(1000000,10000000]"] <- 1 

df$count[df$length.class == "(1000000,10000000]"] <- 1.1 // To make its bar visible 

fmt <- function(decimals=0){ 
    function(x) format(x,scientific = FALSE) 
} 

ggplot(df,aes(length.class,count)) + geom_bar(stat = "identity",width=0.9,fill="#999966") + scale_y_log10(labels = fmt()) + labs(x="", y="") + geom_text(data=dftext, aes(x=x, y=2, label=lab), size = 6) + theme(text = element_text(size=20)) + 
    theme(axis.line = element_line(colour = "black"), 
      panel.grid.major = element_line(color = "grey"), 
      panel.grid.minor = element_line(color = "grey"), 
      panel.background = element_blank(), 
      axis.title.x = element_text(margin=margin(t = 15, unit = "pt")), 
      axis.text.x = element_text(angle = 45, hjust = 1)) 

Was die umgekehrte Reihenfolge verursacht, und wie kann ich es loswerden?

Bearbeiten: Sie sind schnell! :) Die Antwort von @ mark-peterson sieht ziemlich solide aus, allerdings habe ich damit keine Arbeitsergebnisse bekommen. Hier sind die angeforderten Daten: mydata.csv

+3

Es würde helfen, wenn Sie eine Probe 'gab mydata' so wird Ihr Code –

+0

In der Zwischenzeit arbeiten, versuchen Sie,' scale_x_reverse() '. Es ist dafür vorbereitet. Dies könnte [das beste Duplikat sein] (http://stackoverflow.com/questions/29127035/ggplot-reflect-plot-about-y-axis/29127211#29127211) –

+0

Ich bekomme eine Warnung "Harmful Programs", wenn ich gehe Lade die Daten herunter. Können Sie eine Untermenge, die zum Plotfehler führt, "ausgeben"? –

Antwort

3

Ihre beiden Datensätze haben die gleichen Ebenen der Faktoren length.class und x, aber es gibt keine Zeile für (100000,1000000] in Ihrem ersten Datensatz, df. Dies liegt daran, dass summarise keine drop = FALSE Option hat, um alle Ebenen eines Faktors im Datensatz zu behalten, unabhängig davon, ob sie Beobachtungen haben.

Während Sie Ihr Diagramm mit dem Datensatz mit weniger Faktoren in den Zeilen erstellt haben, sieht es wie aus. Ggplot2 wird verwirrt, wenn Sie die neue Ebene hinzufügen, die mehr Faktorstufen hat und die Dinge seltsam geordnet werden.

Eine Lösung besteht darin, sicherzustellen, dass die x-Achse keine Faktorstufen unter Verwendung von drop = FALSE in scale_x_discrete fallen lässt. Auf diese Weise arbeiten Sie mit den gleichen Faktorstufen für die X-Achse für beide Datensätze und die Dinge werden nicht falsch geordnet.

+ scale_x_discrete(drop = FALSE) 
+0

So einfach und es funktioniert! Ich dachte nicht, dass es ein Problem ist, wie es vorher noch nicht war. Vielleicht, weil sich die Beschriftung geändert hat. Danke, dass Sie mir wieder geholfen haben. Sie sollten darüber nachdenken, ein R-Buch zu schreiben;) – haggis

1

Wenn Beschriftungen gegeben, geom_bar zu einem Faktor umwandelt und sortiert die Bars. Ich nehme an, dass alphabetisch und numerisch für Ihre früheren Anwendungen angepasst wurden, aber nicht für diese. Ich dachte, dass @Pierre hatte richtig über scale_x_reverse(), aber es scheint nicht auf Faktoren zu arbeiten. Stattdessen müssen Sie die Faktoraufträge selbst festlegen. Ohne Beispieldaten ist es schwer zu helfen.

Eine bessere Frage ist jedoch, warum Sie hier so viel Handarbeit machen. Die Tools ermöglichen die Automatisierung eines Großteils Ihrer Einrichtung, mit dem zusätzlichen Vorteil, Fehler zu reduzieren und den Faktor korrekt zu sortieren. Zum Beispiel mit einigen reproduzierbaren Daten:

temp <- data.frame(a = 1:999) 

temp$binned <- 
    cut(temp$a, 10^(0:3), include.lowest = TRUE) 

forText <- 
    table(temp$binned) %>% 
    as.data.frame() 

ggplot(temp, aes(x = binned)) + 
    geom_bar() + 
    geom_text(data = forText 
      , aes(x = Var1 
        , y = 75 
        , label = Freq)) 

enter image description here

Wenn Sie nur ein Bild der Verteilung möchten, können Sie noch schneller mit einem Histogramm sein:

ggplot(temp, aes(a)) + 
    geom_histogram() + 
    scale_x_log10() 

enter image description here

(Versuchen Sie in Zukunft auch, sich zu einem MWE zu strippen - Sie müssen nicht viele theme Einstellungen verwenden, wenn sie n sind ot germane zu dem Problem.)

Mit den geposteten Daten, habe ich die Handlung mit meinem Ansatz oben zu arbeiten. Beachten Sie, dass Sie die zusätzlichen Themen- und Skalierungsargumente hinzufügen müssen. Sie müssen auch die @ aosmith-Antwort auf den fehlenden Wert verwenden. (Was ich denke, bedeutet, dass @ AOSMITH Antwort Ihre Frage wirklich beantwortet, während mir für nur ein guter Rat sein kann, wie dies schnell mehr zu tun.)

mydata$binned <- 
    cut(mydata$count,breaks = c(1,10,100,1000,10000,100000,1000000,10000000),include.lowest=TRUE,dig.lab=8) 

forText <- 
    table(mydata$binned) %>% 
    as.data.frame() 

ggplot(mydata, aes(x = binned)) + 
    geom_bar() + 
    geom_text(data = forText 
      , aes(x = Var1 
        , y = 75 
        , label = Freq)) + 
    scale_x_discrete(drop = FALSE) 
+0

Vielen Dank! Leider klappt es nicht. Ihr Befehl short cut erstellt eine 3. Spalte in meinem Datenrahmen, die 3 NAs für [1,10] bis (100,1000) hat und dann mit (100,1e + 03) für die Zeile (1000,100000) bis [ 1,10] für die höchste Reihe (1m, 10m). – haggis

+0

Was meinst du mit MWE? Google konnte mir dabei nicht helfen. – haggis

+0

MWE ist ein Minimal-Arbeitsbeispiel. Hier ist die [Stack Overflow Beschreibung] (http: //stackoverflow.com/help/mcve) und [Hier] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) ist die R-spezifische Information. Die Schnittpunkte, die ich verwendet habe, sind spezifisch für meine Beispieldaten.Wenn Sie niedrigere (oder höhere) Werte haben, müssen Sie sie hinzufügen - Sie sollten die gleichen Pausen wie in Ihrer ursprünglichen Antwort verwenden können. –

Verwandte Themen