[R] high density plots using lattice dotplot()

Duncan Mackay
Thu, 23 Apr 2015 14:26:25 -0000

Hi Luigi

Michael answered your question about printing

lattice and ggplot require their graphics to be in print()

If you have problems in printing you may have to use

trellis.device(device = pdf,  # or what ever the actual device is
                        file = ####,
                        <remainder of script>)
? trellis.device for info
I occasionally have to use it sometimes instead of pdf etc

Duncan

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

Dear Duncan,
many thanks for the precious help! I have rearranged what you sent me
with a bit of stuff I wrote already for another project and the
results seems to work fine.
Best regards,
Luigi

>>> example
DF <-
  data.frame(Y = rnorm(17280),
             X = rnorm(1:45),
             Y2 = rnorm(17280)+2,
             Z  = 1:384)
head(df,10)
xyplot(Y ~ X | Z,
       data = DF,
       groups = Z,
       allow.multiple = TRUE,
       ylab= "Y VALUES",
       xlab="X VALUES",
       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),
         par.main.text = list(cex = 0.8),
         superpose.symbol = list(type = "l", cex = 1)
       ),
       strip    = FALSE,
       type = "l",
       col = 3,
       panel = panel.superpose
)

On Thu, Apr 23, 2015 at 3:08 AM, Duncan Mackay <dulcalma at bigpond.com>
wrote:
> 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.
>>>
>>
>