如何使用levelplot仅在观察到的指数处显示数据?

时间:2012-03-20 16:41:07

标签: r plot lattice

我正在尝试制作一个(点阵)水平图。我有一个数据框,其列是我想要绘制的每个值的 i j 空间坐标,这些数据值(这里, d ),以及一个名为fname的列(即文件名,但我在这里使用的数据集中只有一个文件名)。

我的问题是levelplot正在绘制或加入(或者某些东西!)数据,其中没有关联的 i j 值(参见示例图像,下面)。 60 <60的数据没有。 j &lt; 75,但是在这些位置绘制了值。

Problematic levelplot

情节创建于:

pl <- levelplot(d ~ j * i | fname, data = my.data.frame)
print(pl)

我不明白什么?我该如何纠正?应该有一条垂直的白色条带(没有数据),大约在60°的范围内。 j &lt; 75。

修改

下面是一个相当小的例子,“放大”原始情节:

my.data.frame是:

    i  j  d
599 78 56 1.355702e-01
600 77 56 6.296867e-02
601 76 56 1.489721e-01
602 75 56 1.063881e-01
603 74 56 1.544339e-01
604 73 56 1.937138e-01
605 72 56 1.313793e-01
606 71 56 1.220090e-01
631 76 57 8.457023e-02
632 75 57 1.256807e-01
633 74 57 4.346455e-02
634 73 57 5.839973e-02
635 72 57 1.099435e-01
636 71 57 1.648284e-01
662 73 58 7.551661e-02
663 72 58 7.197449e-02
664 71 58 6.525586e-02
700 79 79 1.655431e-01
701 78 79 3.587718e-01
702 77 79 3.285322e-01
703 76 79 2.604316e-01
704 75 79 3.154260e-01
705 74 79 1.599363e-01
706 73 79 1.006594e-01
707 72 79 1.143150e-01
708 71 79 3.442250e-02
743 79 80 1.929037e-01
744 78 80 1.828739e-01
745 77 80 2.542400e-01
746 76 80 3.679110e-01
747 75 80 4.160630e-01
748 74 80 2.187383e-01
749 73 80 5.914896e-02
750 72 80 8.890981e-02
751 71 80 1.114226e-01
785 79 81 1.934852e-01
786 78 81 3.357556e-01
787 77 81 2.223992e-01
788 76 81 2.753734e-01
789 75 81 3.602629e-01
790 74 81 1.813481e-01
791 73 81 7.269607e-02
792 72 81 8.458230e-02
793 71 81 2.189210e-01
825 79 82 2.449923e-01
826 78 82 2.649659e-01
827 77 82 2.701585e-01
828 76 82 2.036100e-01
829 75 82 2.162900e-01
830 74 82 2.097996e-01
831 73 82 9.479770e-02
832 72 82 1.349027e-01
833 71 82 7.756859e-02
863 79 83 1.841222e-01
864 78 83 2.462909e-01
865 77 83 4.760483e-01
866 76 83 1.393683e-01
867 75 83 1.849111e-01
868 74 83 1.072082e-01
869 73 83 1.453932e-01
870 72 83 8.461537e-02
871 71 83 3.600376e-02
899 79 84 2.223011e-01
900 78 84 2.266368e-01
901 77 84 2.682749e-01
902 76 84 1.535989e-01
903 75 84 8.656537e-02
904 74 84 1.155910e-01
905 73 84 1.550887e-01
906 72 84 1.052334e-05
907 71 84 9.409200e-03

然后用:

创建“放大”图
library(lattice)
pl <- levelplot(d ~ j * i, data = my.data.frame)
print(pl)

感谢。

2 个答案:

答案 0 :(得分:2)

当提供一个data.frame时,

levelplot()将最有效地工作,该data.frame具有您想要绘制的网格中每个单元格(即行和列坐标的每个组合)的值。为此,我编写了一个小函数,它将“填写”这个特定的数据集,以及其他类似数据的框架,这些数据框缺少你需要绘制的像素的行。

使用它(或类似的东西)应该可以省去“手动”乱码的麻烦,试图弄清楚哪些细胞缺少数据。 (例如,事实证明,即使您提供的小数据子集也缺少明显丢失数据的中心条带之外的某些单元格的值。)

library(lattice)

makeFullGrid <- function(dat) {
    ## Create a list with coordinates for a full grid and all
    ## values set to 0
    fullgrid <-
        with(dat, expand.grid(i = seq(max(i), min(i)),
                              j = seq(min(j), max(j)),
                              D = 0))
    ## Merge it with your current data, then add the two data
    ## columns together
    dat <- merge(fullgrid, dat, by = c("j", "i"), all.x=TRUE)
    dat$d <- dat$d + dat$D
    dat$D <- NULL         ## Clean up
    return(dat)
}    

## Fix up your data
myDat <- my.data.frame
myFullDat <- makeFullGrid(myDat)

## Create the levelplot
pl <- levelplot(d ~ j * i, data = myFullDat)
print(pl)

enter image description here

答案 1 :(得分:0)

一般情况下,绘图功能会保留NA值,没有任何点或颜色,因此您的数据似乎可以满足您的要求:

nadat <- expand.grid(i=71:80, j=63:78)
 nadat$d <- NA
 pl <- levelplot(d ~ j * i, data = rbind(dat,nadat) )
 print(pl)

(顺便说一下,看起来像扫描肺部的纵隔消失了。或者我只是将我的医学背景显示给Rorschach统计数据?)