2015-10-21 11 views
9

私は、複数レベルのグループ化されたボックスプロットに対して「空きスペース」を維持しようとしています。ggplot2:空の第2レベルカテゴリのスペースを強制する

set.seed(42) 
n <- 100 
dat <- data.frame(x=runif(n), 
        cat1=sample(letters[1:4], size=n, replace=TRUE), 
        cat2=sample(LETTERS[1:3], size=n, replace=TRUE)) 
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2)) 

enter image description here

私はグループのいずれかが空であることを強制する場合:

dat <- subset(dat, ! (cat1 == 'b' & cat2 == 'B')) 
table(dat$cat1, dat$cat2) 
##  
##  A B C 
## a 9 9 7 
## b 8 0 5 
## c 13 11 6 
## d 11 10 5 
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2)) 

enter image description here

第二のグループ、 "b" は、今スペースを埋めるように拡張されます。私がしたいことは次のとおりです。

enter image description here

SO 9818835(表示されるように、空のレベルを強制的に)、トップレベルで正常に動作しますが、私はそれが第二レベルのために働くために取得する方法を見つけ出すことはできませんカテゴリ。 scale_x_discrete(...)で、Iは、設定しようとした:

解決するために
  • breaks=letters[1:4]
  • breaks=LETTERS[1:3]
  • breaks=list(letters[1:4], LETTERS[1:3])(スタブ)
  • breaks=NULL
  • breaks=funcfunc <- function(x, ...) { browser(); 1; }letters[1:4]のみを提供し、第2レベルのプロンプトを表示しませんでした。

interactions(letters[1:4], LETTERS[1:3])を使用すると、まだ空き領域が残っていません。私はx値の範囲外に注入し、それをscale_y_continuous(limits)と強制的に強制することで回避策を試みましたが、ggplot2は私にとってはスマートすぎて、再びギャップを閉じます。

解決策は洗練されています(つまり、ggplot2のメカニズムに「正しい」)?

+0

のようなデータがどのようにエレガントな、それはする必要がない「裏をかく」にしようとしないのだろうか?これらのレコードの 'x'をゼロに設定するだけで、かなり合理的に見えるものが作成されているようです。 – akhmed

+1

これはプログラム的にエレガントです(私はすでにそれを試していましたが、 'scale_y_continuous(limits)'は駄目です)私の視覚化については、少しOCDです:私はいつもプロットの一番下の気を散らすラインを見つめます。 – r2evans

+0

さらに、「a lineはデータなし」と「a lineは値0の単一データポイントを示します」との間に統計的な違いがあります。 – r2evans

答えて

7

coord_cartesianあなたが探しているソリューションですか?

はズームインうとscale_y_continuous

library(dplyr) 
library(ggplot2) 

set.seed(42) 
n <- 100 
dat <- data.frame(x=runif(n), 
        cat1=sample(letters[1:4], size=n, replace=TRUE), 
        cat2=sample(LETTERS[1:3], size=n, replace=TRUE)) 

LARGE_VALUE <- 2 

dat <- dat %>% 
    mutate(x = ifelse(cat1 == 'b' & cat2 == 'B', 
        LARGE_VALUE, 
        x)) 

ggplot(dat, aes(cat1, x)) + 
    geom_boxplot(aes(fill=cat2)) + 
    coord_cartesian(ylim = c(0,1)) 

enter image description here

+0

うん、それは私が必要とするものです。私は 'drop = FALSE'は私がやるとは思っていないことを少し驚かせていますが、もう一度、' ggplot2'を完全にgrokするためにもっと働かなくてはなりません。ありがとう。 – r2evans

関連する問題