[R] lattice plot formatting: pch, abbreviation and labels

Duncan Mackay dulcalma at bigpond.com
Mon Apr 28 03:25:10 CEST 2014


Hi Luigi

Here are 2 ways of doing it.

The first is a "cheats" way ie easy.

The second is a substitute for the proper way who's code eludes me at the moment. I changed the lty on the ablines  as it appears confusing and as you are bolding it seems more appropriate. A better way may be to change 1 line type.

stripplot(copy ~ factor(positivity)|factor(stimulation, levels = c("Unst.", "ESAT6","CFP10","Rv3615c", "Rv2654","Rv3879", "Rv3873","PHA")),
      my.data,
      group = positivity,
      hor=F,
      layout = c(8,1),
      scales = list(x = list(at = c(1,2), labels = c("N","P"))),
      jitter.data=TRUE, pch=c(16,1), col="black",
      ylab=expression(bold("Copy")),
      xlab=expression(bold("Stimulation")),
      main="Plot",
      par.settings = list(strip.background=list(col="white")),
            par.strip.text=list(font=2),
      key = list(space="top",
                 columns=2,
                 text=list(c("Positive", "Negative"), col="black"),
                 points=list(pch=c(16,1), col="black")),
      panel = function(x, y,...){
              pnl = panel.number()
              #panel.abline(h = datmeA[datmeA[,2]== levels(datmeA[,2])[pnl],"ratio"], col = c("red","black"), lty=3)

              panel.average(x, y, fun = mean, horizontal = F, lty = 3, col.line = c("red","black"), type = "l")

              panel.stripplot(x,y, ...)
            }
      )

stripplot(copy ~ factor(positivity)|factor(stimulation, levels = c("Unst.", "ESAT6","CFP10","Rv3615c", "Rv2654","Rv3879", "Rv3873","PHA")),
      my.data,
      group = positivity,
      hor=F,
      layout = c(8,1),
      scales = list(x = list(at = c(1,2), labels = c("N","P"))),
      jitter.data=TRUE, pch=c(16,1), col="black",
      ylab=expression(bold("Copy")),
      xlab=expression(bold("Stimulation")),
      main="Plot",
      par.settings = list(strip.background=list(col="white")),
            par.strip.text=list(font=2),
      key = list(space="top",
                 columns=2,
                 text=list(c("Positive", "Negative"), col="black"),
                 points=list(pch=c(16,1), col="black")),
      panel = function(x, y,...){
                pnl = panel.number()
                #panel.abline(h = datmeA[datmeA[,2]== levels(datmeA[,2])[pnl],"ratio"], col = c("red","black"), lty=3)
                for (j in 1:2){
                  with(subset(datmeA, (positivity == j-1 & stimulation == levels(datmeA$stimulation)[pnl])),
                     panel.abline(h = copy, lwd = 1, col = c("red","black")[j], lty = 1) )

              }

               panel.stripplot(x,y, ...)
            }
      )

Remember abline and panel.abline etc only take 1 line at a time so if you have more than 1 group you have 2 call it more than once 

Regards 
Duncan

-----Original Message-----
From: Luigi Marongiu [mailto:marongiu.luigi at gmail.com] 
Sent: Monday, 28 April 2014 04:03
To: Duncan Mackay
Subject: Re: [R] lattice plot formatting: pch, abbreviation and labels

Dear Duncan,
may I bother you a bit more with the same data set? I would like now
to add a segment corresponding to the median values, as we discussed
antecedently.
I have tried to use the code you wrote in the previous mails, but it
hasn't worked. First I have found the aggregate medians values and
assigned to datmeA, then pasted the code you wrote, but without
success. Would be possible to substitute the panel.abline with
panel.segments? but in this case how to tell lattice what are the
values for "N" or "P"?
Best wishes,
Luigi

CODE::::
library(lattice)

my.data<-structure(list(
   column_1 = 1:120,
   column_2 = structure(c(
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8,
 1,2,3,4,5,6,7,8), .Label = c("Unst.", "ESAT6", "CFP10", "Rv3615c",
"Rv2654", "Rv3879", "Rv3873", "PHA"), class = "factor"),
    column_3 = structure(c(
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0)),
     column_4 = c(
 192.0519108,183.6403531,53.46798757,83.60638077,69.60749873,159.4706861,256.8765622,499.2899303,
 2170.799076,1411.349719,2759.472348,2098.973397,2164.739515,1288.676574,1611.486543,6205.229575,
 870.7424981,465.9967135,191.8962375,864.0937485,2962.693675,1289.259137,2418.651212,7345.712517,
 0,168.1198893,674.4342961,101.1575401,47.81596237,0,0,1420.793922,
 142.6871331,5.466468742,291.9564635,80.73914133,73.02239621,64.47806871,144.3543635,3167.959757,
 3164.748333,1092.634557,28733.20269,1207.87783,729.6090973,151.8706088,241.2466141,9600.963594,
 1411.718287,12569.96285,1143.254476,6317.378481,16542.27718,79.68025792,1958.495138,7224.503437,
 208.4382941,69.48609769,656.691151,0.499017582,7114.910926,187.6296174,41.73980805,8930.784541,
 4.276752185,0.432300363,60.89228665,1.103924786,0.490686366,1.812993239,7.264531581,1518.610307,
 2172.051528,595.8513744,17141.84336,589.6565971,1340.287628,117.350942,593.7034054,24043.61463,
 0,81.83292179,1539.864321,36.41722958,8.385131047,161.7647376,65.21615696,7265.573875,
 97.84753179,154.051827,0.613835842,10.06138851,45.04879285,176.8284258,18795.75462,30676.769,
 5780.34957,944.2200834,2398.235596,1083.393165,2541.714557,1251.670895,1547.178549,1792.679176,
 3067.988416,8117.210173,23676.02226,8251.937547,17360.80494,18563.61561,16941.865,31453.96708,
 2767.493803,4796.33016,12292.93705,3864.657567,9380.673835,14886.44683,8457.88646,26050.47191)),
.Names = c("row", "stimulation", "positivity", "copy"), row.names =
c(NA, -120L),
 class = "data.frame")


key.plot<-list(
  space="top", columns=2,
  text=list(c("Positive", "Negative"), col="black"),
  points=list(pch=c(16,1), col="black"))

datmeA <- aggregate(copy ~ positivity+stimulation, my.data, median, na.rm = T)

stripplot(
      copy ~ factor(positivity)|factor(stimulation,
            levels = c("Unst.", "ESAT6","CFP10","Rv3615c", "Rv2654",
"Rv3879", "Rv3873","PHA")),
            group = positivity,
      my.data,
      hor=F,
      layout = c(8,1),
            scales = list(x = list(at = c(1,2), labels = c("N","P"))),
      jitter.data=TRUE, pch=c(16,1), col="black",
      ylab=expression(bold("Copy")),
xlab=expression(bold("Stimulation")), main="Plot",
      par.settings = list(strip.background=list(col="white")),
            par.strip.text=list(font=2),
      key = key.plot,
            panel = function(x, y){
              pnl = panel.number()
              panel.abline(h = datmeA[datmeA[,2]==

levels(datmeA[,2])[pnl],"ratio"], col = c("red","black"), lty=3)

              panel.stripplot(x,y, ...)
            }
      )

On Sun, Apr 27, 2014 at 2:06 AM, Duncan Mackay <dulcalma at bigpond.com> wrote:
> Hi Luigi
>
> You are typing things unnecessarily: do not use the attach command unless
> absolutely necessary - it has unfortunate consequences.
> It is better to use with or within.
> alpha is not available with some devices with bad consequences if used; its
> default is 1 anyway.
>
> Once you have stated a data.frame as the data object it is usually not
> necessary to use the data.frame$ sign in to signify column names: use the
> column names.
> data = "a data.frame" is the equivalent to with
>
> You are reordering the levels of stimulation and changing the name of 1 so I
> thought it was easiest to make a column stim and do things there otherwise
> it the relevelling could be done in the data argument using the subset
> argument. Then the change to "Unst" could be done by using  strip    =
> strip.custom(factor.levels = ...),
>
> To change for the -/+ I made a group - the easiest way.
> Have a look a changing the negative symbol to 20 or something else as it is
> hard to visualise. You may vary things with changing cex (remember to have 2
> values 1 for each group).
>
> If you do str(xyplot object) you will get a big print of the object and
> within that the x limits are shown as "0", "1" which means that the x values
> are 1 and 2
> There is a command to get these things but I have forgotten it
>
> my.data$stimulation <- factor(levels = c("Unstimulated",
> "ESAT6","CFP10","Rv3615c","Rv2654", "Rv3879", "Rv3873","PHA"))
> my.data$stim <- factor(my.data$stimulation, labels = c("Unst.",
> "ESAT6","CFP10","Rv3615c","Rv2654", "Rv3879", "Rv3873","PHA"))
> my.data$pos <- ifelse(sign(my.data$copy) > 0, 2,1)
>
>   stripplot(copy ~ factor(positivity)|stim,my.data,
>             groups = pos,
>             hor = F,
>             layout = c(8,1),
>             scales = list(x = list(at = c(1,2),
>                                    labels = c("N","P"))),
>             jitter.x = TRUE,
>             amount = 2,
>             pch = c(16,1),
>             col = "black",
>             ylab = expression(bold("Copy")),
>             xlab = expression(bold("Stimulation")),
>             main="Plot",
>             par.settings = list(strip.background=list(col="white")),
> par.strip.text=list(font=2)
>             )
>
> 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-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
> Behalf Of Luigi Marongiu
> Sent: Sunday, 27 April 2014 02:07
> To: r-help at r-project.org
> Subject: [R] lattice plot formatting: pch, abbreviation and labels
>
> Dear all,
> I am trying to use the lattice plot, but the syntax is quite
> difficult. Specifically I have eight variables (1 to 8) each of them
> further subdivided in two classes (negative=0 and positive=1). I am
> using the stripplot() to represent these values. I would like to
> represent the negative and positive values with black and white dots
> so I have tried to use the argument pch=c(16, 1) both in the main
> stripplot function and embedded in the scale argument. However the
> resulting plot shows that some points are drawn with the pch=16 and
> other with pch=1 irrespective of their class.
> Is there a way to draw the values for the variable positivity = 0 with
> pch=16 and those with positivity = 1 with pch=0?
>
> In addition I would like to change the labels under the axis from 0,1
> to N,P. However when I placed labels=c("N", "P") or labels=list("N",
> "P") in the main stripplot() I did not obtained any difference and
> when placed within the scale argument also the -labels were modified.
> Is there a way to change the label 0 with N and the label 1 with P?
>
> final problem: I would like to abbreviate the "Unstimulated" box label
> with "Unst.". I have tried the abbreviate=TRUE argument but again the
> syntax is too complex for me and it did not work.
> Is there a way to abbreviate the variables names?
>
> Thank you very much for your help.
> Best wishes,
> Luigi
>
>
> CODE:::::::::
>
>
> ### open plot library
> library(lattice)
>
> my.data<-structure(list(
>    column_1 = 1:120,
>    column_2 = structure(c(
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8,
>  1,2,3,4,5,6,7,8), .Label = c("Unstimulated", "ESAT6", "CFP10",
> "Rv3615c", "Rv2654", "Rv3879", "Rv3873", "PHA"), class = "factor"),
>     column_3 = structure(c(
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 0,0,0,0,0,0,0,0,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 1,1,1,1,1,1,1,1,
> 0,0,0,0,0,0,0,0)),
>      column_4 = c(
>
> 192.0519108,183.6403531,53.46798757,83.60638077,69.60749873,159.4706861,256.
> 8765622,499.2899303,
>
> 2170.799076,1411.349719,2759.472348,2098.973397,2164.739515,1288.676574,1611
> .486543,6205.229575,
>
> 870.7424981,465.9967135,191.8962375,864.0937485,2962.693675,1289.259137,2418
> .651212,7345.712517,
>  0,168.1198893,674.4342961,101.1575401,47.81596237,0,0,1420.793922,
>
> 142.6871331,5.466468742,291.9564635,80.73914133,73.02239621,64.47806871,144.
> 3543635,3167.959757,
>
> 3164.748333,1092.634557,28733.20269,1207.87783,729.6090973,151.8706088,241.2
> 466141,9600.963594,
>
> 1411.718287,12569.96285,1143.254476,6317.378481,16542.27718,79.68025792,1958
> .495138,7224.503437,
>
> 208.4382941,69.48609769,656.691151,0.499017582,7114.910926,187.6296174,41.73
> 980805,8930.784541,
>
> 4.276752185,0.432300363,60.89228665,1.103924786,0.490686366,1.812993239,7.26
> 4531581,1518.610307,
>
> 2172.051528,595.8513744,17141.84336,589.6565971,1340.287628,117.350942,593.7
> 034054,24043.61463,
>
> 0,81.83292179,1539.864321,36.41722958,8.385131047,161.7647376,65.21615696,72
> 65.573875,
>
> 97.84753179,154.051827,0.613835842,10.06138851,45.04879285,176.8284258,18795
> .75462,30676.769,
>
> 5780.34957,944.2200834,2398.235596,1083.393165,2541.714557,1251.670895,1547.
> 178549,1792.679176,
>
> 3067.988416,8117.210173,23676.02226,8251.937547,17360.80494,18563.61561,1694
> 1.865,31453.96708,
>
> 2767.493803,4796.33016,12292.93705,3864.657567,9380.673835,14886.44683,8457.
> 88646,26050.47191)),
> .Names = c("row", "stimulation", "positivity", "copy"), row.names =
> c(NA, -120L),
>  class = "data.frame")
> attach(my.data)
>
> stripplot(my.data$copy ~
> factor(my.data$positivity)|factor(my.data$stimulation,
>             levels = c("Unstimulated", "ESAT6","CFP10","Rv3615c",
> "Rv2654", "Rv3879", "Rv3873","PHA")),
>             my.data, hor=F, layout = c(8,1), scales = list(relation =
> "same"),
>       jitter.data=TRUE, alpha=1, pch=c(16,1), col="black",
>       ylab=expression(bold("Copy")),
> xlab=expression(bold("Stimulation")), main="Plot",
>       par.settings = list(strip.background=list(col="white")),
>             par.strip.text=list(font=2))
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
>




More information about the R-help mailing list