2013-12-13 14 views
30

編集:この質問は重複しているとマークされていますが、問題のケースが折れ線グラフでありバーではないため応答が試行され、機能しませんでしたチャート。これらの方法を適用すると、毎年1つの5行のチャートが作成されます。これは有用ではありません。重複としてマークすることに投票した人は、この質問で提供されたサンプルデータセットでこれらのアプローチを実際に試しましたか?もしそうなら、回答として投稿してください。ggplot折れ線グラフの複数行のx軸ラベル

オリジナル質問:ggplotと同じことを行う方法(またはRの他のプロットパッケージ)を見つけようとしてマルチレベルのカテゴリaxes.I'mを可能にExcelのピボットグラフに特徴があります

次のデータセットを考えてみましょう:

set.seed(1) 
df=data.frame(year=rep(2009:2013,each=4), 
       quarter=rep(c("Q1","Q2","Q3","Q4"),5), 
       sales=40:59+rnorm(20,sd=5)) 

これは、Excelのピボットテーブルにインポートされた場合、以下のチャートを作成することは簡単です:

注意をどのようにx軸1つは四半期に、もう一つはグループ変数のために1つのレベルです。 ggplotで多レベル軸が可能ですか?

NB:同様のものを生成するファセットを持つハックがありますが、これは私が探しているものではありません。

library(ggplot2) 
ggplot(df) + 
    geom_line(aes(x=quarter,y=sales,group=year))+ 
    facet_grid(.~year,scales="free") 

答えて

39

我々は(plot.margin)デフォルトのx軸のテキスト(axis.title.x/axis.text.x = element_blank())を除去するthemeで引数を使用して、余分な余白が追加されます。

annotate(geom = "text",を使用して新しいラベルが追加されました。プロットオブジェクトをgrob(ggplot_gtable(ggplot_build()に変換することにより、x軸ラベルのクリッピングをオフにすることができます。

library(ggplot2) 
g1 <- ggplot(data = df, aes(x = interaction(year, quarter, lex.order = TRUE), 
          y = sales, group = 1)) + 
    geom_line(colour = "blue") + 
    coord_cartesian(ylim = c(35, 65), expand = FALSE) + 
    annotate(geom = "text", x = seq_len(nrow(df)), y = 34, label = df$quarter, size = 4) + 
    annotate(geom = "text", x = 2.5 + 4 * (0:4), y = 32, label = unique(df$year), size = 6) + 
    theme_bw() + 
    theme(plot.margin = unit(c(1, 1, 4, 1), "lines"), 
     axis.title.x = element_blank(), 
     axis.text.x = element_blank(), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor.x = element_blank()) 


# remove clipping of x axis labels 
g2 <- ggplot_gtable(ggplot_build(g1)) 
g2$layout$clip[g2$layout$name == "panel"] <- "off" 
grid::grid.draw(g2) 

enter image description here


ここ@ eipi10でも素敵な答えを参照してください:ヘンリクによってPrevent showing the year several times unnecessarily with time series

+0

非常に良い!さらに、 'x = interaction(年、四半期)'の使用は私には新しいものです。 – jlhoward

20

示唆したコードは、仕事をして、私をたくさん助けました!私はこのソリューションが高い価値を持っていると思います。ただし、コードの最初の行に小さな誤った記述があり、データの順序が間違っていることに注意してください。 代わり

... aes(x = interaction(year,quarter), ... 

のそれは結果のグラフィックが正しい順序でデータを持っている

... aes(x = interaction(quarter,year), ... 

でなければなりません。

enter image description here

P.S.私は編集を提案しましたが(これは今まで拒否されていました)、評判が少ししかないため、私はむしろコメントすることはできません。

関連する問題