2012-10-02 15 views
5

私はほとんど美容上の問題があります。私は1つの列(を使用)に配置するggplot2ライブラリを使用して4つのプロットを作成しています。グラフには同じデータが表示されますが、4つのグループについては、x軸は時間ですので、グラフを1つの列に保持する必要があります。ggplot2を使ったRのグラフサイズが一貫しています(凡例と軸はサイズを変更します)

したがって、凡例を上部グラフに追加し、X軸のラベルを下部グラフに追加します。これらの2つのアクションは、グラフのサイズを変更します。凡例を追加すると、グラフが拡大し、x軸ラベルを追加すると、これらのものに対応するために縮小されます。

固定グラフサイズを指定する方法はありますか。これはレイアウトの整合性を保つでしょうか?

私のプロット:再現性のある結果を得るために plot

コード:

library(ggplot2) 
library(reshape) 

raw_data <- structure(list(Sample = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 
23L, 24L, 25L, 26L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
24L, 25L, 26L), Month = structure(c(12L, 12L, 11L, 11L, 10L, 
10L, 3L, 3L, 5L, 5L, 4L, 4L, 8L, 8L, 1L, 1L, 9L, 9L, 7L, 7L, 
6L, 6L, 2L, 2L, 12L, 12L, 12L, 12L, 11L, 11L, 10L, 10L, 3L, 3L, 
5L, 5L, 4L, 4L, 8L, 8L, 1L, 1L, 9L, 9L, 7L, 7L, 6L, 6L, 2L, 2L, 
12L, 12L), .Label = c("April", "Aug", "Dec", "Feb", "Jan", "July", 
"June", "March", "May", "Nov", "Oct", "Sep"), class = "factor"), 
    Channel = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", 
    "B"), class = "factor"), Amplitude = c(5000L, 
    5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 
    5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 
    5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 
    5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L, 5000L)), .Names = c("Sample", 
"Month", "Channel", "Amplitude"), row.names = c(NA, 52L), class = "data.frame") 



multiplot <- function(..., plotlist=NULL, cols) { 
    require(grid) 

    # Make a list from the ... arguments and plotlist 
    plots <- c(list(...), plotlist) 

    numPlots = length(plots) 

    # Make the panel 
    plotCols = cols       # Number of columns of plots 
    plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols 

    # Set up the page 
    grid.newpage() 
    pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) 
    vplayout <- function(x, y) { 
      viewport(layout.pos.row = x, layout.pos.col = y) 
    } 

    # Make each plot, in the correct location 
    for (i in 1:numPlots) { 
     curRow = ceiling(i/plotCols) 
     curCol = (i-1) %% plotCols + 1 
     print(plots[[i]], vp = vplayout(curRow, curCol)) 
    } 

} 


mybarplot <- function(first=0, last=0) { 
    # Create the barplot 
    p <- ggplot(raw_data, aes(x=Sample, y=Amplitude, fill=Channel)) 

    # Make it a grouped barplot with already summarised values 
    p <- p + geom_bar(position="dodge", stat="identity") 


    # Apply a log10 transformation to the y-axis, and create appropriate axis ticks 
    p <- p + scale_y_log10(breaks = c(5,10,50,100,500,1000,5000,10000)) 

    # Zoom in (barplots will not show when axis change to remove 0, so have to zoom) 
    p <- p + coord_cartesian(ylim=c(1,15000), xlim=c(1,26)) 

    # Make it greyscale 
    p <- p + scale_fill_grey() 


    # Hide X label 
    p <- p + opts(axis.text.x=theme_blank(), axis.title.x=theme_blank(), axis.title.y=theme_blank()) 
    # Change X label size 
    p <- p + opts(axis.text.y=theme_text(size=7)) 



    # Change the Legend 
    p <- p + scale_fill_manual(values=c("black", "grey75", "grey25"), name="Channel", breaks=c("A", "B")) 

    #margins 
    # c(top,,bottom,) 
    top_margin <- unit(c( 1, 1, -0.25, 1), "lines") 
    middle_margin <- unit(c(-0.25, 1, -0.25, 1), "lines") 
    bottom_margin <- unit(c(-0.25, 1,  2, 1), "lines") 


    if (first) { 
     # Anchor legend box to top right corner 
     p <- p + opts(legend.justification=c(1,1), legend.position=c(1,1)) 
     # Put a white box around it 
     p <- p + opts(legend.background = theme_rect(fill="white")) 
     # Top margin 
     p <- p + opts(plot.margin = top_margin) 
     p <- p + scale_x_discrete(breaks = 1:26) 
    } else { 
     p <- p + opts(legend.position="none") 
     if (last) { 
      # Bottom margin 
      p <- p + opts(plot.margin = bottom_margin) 
       # label X-axis 
      p <- p + scale_x_discrete(breaks = 1:26, labels=c("Sep", "", "Oct", "", "Nov", "", "Dec", "", "Jan", "", "Feb", "", "March", "", "April", "", "May", "", "June", "", "July", "", "Aug", "", "Sep", "")) 

      p <- p + ylab("Amplitude") 
      p <- p + xlab("Sampling time") 
      # Angle x labels 
      #p <- p + opts(axis.text.x=theme_text(angle=-45, hjust=0.5)) 
      p <- p + opts(axis.text.x=theme_text(hjust=0.5)) 

      # Move X title 
      p <- p + opts(axis.title.x=theme_text(vjust=-0.5)) 
     } else { 
      p <- p + opts(plot.margin = middle_margin) 
      p <- p + scale_x_discrete(breaks = 1:26) 
     } 
    } 



} 


plot1 <- mybarplot(first=1) 
plot2 <- mybarplot() 
plot3 <- mybarplot() 
plot4 <- mybarplot(last=1) 

multiplot(plot1, plot2, plot3, plot4, cols=1) 

セッション情報:あなたの例で

> sessionInfo() 
R version 2.15.1 (2012-06-22) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] reshape_0.8.4 plyr_1.7.1 ggplot2_0.9.1 

loaded via a namespace (and not attached): 
[1] MASS_7.3-18  RColorBrewer_1.0-5 colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  labeling_0.1  memoise_0.1  munsell_0.3  proto_0.3-9.2  reshape2_1.2.1  
[11] scales_0.2.1  stringr_0.6.1  
+0

あなたの質問が[再現可能]になるようにプロットしたコードを表示できますか?(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example )。 – Justin

+0

申し訳ありません。それを再現するコードが追加されました。 – NFA

答えて

5

各プロットが同一である、しかし私はそれがないと仮定しますあなたの最終製品の計画。これを行う最も簡単な方法は、各プロットを別々にレイアウトするのではなく、ファセットで行うことだと思います。

dat <- data.frame(facetvar=letters[1:5], yvar=rep(1:10, each=5), xvar=rep(letters[6:10], each=5)) 
ggplot(dat, aes(x=xvar, y=yvar, group=facetvar)) + 
    geom_bar(stat='identity') + 
    facet_grid(facetvar~.) 

必要に応じてデータをサブセット化し、任意のファセット変数を使用することができます。

ggplot(dat[sample(1:50, 40),], aes(x=xvar, y=yvar, group=facetvar)) + 
    geom_bar(stat='identity') + 
    facet_grid(facetvar~.) 

必要な場合にもfacet_grid()scales.y='free'を供給することができます。

+0

ええ、データは私の例では同じですが、最終グラフにはありません。それはそれを再現する最速の方法だったからです。サイズの違いはまだあります。 ファセットを使用するには、すべてのデータを1フレームに収める必要があります。今のように私は4つの別々のファイルからデータを取得し、データを転置して溶かす必要があります。私は明日の仕事でそれを行うことを検討しますが、それらを1つの単一のデータフレームに統合するのは難しいでしょう。 – NFA

+0

あなたは正しく、1つの 'data.frame'が必要です。しかし、あなたの溶融ステップの後に、あなたはしばしば任意の "ファセット"カラムを追加し、 'rbind()'のようなものを使ってそれらをすべてマッシュアップすることができます。 – Justin

+1

それはまったく難しいはずがありません。 4つのデータセットの応答列と予測子列の名前を同じ値に変更し、ファセットIDを与える列に 'rep(ID、length(data)) 'を介して列を追加し、バインドしてからファセット文を使用して置換します。 – Chris

関連する問題