2017-06-27 4 views
1

Ich war answering diese question, dass ich ein seltsames Problem konfrontiert;Falsche Achsenbeschriftungen für ggplot Facettengitter

Ich möchte ein Balkendiagramm mit ggplot2 erstellen und haben x Achsenbeschriftungen als das letzte Zeichen der Spalte Group. Verwenden Sie substring(Group, 3, 3) zu diesem Zweck:

substring(df$Group, 3, 3) 
# [1] "1" "2" "3" "1" "2" "1" "2" "3" "4" 

Aber wenn ich es verwende in ggplot wie unten, druckt es 1 statt 4 am letzten Tick;

ggplot(data=df, aes(x=Group, y=Value)) + 
    geom_bar(stat="identity") + 
    scale_x_discrete(labels = substring(Group, 3, 3), expand=c(0.1,0.1)) + 
    facet_grid(~ substring(Group, 1, 1), space="free_x", scales="free_x", switch="x") + 
    theme_bw() + 
    theme(strip.placement = "outside", 
     strip.background = element_rect(fill=NA,colour="grey50"), 
     panel.spacing=unit(0,"cm")) 

barplot

Ich kann es mithilfe labels =unique(substring(Group, 3, 3) zu arbeiten, aber würde jemand erklären, was los ist?

Daten:

df <- structure(list(Group = structure(1:9, .Label = c("1_1", "1_2", 
    "1_3", "2_1", "2_2", "3_1", "3_2", "3_3", "3_4"), class = "factor"), 
     Value = c(-1.23, 2.34, 0.56, 1.87, -2.4, 5.54, -0.98, -2.31, 
     6)), .Names = c("Group", "Value"), row.names = c(NA, -9L), class = "data.frame") 

# > df 

# Group Value 
# 1 1_1 -1.23 
# 2 1_2 2.34 
# 3 1_3 0.56 
# 4 2_1 1.87 
# 5 2_2 -2.40 
# 6 3_1 5.54 
# 7 3_2 -0.98 
# 8 3_3 -2.31 
# 9 3_4 6.00 

Antwort

2

Ich denke, dass @ Gregor's Antwort ist der Weg zu gehen, aber ich kann den Fehler erklären. Selbst wenn Sie df$ vor group hinzufügen, erhalten Sie das von Ihnen beschriebene Verhalten. Sie können sehen, warum, wenn Sie lassen Sie sich nicht die Waage variieren:

ggplot(data=df, aes(x=Group, y=Value)) + 
    geom_bar(stat="identity") + 
    scale_x_discrete(labels = substring(df$Group, 3, 3), expand=c(0.1,0.1)) + 
    facet_grid(~ substring(Group, 1, 1), switch="x") + 
    theme_bw() + 
    theme(strip.placement = "outside", 
     strip.background = element_rect(fill=NA,colour="grey50"), 
     panel.spacing=unit(0,"cm")) 

gibt: enter image description here

Wie Sie sehen können, hier gibt es die „4“ richtig. Wenn Sie die Beschriftungen jedoch direkt festlegen, werden sie für jede Facette einzeln (in der Reihenfolge) festgelegt, wenn Sie die Skalierung variieren lassen. Im Wesentlichen werden die Bezeichnungen jedes Mal auf "1, 2, 3, 1, 2, 1, 2, 3, 4" gesetzt, aber nur die ersten.

Wenn Sie näher an Ihren Strom halten wollen, müssen Sie auch die Pausen einstellen müssen, zB:

ggplot(data=df, aes(x=Group, y=Value)) + 
    geom_bar(stat="identity") + 
    scale_x_discrete(breaks = df$Group, labels = substring(df$Group, 3, 3), expand=c(0.1,0.1)) + 
    facet_grid(~ substring(Group, 1, 1), space="free_x", scales="free_x", switch="x") + 
    theme_bw() + 
    theme(strip.placement = "outside", 
     strip.background = element_rect(fill=NA,colour="grey50"), 
     panel.spacing=unit(0,"cm")) 

Welche gibt

enter image description here

3

sie vereinfachen und in einer frischen R-Sitzung starten:

df <- structure(list(Group = structure(1:9, .Label = c("1_1", "1_2", 
                 "1_3", "2_1", "2_2", "3_1", "3_2", "3_3", "3_4"), class = "factor"), 
        Value = c(-1.23, 2.34, 0.56, 1.87, -2.4, 5.54, -0.98, -2.31, 
           6)), .Names = c("Group", "Value"), row.names = c(NA, -9L), class = "data.frame") 

library(ggplot2) 
ggplot(data=df, aes(x=Group, y=Value)) + 
    geom_bar(stat="identity") + 
    scale_x_discrete(labels = substring(Group, 3, 3), expand=c(0.1,0.1)) 
# Error in substring(Group, 3, 3) : object 'Group' not found 

Die scale_x_discrete Argumente haben keinen Zugriff auf die in-Datenumgebung. (Ich denke, es gibt nur zwei Stellen, die Sie Daten Spalte in ggplot2 sicher verweisen können: innerhalb aes() und als Teil eines formula in einem facettierenden Aufruf.) Ihr Code muss ein Group Objekt aus Ihrer globalen Umgebung finden, die wahrscheinlich die ganze Spalte ist . Aus diesem Grund erhalten Sie in Ihrer Frage keinen Fehler, aber ich verwende eine neue R-Sitzung.

Normalerweise ist der einfachste Weg, ggplot2 tun, was Sie machen wollen, ist Ihre Daten zu beheben, so dass es passt, was Sie wollen:

df$group_last = substring(df$Group, 3, 3) 
ggplot(data=df, aes(x=group_last, y=Value)) + 
    geom_bar(stat="identity") + 
    scale_x_discrete(expand=c(0.1,0.1)) 

An dieser Stelle Sie Ihre Facetten und Thematisierung zurück und alles wird hinzufügen Arbeit.

+0

Was passiert, wenn ich 'df $ verwenden Gruppe?Ich habe das versucht und bekomme immer noch das gleiche Ergebnis. Abgesehen davon habe ich sogar "labels = c (" 1 "," 2 "," 3 "," 1 "," 2 "," 1 "," 2 "," 3 "," 4 ")' aber Ich bekomme wieder die gleiche Handlung? Es ist seltsam, oder? – Masoud

+1

Sie haben eine Achse mit 4 verschiedenen Werten und Sie stellen 9 Beschriftungen zur Verfügung. Es verwendet die ersten vier Etiketten, die Sie bereitstellen. Was ist überraschend? – Gregor

+0

wahrscheinlich eine naive Frage, aber warum habe ich 4 verschiedene Werte? – Masoud

Verwandte Themen