[R] lattice dotplot reorder contiguous levels

Deepayan Sarkar deepayan.sarkar at gmail.com
Fri Sep 21 08:55:43 CEST 2012


On Thu, Sep 20, 2012 at 7:48 PM, maxbre <mbressan at arpa.veneto.it> wrote:
> my reproducible example
>
> 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")
>
>
>
> dotplot(samp.time~conc|site, data=test,
>         scales=list(x=list(log=10), y = list(relation = "free")),
>         layout=c(1,5), strip=FALSE, strip.left=TRUE
>         )
>
>
> my objective is to use “site” as conditioning variable but with “samp.time”
> correctly grouped by “site”; the problem here is to ensure that levels of
> “samp.time” within each “site” are contiguous as otherwise they would be not
> contiguous in the dot plot itself (i.e, avoid that sort of holes in between
> y axis categories -see dotplot -)
>
>
> I’ve been trying with this but without much success
>
> test$samp.time.new<-
>   with(test,reorder(samp.time,as.numeric(site)))
>
>
> dotplot(samp.time.new~conc|site, data=test,
>         scales=list(x=list(log=10), y = list(relation = "free")),
>         layout=c(1,5), strip=FALSE, strip.left=TRUE
>         )
>
> I think (I hope) a possible different solution is to create for "ylim" a
> proper character vector of different length to pass to each panel of the
> dotplot (I’m not posting this attempt because too much confused up to now)
>
> can anyone point me in the right direction?

The problem here is that there is crossing between sites and
samp.time. You can try some imaginative permutations of site, such as

test$samp.time.new <- with(test, reorder(samp.time,
as.numeric(factor(site, levels = c("A", "C", "D", "B", "E")))))

which gets all but site B right. There may be another permutation that
works for everything, but it would be much easier to make a nested
factor, i.e.,

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

That just leaves getting the y-labels right, which I will leave for
you to figure out.

(Hint: ylim = some_function_of(levels(test$samp.time.new)))

-Deepayan




More information about the R-help mailing list