2017-06-27 18 views
1

私はansweringでした。question私は奇妙な問題に直面しました。ggplotファセットグリッドの軸ラベルが正しくない

ggplot2で棒グラフを作成し、x軸ラベルをGroup列の最後の文字にしたいとします。この目的のためにsubstring(Group, 3, 3)を使用してください:

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

しかし、私は以下のように ggplotでそれを使用する場合、それは最後の目盛りで 1代わりの 4を出力します。

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

私はそれがlabels =unique(substring(Group, 3, 3)を使って仕事を得ることができますが、誰かが何が起こっているのかを説明しますか?

データ:

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 

答えて

2

私は@グレゴールの答えは行く方法だと思うが、私はエラーを説明することができます。 groupの前にdf$を追加しても、記述した動作が得られます。

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")) 

ができます:: enter image description here

をあなたが見ることができるように、ここではそれは正しく「4」を与えるあなたはスケールが異なりせてはいけない理由かどうかを確認することができます。ただし、ラベルを直接設定する場合は、スケールを変えることを許可するときに、ラベルを各ファセットごとに(順番に)設定しています。本質的には、毎回ラベルを「1,2,3,1,2,1,2,3,4」に設定しますが、最初の数文字だけを使用します。

あなたが近いあなたの現在に固執する場合は、例えば、ブレークを設定することも必要があります:

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")) 

私は `のdf $を使用する場合、どのよう

enter image description here

3

のは、簡素化し、新鮮Rセッションで起動してみましょう:

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 

scale_x_discrete引数は内部データ環境にアクセスすることはできません。 (安全面では、データ列を安全に参照できるのはggplot2です。aes()の内部と、ファセットコールのformulaの一部です)。あなたのコードは、地球環境全体のGroupオブジェクトを見つける必要があります。これがあなたの質問に間違いを起こさない理由ですが、私は新鮮なRセッションを使用しています。

通常ggplot2はあなたがやりたいようにする最も簡単な方法は、それはあなたが望むものを一致するように、あなたのデータを修正することです。この時点で

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)) 

あなたが後ろにあなた面やテーマを追加することができ、すべてう作業。

+0

を与えますグループ '?私はこれを試みたが、同じ結果を得る。それ以外は 'labels = c(" 1 "、" 2 "、" 3 "、" 1 "、" 2 "、" 1 "、" 2 "、" 3 "、" 4 ")私は再び同じプロットを得る?それは奇妙なことですね。 – Masoud

+1

4つの異なる値を持つ軸があり、9つのラベルを指定します。それはあなたが提供する最初の4つのラベルを使用します。驚くべきことは何ですか? – Gregor

+0

おそらく素朴な質問ですが、なぜ4つの異なる値がありますか? – Masoud

関連する問題