[R] high density plots using lattice dotplot()

Duncan Mackay
Thu, 23 Apr 2015 02:08:41 -0000

Hi Luigi

Try

set.seed(1)

PLATE <-
data.frame(Delta.Rn = rnorm(500),
           Cycle = rnorm(500),
           Delta2 = rnorm(500)+1,
           Well  = rep(1:50, each = 10))
head(PLATE,10)

xyplot(Delta.Rn+Delta2 ~ Cycle | Well,
         data = subset(PLATE, Well %in% 1:49),
         allow.multiple = TRUE,
         ylab="Fluorescence (Delta Rn)",
         xlab="Cycles",
         main="TITLE",
         scales = list(
           x = list(draw = FALSE),
           y = list(draw = FALSE),
           relation="same",
           alternating=TRUE),
         as.table = TRUE,
         layout = c(10,5),
         par.settings = list(
           strip.background=list(col="white"),
           # layout.heights = list(strip = 0.8),
           axis.text = list(cex = 0.6),
           par.xlab.text = list(cex = 0.75),
           par.ylab.text = list(cex = 0.75),
           par.main.text = list(cex = 0.8),
           superpose.symbol = list(pch = ".", cex = 2,
                                   col = c(2,4) )
         ),
         strip    = FALSE,
         type = "p",
         key = list(text = list(label =
c("Delta.Rn","Delta2")),
                    points = list(cex = 0.6, pch = 16, col = c(2,4)),
                    cex = 0.6,
                    x = 0.9,
                    y = 0.1),
         panel = panel.superpose,
         panel.groups = function(x,y,...){

                   panel.xyplot(x,y,... )

                   # text argument can be a vector of values not
                   # necessarily the group name
                   pnl = panel.number()  # needed as group.number if added is
now either 1 or 2

                   grid.text(c(LETTERS,letters)[pnl],
                             y = 0.93, x = 0.5,
                             default.units = "npc",
                             just = c("left", "bottom"),
                             gp = gpar(fontsize = 7) )

         }
  )

Remember to delete the group argument (I forgot to at first as the groups are
now Delta.Rn Delta2)
You may have 1+ empty panels so put the legend there where ever it is just amend
the x and y or fine tune them
you can have the pch = "." and increase cex but  it will become as
square with large cex
Duncan


-----Original Message-----
From: Luigi Marongiu [mailto:marongiu.luigi at gmail.com]
Sent: Thursday, 23 April 2015 10:05
To: Duncan Mackay
Subject: Re: [R] high density plots using lattice dotplot()

Dear Duncan,
sorry to come back so soon, but i wanted to ask you whether it would
be  possible to plot two sets of lines within each box, let's say a
main value A and a secondary value B. In normal plots I could use a
plot() followed by points(); what would be the strategy here?
Thank you again,
best regards,
Luigi


On Wed, Apr 22, 2015 at 6:46 AM, Duncan Mackay <dulcalma at bigpond.com>
wrote:
>
> Hi Luigi
>
> I should have made up an example to make things easier when I replied today
>
> This should get you going
>
> set.seed(1)
>
> PLATE <-
> data.frame(Delta.Rn = rnorm(500),
>            Cycle = rnorm(500),
>            Well  = rep(1:50, each = 10))
> head(PLATE)
>
> xyplot(Delta.Rn ~ Cycle | Well,
>          data = PLATE,
>          groups = Well,
>          ylab="Fluorescence (Delta Rn)",
>          xlab="Cycles",
>          main="TITLE",
>          scales = list(
>            x = list(draw = FALSE),
>            y = list(draw = FALSE),
>            relation="same",
>            alternating=TRUE),
>          as.table = TRUE,
>          layout = c(10,5),
>          par.settings = list(
>            strip.background=list(col="white"),
>            # layout.heights = list(strip = 0.8),
>            axis.text = list(cex = 0.6),
>            par.xlab.text = list(cex = 0.75),
>            par.ylab.text = list(cex = 0.75),
>           par.main.text = list(cex = 0.8)
>            superpose.symbol = list(pch = ".", cex = 2)
>          ),
>          strip    = FALSE,
>          type = "p",
>          col = 1,
>          panel = panel.superpose,
>          panel.groups = function(x,y,...,group.number){
>
>                    panel.xyplot(x,y,... )
>
>                    # text argument can be a vector of values not
>                    # necessarily the group name
>                    grid.text(c(LETTERS,letters)[group.number],
>                              y = 0.93, x = 0.5,
>                              default.units = "npc",
>                              just = c("left",
"bottom"),
>                              gp = gpar(fontsize = 7) )
>
>          }
>   )
>
> You could use panel.text instead of grid.text
> Duncan
>
> -----Original Message-----
> From: Luigi Marongiu [mailto:marongiu.luigi at gmail.com]
> Sent: Wednesday, 22 April 2015 08:24
> To: Duncan Mackay
> Subject: Re: [R] high density plots using lattice dotplot()
>
> Dear Duncan,
> thank you for your reply. I tried to implement your suggestions but as
> is on your reply did not work (actually R crashed) and a slight
> elaboration returned the figure attached, which is essentially still
> displaying text and not drawing the data. Here is what I wrote:
>
> xyplot(Delta.Rn ~ Cycle | Well,
>          data = PLATE,
>          ylab="Fluorescence (Delta Rn)",
>          xlab="Cycles",
>          main=TITLE,
>          scales = list(
>            x = list(draw = FALSE),
>            y = list(draw = FALSE),
>            relation="same",
>            alternating=TRUE),
>          as.table = TRUE,
>          layout = c(24,16),
>          par.settings = list(
>            strip.background=list(col="white"),
>            axis.text = list(cex = 0.6),
>            par.xlab.text = list(cex = 0.75),
>            par.ylab.text = list(cex = 0.75),
>            superpose.symbol = list(pch = ".", cex = 2)
>          ),
>          strip    = FALSE,
>          type = "p",
>          layout.heights = list(strip = 0.8),
>          panel = function(x,y, subscripts, groups,...){
>            panel.superpose(x,y,subscripts,groups,...,
>                            col = ...)
>            panel.text(x,y,...,cex = 0.6)
>          }
>   )
>
>
> How can I improve the script?
> Many thanks
> Luigi
>
> On Tue, Apr 21, 2015 at 12:35 AM, Duncan Mackay <dulcalma at
bigpond.com> wrote:
>> Hi Luigi
>>
>> Strips take up space so if you are willing to not have strip and put
the
>> strip values within the plot area then
>>
>>       xyplot(y ~ x|cond.factor, data = ...,
>>              as.table = T,
>>              groups   = ...,
>>              layout   = ...,
>>              drop.unused = T,
>>              par.settings = list(axis.text = list(cex = 0.6),
>>                                  par.xlab.text = list(cex = 0.75),
>>                                  par.ylab.text = list(cex = 0.75)
>>                                  superpose.symbol = list(pch =
".", cex = 2)
>>                             ),
>>              strip    = FALSE,
>>              scales   = list(x = list(alternating = 2),
>>                              y = list(alternating = FALSE)
>>                              ),
>>              type = "p",
>>              panel = function(x,y, subscripts, groups,...){
>>
panel.superpose(x,y,subscripts,groups,...,
>> col = ...)
>>                                 panel.text(x,y,...,cex = 0.6)
>>                             }
>>       )
>>
>> if the text values are a vector
>>       stext = ...
>>       xyplot(y ~ x|cond.factor, data = ...,
>>              as.table = T,
>>              groups   = ...,
>>              layout   = ...,
>>              drop.unused = T,
>>              par.settings = list(axis.text = list(cex = 0.6),
>>                                  par.xlab.text = list(cex = 0.75),
>>                                  par.ylab.text = list(cex = 0.75)
>>                                  superpose.symbol = list(pch =
".", cex = 2)
>>                             ),
>>              strip    = FALSE,
>>              scales   = list(x = list(alternating = 2),
>>                              y = list(alternating = FALSE)
>>                              ),
>>              type = "p",
>>              panel = function(x,y, subscripts, groups,...){
>>                                pnl = panel.number()
>>
panel.superpose(x,y,subscripts,groups,...,
>> col = ...)
>>                                 panel.text(x,y,stext[pnl],cex = 0.6)
>>                             }
>>       )
>>
>> you could also you group.number instead of pnl if it is needed
elsewhere.
>> text position could be done in a similar fashion if needed to be in
>> different places for some panels.
>>
>> If you require the strip then an additional par.settings is
>> layout.heights = list(strip = 0.8)
>> or even untested in this situation
>> strip = FALSE
>> strip.left  = TRUE
>>
>> Regards
>>
>> Duncan
>>
>> Duncan Mackay
>> Department of Agronomy and Soil Science
>> University of New England
>> Armidale NSW 2351
>> Email: home: mackay at northnet.com.au
>>
>> -----Original Message-----
>> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of
Luigi
>> Marongiu
>> Sent: Sunday, 19 April 2015 19:28
>> To: r-help
>> Subject: [R] high density plots using lattice dotplot()
>>
>> Dear all,
>> I am trying to plot the results of a PCR experiments that involves 384
>> individual plots. Admittedly the space for the plots will be tiny, but
>> I just nedd some icon to have a feeling of the layout of the
>> experiment and a quick comparison of the plots.
>> I believe that lattice would be the right tool, but when I tried to
>> implement i got an error. Specifically the output would be a A4 pdf,
>> so with about 600 cm2 of drawing space, which gives about 1.5 cm2 for
>> each plot; removing the labels that might just work.
>> So I have the y values = 'fluorescence', x 'values' =
cycles and 384
>> 'well' data. I implemented to begin with:
>>
>> xyplot(fluorescence ~ cycles | well,
>>          ylab="Fluorescence",
>>          xlab="Cycles",
>>          main=list(draw = FALSE),
>>          scales = list(
>>            x = list(draw = FALSE),
>>            y = list(draw = FALSE),
>>            relation="same",
>>            alternating=TRUE),
>>          layout = c(24,16),
>>          par.settings =
list(strip.background=list(col="white")),
>>          pch = "."
>>   )
>>
>> but the  the individual graphs show only the writing "data"
instead of
>> the actual plots.
>> How can I overcome this error?
>> Thank you
>> Best regards
>> Luigi
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>