2013-05-21 8 views
10

ggplot2グラフに簡単にテーブルを追加できますか?私はこのテーブルの値をscale_x_continuous()で指定されているのと同じブレークポイントで各行の値にしたいが、その隣にはパーセンテージ(%)記号がある。私の最終目標は、以下のようなイメージを作成することです。しかし、私はテーブルを追加する方法を知らない。ggplot2出力にテーブルを追加するにはどうしたらいいですか?

gains chart example

次のコードブロックがちょうどggplot2で2つの行を作成し、例を私に提供するのに十分でなければなりません:

require(ggplot2) 
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10)) 
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) + geom_line(aes(y = a), colour = 'red') + 
      geom_line(aes(y = b), colour = 'blue') + scale_x_continuous(breaks = seq(0,100,10)) 
df.plot 

同様の質問がhereを尋ねたが、与えられた答えはありました回避策の多くは、2行のテーブルのためによく見えません。私はBrian Diggsが提供した手がかりを使いこなすつもりですが、誰かがすでにこのようなことをしている場合に備えて、私はこれを投稿すると思いました。どんな助けでも大歓迎です!

編集:これを理解するための@baptisteに感謝します。私は彼が始めたことを終えた彼自身の答えを投稿した。ここで

+1

私は本当にこの上で動作する時間がありませんが、一つのアプローチは、** gridExtra **パッケージから 'grid.arrange'と' grid.table'を使用するかもしれません。私はそれがうまく行こうとするのは難しいだろうと思っています。 – joran

+1

私は、最も単純な方法は 'ggplot2'それ自身を使ってテーブルを作ることだと思います。これは、[この例](http://learnr.wordpress.com/2009/04/29/ggplot2-labelling-data-series-and-adding-a-data-table/)でうまく説明されていますそれは比較的古くからのコードです)。 – baptiste

答えて

9

はlearnrで使用される戦略の基本的な例です。ここで

require(ggplot2) 
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10)) 
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) + 
    geom_line(aes(y = a), colour = 'red') + 
    geom_line(aes(y = b), colour = 'blue') + 
    scale_x_continuous(breaks = seq(0,100,10)) 

# make dummy labels for the table content 
df$lab <- month.abb[ceiling((df$a+1)/10)] 

df.table <- ggplot(df, aes(x = a, y = 0, 
           label = lab, colour = b)) + 
    geom_text(size = 3.5) + 
    theme_minimal() + 
    scale_y_continuous(breaks=NULL)+ 
    theme(panel.grid.major = element_blank(), legend.position = "none", 
     panel.border = element_blank(), axis.text.x = element_blank(), 
     axis.ticks = element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_blank()) 

gA <- ggplotGrob(df.plot) 
gB <- ggplotGrob(df.table)[6,] 
gB$heights <- unit(1,"line") 


require(gridExtra) 
gAB <- rbind(gA, gB) 
grid.newpage() 
grid.draw(gAB) 

enter image description here

+0

これは正しい解決策のようです。私はこれを試して、私が私の写真であなたに示した利益のプロットを作ることができるかどうかを見ていきます。 – zap2008

+1

この手順には2つのステップがあり、簡単にするために独立して実行できます。 i)まず、 "テーブル"プロットを自分自身で取得します。 ii)2つのグラフを1ページに整列させる。 – baptiste

+0

ggplotGrob()関数は正確に何をしますか?ドキュメンテーションはちょっと気が狂っていて、私は出力で何を見ているのか分かりません。 – zap2008

6

は私が作るために着手し、一般的な表を作成するスクリプトです。各行の名前をscale_y_continuousに変更して表のタイトルを追加したことに注目してください。

require(ggplot2) 
require(gridExtra) 
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10)) 
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) + 
    geom_line(aes(y = a), colour = 'red') + 
    geom_line(aes(y = b), colour = 'blue') + 
    scale_x_continuous(breaks = seq(0,100,10)) 

# make dummy labels for the table content 
lab.df <- data.frame(lab1 = letters[11:20], 
        lab2 = letters[1:10]) 

df.table1 <- ggplot(lab.df, aes(x = lab1, y = 0, 
           label = lab1)) + 
    geom_text(size = 5, colour = "red") + 
    theme_minimal() + 
    scale_y_continuous(breaks=NULL, name = "Model Lift") + 
    theme(panel.grid.major = element_blank(), legend.position = "none", 
     panel.border = element_blank(), axis.text.x = element_blank(), 
     axis.ticks = element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_text(angle = 0, hjust = 5)) 

df.table2 <- ggplot(lab.df, aes(x = lab2, y = 0, 
           label = lab2)) + 
    geom_text(size = 5, colour = "blue") + 
    theme_minimal() + 
    scale_y_continuous(breaks=NULL, name = "Random")+ 
    theme(panel.grid.major = element_blank(), legend.position = "none", 
     panel.border = element_blank(), axis.text.x = element_blank(), 
     axis.ticks = element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_text(angle = 0, hjust = 3.84)) 


# silly business to align the two plot panels  
gA <- ggplotGrob(df.plot) 
gB <- ggplotGrob(df.table1) 
gC <- ggplotGrob(df.table2) 

maxWidth = grid::unit.pmax(gA$widths[2:3], gB$widths[2:3], gC$widths[2:3]) 
gA$widths[2:3] <- as.list(maxWidth) 
gB$widths[2:3] <- as.list(maxWidth) 
gC$widths[2:3] <- as.list(maxWidth) 

grid.arrange(gA, gB, gC, ncol=1, heights=c(10, .3, .3)) 

sample plot

+0

うまくやった。左側に不一致がありますが、それが問題であれば、プロットの余白と幅をもっと詳しく調べることができます。 – baptiste

+0

"Model Lift"と "Random"というタイトルの位置と関係があるかもしれません。私は、もしあなたが 'hjust'オプションを使いこなしたら、それは消えてしまうでしょう。私が作った他のプロットには、そのような問題はなかった。 – zap2008

関連する問題