4

latticeライブラリとlatticeExtraでドットプロットを実行しようとしていますR。ただし、垂直の y 軸の値は適切に表現されません。数値変数の実際の値を選択する代わりに、R値のランクをプロットします。つまり、値があり、それらのランク[375, 500, 625, 750, ..., 3000]Rプロットし、[1,2,3,4,...23]それに応じてスケールを選択します。誰かがこのような問題を経験しましたか? (0, 500, 1000, 1500, ...)垂直方向の y スケールのような目盛りで適切な表現を取得するにはどうすればよいですか?

これまでのプログラムコードは次のとおりです。

df.dose <- read.table("data.csv", sep=",", header=TRUE)
library(lattice); library(latticeExtra)

useOuterStrips(dotplot(z ~ sample.size | as.factor(effect.size)*as.factor(true.dose),
               groups=as.factor(type), data=df.dose, as.table=TRUE))

(以下のコメントから追加): また、エラーバーをグラフに追加できますか? 私は次のことを考えました(呼び出しに追加する)が、うまくいかないようです。なんとなく可能ですか?

up=z+se, lo=z-se, panel.groups=function(x,y,..., up, lo, subscripts){ 
   up <- up[subscripts]
   lo <- lo[subscripts]
   panel.segments(lo, as.numeric(y), up, as.numeric(y), ...)
}

ここに私のデータがあります: https://www.dropbox.com/s/egy25cj00rhum40/data.csv

expand.grid追加:およびを使用したデータの関連部分は次のdputとおりです。

df.dose <- expand.grid(effect.size=c(-.5, -.625, -0.75),
                       sample.size=c(40L, 60L, 80L),
                       true.dose=c(375L, 500L, 750L, 1125L),
                       type=c("dose", "categ", "FP2", "FP1"))
df.dose$z <- c(875L, 875L, 750L, 750L, 750L, 625L, 625L, 625L, 625L, 875L, 
875L, 750L, 1000L, 1000L, 1000L, 1125L, 1000L, 875L, 1000L, 1000L, 
875L, 1000L, 1000L, 875L, 1125L, 1000L, 1000L, 1250L, 1125L, 
1000L, 1250L, 1250L, 1125L, 1250L, 1000L, 1000L, 500L, 500L, 
500L, 500L, 500L, 500L, 500L, 500L, 500L, 625L, 625L, 625L, 625L, 
625L, 625L, 625L, 625L, 625L, 750L, 750L, 625L, 750L, 750L, 750L, 
750L, 750L, 750L, 875L, 875L, 750L, 750L, 875L, 875L, 875L, 875L, 
875L, 2500L, 1500L, 1125L, 2000L, 1000L, 1750L, 250L, 500L, 500L, 
1250L, 750L, 625L, 875L, 500L, 500L, 875L, 500L, 375L, 1250L, 
875L, 750L, 1000L, 625L, 625L, 875L, 500L, 500L, 1125L, 1000L, 
875L, 1125L, 875L, 625L, 1125L, 1000L, 625L, 2500L, 2125L, 2375L, 
2000L, 750L, 2625L, 250L, 625L, 250L, 875L, 875L, 500L, 625L, 
500L, 625L, 1000L, 500L, 375L, 1000L, 875L, 625L, 875L, 500L, 
500L, 875L, 500L, 500L, 1250L, 1125L, 875L, 1125L, 875L, 750L, 
1250L, 1000L, 625L)
4

3 に答える 3

7

z因数を作る必要があります:dotplot(factor(z) ~ ...

また、オーバーラップを防ぐために、プロットに多少のジッターが必要になる場合があります。jitter.x=TRUEまたはjitter.y=TRUE、または両方を追加してみてください。

以下のコメントから判断して、データをもう一度見てみると、ドットプロットを間違った方法でプロットしていると思います。の線ではなく、サンプルサイズの線にしたいと思いますz。本当にz縦軸が必要な場合は、 を追加する必要がありますhorizontal=TRUE。横軸と縦軸を入れ替えることもできます。

useOuterStrips(dotplot(z ~ factor(sample.size) | 
                             as.factor(effect.size)*as.factor(true.dose),
                  groups=as.factor(type), data=df.dose,  
                  as.table=TRUE, horizontal=FALSE, jitter.x=TRUE))

エラーバーを追加するには、パネル内にグループがあるため少し複雑です。そのため、panel.groups関数を使用する必要があります。さらに、線が重ならないように、おそらくカスタムpanel関数で行うのが最適です。

df.dose$se <- 200
df.dose$type <- factor(df.dose$type)
df.dose$sample.size <- factor(df.dose$sample.size)

panel.groups.mydotplot <- function(x, y, subscripts, up, lo, 
                                   col=NA, col.line=NA, ...) {
  panel.points(x, y, ...)
  panel.segments(x, lo[subscripts], x, up[subscripts], col=col.line, ...)
}
panel.mydotplot <- function(x, y, subscripts, groups, ..., jitter=0.1) {
  jitter <- seq(-1,1,len=nlevels(groups))*jitter
  xx <- as.numeric(x) + jitter[as.numeric(groups[subscripts])]
  panel.dotplot(x, y, groups=groups, subscripts=subscripts, pch=NA, ...)
  panel.superpose(xx, y, groups=groups, subscripts=subscripts,  
                  panel.groups=panel.groups.mydotplot, ...)
}
pp <- dotplot(z ~ sample.size | as.factor(effect.size)*as.factor(true.dose),
              groups=type, data=df.dose, as.table=TRUE, horizontal=FALSE,
              up=df.dose$z + df.dose$se, lo=df.dose$z - df.dose$se,
              panel=panel.mydotplot, auto.key=list(space="right"))
useOuterStrips(pp)

ここに画像の説明を入力

于 2012-10-11T14:11:49.490 に答える
3

問題を理解しているかどうかはわかりませんが、あなたは格子ソリューションを求めましたが、ggplot2 でこれを行うと役立つかもしれないと思いました:

ggplot(data=df.dose, aes(x=sample.size, y=as.factor(z), colour=type)) +
    geom_point() + facet_grid(true.dose~effect.size)

収量: ここに画像の説明を入力

または、次の方法でスケールを解放できます。

ggplot(data=df.dose, aes(x=sample.size, y=as.factor(z), colour=type)) +
    geom_point() + facet_grid(true.dose~effect.size, scales="free")

収量:

ここに画像の説明を入力

于 2012-10-11T14:51:12.150 に答える
3

パッケージ HmiscxYplotから使用して、@Aaronと同様のソリューションを実現することもできますが、彼が得たのと同じジッターを取得するのは少し難しいかもしれません。

a <- xYplot(Cbind(z, z-se, z+se) ~ sample.size | as.factor(effect.size) * as.factor(true.dose),
            groups=as.factor(type), data=df.dose, as.table=TRUE, auto.key=list(space="top"))
useOuterStrips(a)

ここに画像の説明を入力

しかし、本当に有益なプロットですか?データの効果をよく示し、比較を強調していますか? データの傾向を調査しますか? プロットしたいすべての要因をよりよく見るために、最初にグループ間に線を結び、異なるsample.size.

key.variety <- list(space = "top", 
                    text = list(levels(df.dose$type)),
                    points = list(pch = 0:3, col = "black"))
a <- xyplot(z ~ as.factor(sample.size) | as.factor(effect.size)*as.factor(true.dose),
            df.dose, type = "o", as.table=TRUE, groups = type, key = key.variety, 
            lty = 1, pch = 0:3, col.line = "darkgrey", col.symbol = "black")
useOuterStrips(a)

ここに画像の説明を入力

しかし、そこには何かが隠れており、データの密度のためにまだノイズが多すぎます。effect.sizeand plot の回帰直線を削除しましょう。ただし、データ ポイントが非常に少ない場合はおそらく問題があります。

a <- xyplot(z ~ as.factor(sample.size) | as.factor(type)*as.factor(true.dose), 
            data=df.dose, as.table=TRUE, 
            panel = function(x, y){
               panel.xyplot(x, y, jitter.x = T, col=1);
               panel.lmline(x, y, col=1, lwd=1.5);
            })
useOuterStrips(a)

ここに画像の説明を入力

納得できなかったかもしれませんが、データをよりよく見るために、あまりにも多くの要因からプロットをアンロードした方がよい場合があります。因子を分けて表示すると、視覚的に理解しやすい場合があります。

于 2012-10-16T19:59:17.683 に答える