R中的dotplot与晶格:垂直轴和误差条的显示

时间:2012-10-11 13:44:42

标签: r data-visualization lattice

我正在尝试使用lattice中的库latticeExtraR进行点图。但是,没有在垂直y轴上进行适当的值表示。 R不是选择数值变量的实际值,而是绘制值的等级。也就是说,有值[375, 500, 625, 750, ..., 3000]R绘制其等级[1,2,3,4,...23],并相应地选择比例。有人经历过这样的问题吗?如何管理在垂直y尺度上使用(0, 500, 1000, 1500, ...)等刻度获得正确的表示?

到目前为止程序代码:

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.griddput的相关数据部分:

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)

3 个答案:

答案 0 :(得分:6)

您需要将z设为一个因素:dotplot(factor(z) ~ ...

此外,您可能希望绘图中有一些抖动以防止重叠;尝试添加jitter.x=TRUEjitter.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)

enter image description here

答案 1 :(得分:3)

我不确定我是否理解这个问题并且您要求使用格子解决方案,但我认为使用ggplot2完成此操作可能会有所帮助:

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

收率: enter image description here

或者我们可以通过以下方式释放音阶:

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

产量:

enter image description here

答案 2 :(得分:3)

您也可以使用package Hmisc中的xYplot来获得类似@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)

enter image description here

但真的是情节丰富的情节?它是否能很好地显示您的数据效果,突出显示您的比较?它是否探索了数据中的任何趋势?为了更好地查看您想要绘制的所有因素,我首先会在您的组之间建立关联,以便更好地查看不同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)

enter image description here

但是有一些东西藏在那里,由于数据的密度,仍然有太多的噪音。让我们摆脱effect.size并绘制回归线,尽管这对于如此少的数据点可能是一种罪恶。

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)

enter image description here

我知道我可能不相信你,但有时最好从太多因素中卸载一个情节以更好地查看数据。如果您显示分离的因素,有时可能会更直观地访问。