2

ggplot2 についてさらに別の質問があります...しかし、今回は自分がやりたいことが可能かどうかさえわかりません...簡単な例から始めましょう。これは私がこれまでに持っているものです:

library(reshape2)
library(ggplot2)

a.df <- data.frame(
  id=c('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y'),
  var1=c(25,35,46,19,35,68,78,23,65,78,98,32,65,74,24,56,78,12,34,76,87,12,54,87,34), 
  group1=c(1,2,'NONE','NONE',1,2,2,1,3,4,3,'NONE','NONE',4,4,3,1,1,2,3,4,'NONE','NONE',2,3), 
  group2=c(1,'NONE',1,1,2,2,'NONE',2,'NONE',2,3,4,3,4,1,'NONE',1,3,4,'NONE',4,4,3,'NONE',2)
)

ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1)) + 
  geom_density() +
  facet_grid(. ~ group1)
ggplot(data=subset(a.df,group1=='NONE'), aes(x=var1)) + 
  geom_density()

ggplot(data=subset(a.df,group2!='NONE'), aes(x=var1)) + 
  geom_density() +
  facet_grid(. ~ group2)
ggplot(data=subset(a.df,group2=='NONE'), aes(x=var1)) + 
  geom_density()

そこで、私がここでやりたいことは次のとおりです。

1-まず、ファセットを 4x1 ではなく 2x2 に分割します (ncol=2 で試しましたが、うまくいきませんでした)。

2 - 2 番目のプロット (subset(a.df,group1=='NONE')) を、1 番目のプロットの 4 つのファセットのそれぞれと共にプロットします。3番目と4番目も同じようにします。

3-可能であれば、結果として得られる 2 つのプロット (4 つのファセットの 1st + 2nd、および 4 つのファセットの 3rd + 4th) を 1 つにまとめることができれば素晴らしいと思いますが、ここで私が目にする問題は、ファセットが次のものに依存していることです。 2つのグループ化変数...それは可能でしょうか??

全体として、入力data.frameには何らかの改造が必要だと感じていますが、その方法がわかりません...どうもありがとう!!

4

2 に答える 2

2

各面に 1 つの密度曲線を追加するのは、こちらの投稿に従ってかなり簡単です。これがあなたのやりたいことだと思いますが、間違っている可能性があります。facet_wrapではなく、列数を選択できることに注意してくださいfacet_grid

ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1)) + 
    geom_density() +
    facet_wrap( ~ group1, ncol = 2) +
    geom_density(data=subset(a.df,group1=='NONE', var1), aes(var1, color = "NONE")) +
    scale_color_manual(name = "Baseline", values = "blue")

データセットを長い形式に溶かした後、両方のグループに対して同じ種類のことを行うのはかなり簡単に思えましたが、それは でしか機能せfacet_gridず、列の数を制御できませんでした。

require(reshape2)
dat2 = melt(a.df, measure.vars = c("group1", "group2"), variable.name = "group")

ggplot(data=subset(dat2, value != "NONE"), aes(x=var1)) +
    geom_density() + facet_grid(group ~ value) +
    geom_density(data=subset(dat2,value=='NONE', c(var1, group)), aes(var1), color = "blue")

これを facet_wrap で機能させるには、より多くの「ブルートフォース」メソッドを使用する必要がありました。基本的に、各グループのレベル 1 ~ 4 で繰り返されるカテゴリvar1の値を使用して、一種のダミー データセットを作成する必要がありました。より良い説明についてNONEは、の出力を参照してください。datnoneこれで仕事が完了するかもしれませんが、確かにきれいではありません。

datnone = cbind(dat2[dat2$value == "NONE", 2:3], 
             value = rep(1:4, each = nrow(dat2[dat2$value == "NONE",])) )

ggplot(data=subset(dat2, value != "NONE"), aes(x=var1)) +
    geom_density() + facet_wrap(group ~ value, ncol = 2) +
    geom_density(data = datnone, aes(var1), color = "blue")

編集して、2 本の線、2 色の凡例を追加します

凡例を追加し、 と の両方を制御する 1 つの方法を次に示しlinetypeますcolor。これをより良くするために、凡例の名前とラベルも制御できます。

ggplot(data=subset(a.df,group1!='NONE'), aes(x=var1, color = "GROUP", linetype = "GROUP")) + 
    geom_density() +
    facet_wrap( ~ group1, ncol = 2) +
    geom_density(data=subset(a.df,group1=='NONE', var1), 
               aes(var1, color = "NONE", linetype = "NONE")) +
    scale_linetype_manual(values = c("solid", "dotted") ) +
    scale_color_manual(values = c("black", "red") )
于 2013-10-04T22:31:07.107 に答える
1

これは、ファセットを回避し、個々のプロットをリストに保存し、その後に を呼び出してgrid.arrange目的の結果を取得するアプローチです。

同じプロットの複数のコピーを持つことは、簡単にfacet_grid. また、facet_gridファセット変数が 1 つしかない 2x2 プロット用に実際には設計されていません。

### no. levels of factor group1 not equal to 'NONE' = 4
sum(!levels(a.df$group1)=="NONE")
### define list to store results
list1 <- vector("list", 8)
### subset to remove "none"
df1 <- a.df[!a.df$group1=="NONE", ]
for (i in 1:4){
### subset per level
    df2 <- df1[df1$group1==unique(df1$group1)[i], ]
### plot and title
    g1 <- ggplot(df2, aes(x=var1)) + 
        geom_density() +
            ggtitle(unique(df1$group1)[i])
        list1[[2*i-1]] <- g1
}
### plots of NONE
df1 <- a.df[a.df$group1=="NONE", ] 
g2 <- ggplot(df1, aes(x=var1)) +
    geom_density() +
    ggtitle("NONE")
list1[[2]] <- list1[[4]] <- list1[[6]] <- list1[[8]] <- g2
### 
library(gridExtra)
do.call(grid.arrange, c(list1, list(nrow=2, ncol=4)))

与える

ここに画像の説明を入力

これを微調整して、関心のある追加のプロットに対して同じことを行うことができるはずです。

于 2013-10-04T22:28:09.680 に答える