[R] lattice dotplot reorder contiguous levels

Deepayan Sarkar deepayan.sarkar at gmail.com
Wed Sep 26 13:26:18 CEST 2012


On Wed, Sep 26, 2012 at 3:36 PM, maxbre <mbressan at arpa.veneto.it> wrote:
> sorry for my slow reply, this is what I worked out so far…
>
> my reproducible example and the code
>
> test<-structure(list(site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L,
> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L,
> 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
> 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L), .Label = c("A",
> "B", "C", "D", "E"), class = "factor"), conc = c(2.32, 0.902,
> 0.468, 5.51, 1.49, 0.532, 0.72, 0.956, 0.887, 20, 30, 2.12, 0.442,
> 10, 50, 110, 3.36, 2.41, 20, 70, 3610, 100, 4.79, 20, 0.0315,
> 30, 60, 1, 3.37, 80, 1.21, 0.302, 0.728, 1.29, 30, 40, 90, 30,
> 0.697, 6.25, 0.576, 0.335, 20, 10, 620, 40, 9.98, 4.76, 2.61,
> 3.39, 20, 4.59), samp.time = structure(c(2L, 4L, 4L, 4L, 4L,
> 4L, 5L, 4L, 8L, 8L, 8L, 8L, 8L, 9L, 8L, 7L, 8L, 8L, 8L, 8L, 3L,
> 3L, 2L, 4L, 4L, 4L, 4L, 4L, 1L, 4L, 6L, 4L, 8L, 4L, 8L, 4L, 3L,
> 8L, 4L, 8L, 4L, 8L, 4L, 9L, 3L, 8L, 8L, 8L, 8L, 8L, 8L, 1L), .Label = c("2",
> "4", "12", "24", "96", "135", "167", "168", "169"), class = "factor")),
> .Names = c("site",
> "conc", "samp.time"), row.names = c(NA, 52L), class = "data.frame")
>
> test$samp.time.new <- with(test, reorder(samp.time:site, as.numeric(site)))
>
> m<-match(unique(droplevels(test$samp.time.new)),test$samp.time.new)
> lab<-as.character(test$samp.time[m])
>
> dotplot(samp.time.new~conc|site, data=test,
>         ylim=lab,
>         scales=list(x=list(log=10), y = list(relation = "free")),
>         layout=c(1,5), strip=FALSE, strip.left=TRUE
>         )
>
> Now labels are correctly spaced and sorted out but still a “slight” problem
> persist: i.e. the reordering of samp.time.new within each site; in fact, I
> would like to have an ascending order of sampling time but for some reason
> I’m not able to work it out properly…

For that, it should be enough to just reorder again by samp.time. Your
label code doesn't work then (I haven't tried to figure out why), but
your earlier idea using strsplit() does:


test$samp.time.new <-
    with(test, reorder(reorder(samp.time:site, as.numeric(site)),
                as.numeric(samp.time)))

lab <- sapply(strsplit(levels(test$samp.time.new), ":", fixed=TRUE), "[", 1)

dotplot(samp.time.new~conc|site, data=test,
        ylim=lab,
        scales=list(x=list(log=10), y = list(relation = "free")),
        layout=c(1,5), strip=FALSE, strip.left=TRUE
        )

-Deepayan




More information about the R-help mailing list