2

これは基本的に同じ質問this oneですが、重要な違いが 1 つあります。水平パネルを使用し、すべてのタイルが同じ高さである ggplot2 ベースのタイル プロットが必要です。もう 1 つの質問は、垂直パネルに関するものでした。

他の質問のコードに基づいたコード例を次に示します。

d = data.frame(sites=rep(paste("S", 1:31),each=12),
               month=factor(rep(1:12,31)),
               value=runif(31*12),
               panel=c(rep("Group 1",16*12), rep("Group 2", 12*12),
                       rep("Group 3", 3*12)))

これを使用してプロットする

ggplot(d, aes(x=month, y=sites, fill=value)) + 
  geom_tile(colour="white") + facet_wrap(~panel, nrow=1)

結果はここに画像の説明を入力

基本的に、青いタイルの各ブロックを上に移動して、それらの上にスペースがないようにしたい. 私はこれを使用して達成することができます

ggplot(d, aes(x=month, y=sites, fill=value, colour="white")) + 
  geom_tile(colour="white") + facet_wrap(~panel, scales="free_y", nrow=1)

しかし、これは高さが等しくないタイルになります:

ここに画像の説明を入力

もう 1 つの質問には垂直パネルの優れた解決策がありましたが、これを上記のコードに適用しても効果はありません。水平パネル用の同様のソリューションはありますか?

4

2 に答える 2

5

gridExtraレベルを使用して設定するハックを次に示します。

d.splt <- split(d, d$panel)
max.unique <- max(sapply(d.splt, function(x) length(unique(x$sites))))
d.gg <- lapply(d.splt, function(d.sub){
  lvls <- unique(as.character(d.sub$sites))
  length(lvls) <- max.unique
  lvls <- replace(lvls, is.na(lvls), "")
  d.sub$sites <- factor(as.character(d.sub$sites), levels=lvls)

  ggplot(d.sub, aes(x=month, y=sites, fill=value, colour="white")) + 
    geom_tile(colour="white", stat="identity") +
    scale_y_discrete(drop=F) + scale_fill_continuous(guide=F)
} )
library(gridExtra)
do.call(grid.arrange, c(d.gg, list(nrow=1)))

ここに画像の説明を入力

これによりいくつかの警告がスローされますが、無視できます。また、タイトルと凡例も追加する必要があります (ロジックをいじって、最後のものが凡例を生成するようにすることができます)。

これに関する主な問題は、カラー スケールが各グラフに個別に適合することですが、それを強制的に修正することができます。

于 2014-02-13T19:20:29.967 に答える