2

ネストされた箇条書きの線に沿って、サブカテゴリとサブサブカテゴリに編成されたデータセットがあります。

-1
 -1a
  -1ai
  -1aii
 -1b
  -1bi

...等々。

ggplot2を使用して、1のすべてのデータ、1aのみのデータ、1aiのみのデータなどを表示するドットプロットを作成したいと思います。

データセットの例:

x <- data.frame(cat=1, subA=letters[rep(1:5,each=10)], 
subB=as.character(as.roman(rep(1:5,5,each=2))),value=rnorm(50,20,7))

> head(x)
  cat subA subB    value
1   1    a    I 26.75573
2   1    a    I 12.52218
3   1    a   II 24.53499
4   1    a   II 23.21012
5   1    a  III 11.18173
6   1    a  III 25.01914

最終的に次のようなグラフになりたいです。

サブセットおよび全体的なデータドットプロット

非常に冗長な派生データフレームを作成するために多くのサブセット化とバインドを行うことでこのプロットを作成できましたが、これはDoingItWrongの明確な例のようです。

x2 <- with(x,rbind(cbind(key="1",x), 
cbind(key="1 a",x[paste(cat,subA) == "1 a",]), 
cbind(key="1 a I",x[paste(cat,subA,subB) == "1 a I",]), 
cbind(key="1 a II",x[paste(cat,subA,subB) == "1 a II",])))

library(ggplot2)
library(plyr)
ggplot(x2,aes(x=reorder(key,desc(key)),y=value)) 
+ geom_point(position=position_jitter(width=0.1,height=0)) 
+ coord_flip() + scale_x_discrete("Category")

これを行うためのより良い方法はありますか?関連する問題は、「1」、「1 a」、「1 a II」のいずれに対してプロットされた場合でも、各値に常に同じ量のジッターが追加されていると便利ですが、私もそうではありません。どこから始めればよいかを確認してください。

4

1 に答える 1

2

以下に示すように、別々のグループでデータを再構築する以外の方法は考えられません。

x.m1 <- x[c("cat", "value")]
x.m2 <- do.call(rbind, lapply(split(x, interaction(x[, 1:2])), function(y) {
    y$cat <- do.call(paste0, y[, 1:2])
    y[c("cat", "value")]
}))
x.m3 <- do.call(rbind, lapply(split(x, interaction(x[, 1:3])), function(y) {
    y$cat <- do.call(paste0, y[, 1:3])
    y[c("cat", "value")]
}))

y <- rbind(x.m1, x.m2, x.m3)

ggplot(data = y, aes(x = value, y = cat)) + geom_point()

ggplot2_multiple_levels

注: y軸を希望どおりに並べ替えるには、cat列のレベルを並べ替える必要があります。yそれはあなたにお任せします。

編集: @Justinの提案に従って、次のようなことを行うことができます。

x.m1 <- x
x.m1$grp <- x$cat
x.m2 <- do.call(rbind, lapply(split(x, interaction(x[, 1:2])), function(y) {
    y$grp <- do.call(paste0, y[, 1:2])
    y
}))
x.m3 <- do.call(rbind, lapply(split(x, interaction(x[, 1:3])), function(y) {
    y$grp <- do.call(paste0, y[, 1:3])
    y
}))

y <- rbind(x.m1, x.m2, x.m3)

ggplot(data = y, aes(x = value, y = grp)) + geom_point(aes(colour=subA, shape=subB))

ggplot2_multiple_levels_color_shape

于 2013-02-26T15:56:45.010 に答える