lattice xyplot point labelling

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

lattice xyplot point labelling

maxbre
This is my reproducible example

tv.ms<-structure(list(inq = structure(4:17, .Label = c("D4", "D5", "D6a",
"D6b", "D6c", "D7", "D8", "F4", "F5a", "F5b", "F6a", "F6b", "F6c",
"F6d", "F7a", "F7b", "F8"), class = "factor"), tv.km.median.iteq = c(0.320000000000004,
0.239999999999998, 0.240000000000002, 0.0800000000000001, 0.989999999999995,
0.309999999999999, 4.47000000000003, 0.620000000000005, 0.620000000000005,
0.18, 0.790000000000006, 0.32, 0.0200000000000005, 0.01), ms.km.median.iteq = c(0.420000000000002,
0.380000000000001, 0.33, 0.0900000000000001, 1.06999999999994,
0.559999999999974, 5.20000000000027, 1.5, 1.19, 0.469999999999999,
0.310000000000002, 0.459999999999999, 0.0400000000000003, 0.04
), type = c("PCDD", "PCDD", "PCDD", "PCDD", "PCDF", "PCDF", "PCDF",
"PCDF", "PCDF", "PCDF", "PCDF", "PCDF", "PCDF", "PCDF")), .Names = c("inq",
"tv.km.median.iteq", "ms.km.median.iteq", "type"), row.names = 4:17, class = "data.frame")


I worked out the chart mainly with the hints of this great forum (thanks again for that): what I’ve done so far accomplishes my needs except for that now I need a little final tweaking in order to avoid the overlapping of some specific labels (i.e. by looking at the plot the labels: F6b and F6a, F7a and F5a)


xyplot(tv.km.median.iteq~ms.km.median.iteq|type, data=tv.ms,
        layout=c(1,2),
        aspect="xy",
        xlab = expression(paste('ms [ fg/', m^3, ' ]', sep = '')),
        ylab = expression(paste('tv [ fg/', m^3, ' ]', sep = '')),
        scales= list(relation="free", log=10, cex=0.8),
       
       prepanel = function(x, y, subscripts) {
          rr<- range(cbind(x,y))
          list(xlim = rr, ylim= rr)
        },
        panel = function(x, y , subscripts,...) {
          panel.xyplot(x, y, cex=0.8,...)
          panel.abline(a = 0, b = 1, lty = 2, col ="gray")
          panel.text(x, y, labels=tv.ms$inq[subscripts],
                     cex = 0.7, pos=3, offset=1, srt=0, adj=c(1,1))
          #alternative to the use of panel.text
          #ltext(x=x, y=y, labels=tv.ms$inq[subscripts], pos=1, cex=0.8)
        },
        #subscripts=TRUE,
        xscale.components = function(...)  {
          ans <- xscale.components.logpower(...)
          range <- ans$num.limit
          newtck <- round(seq(range[1],range[2],l=7),1)
          ans$bottom$ticks$at <- newtck
          ans$bottom$labels$at <- newtck
          ans$bottom$labels$labels <-parse(text=paste('10^',newtck,sep=''))
          ans
        } ,
        yscale.components  = function(...)  {
          ans <- yscale.components.logpower(...)
          range <- ans$num.limit
          newtck <- round(seq(range[1],range[2],l=7),1)
          ans$left$ticks$at <- newtck
          ans$left$labels$at <- newtck
          ans$left$labels$labels <-parse(text=paste('10^',newtck,sep=''))
          ans
        }
)

I’m thinking to sort out the problem by:
1 - plotting all labels except for those overlapping (i.e the above mentioned points);
2 - plotting the remaining labels (i.e. the overlapping ones) by introducing a “manual displacement”;

I know that’s probably not much efficient nor elegant resorting to a “manual solution” involving at least two “plotting steps” (the first to see where to tweak and the second to fix) but I can’t think to any other solution

Any help?

Thank you

max
Reply | Threaded
Open this post in threaded view
|

Re: lattice xyplot point labelling

Duncan Mackay-2
hi

the bottom panel seems ok so for the top you
supply a vector of positions that are your
required positions (name eg posvec) to the panel
function. may need to do the same for other functions
to access the correct panel there is the ifelse statement

posvec = c(...)

   panel = function(x, y , subscripts,...) {
           pnl = panel.number()
           panel.xyplot(x, y, cex=0.8,...)
           panel.abline(a = 0, b = 1, lty = 2, col ="gray")
           if (pnl == 2){
           panel.text(x, y, labels=tv.ms$inq[subscripts],
                      cex = 0.7, pos=3, offset=1, srt=0, adj=c(1,1))
           } else {
           panel.text(x, y, labels=tv.ms$inq[subscripts],
                      cex = 0.7, pos=posvec, offset=1, srt=0, adj=c(1,1))
           }
           #alternative to the use of panel.text
           #ltext(x=x, y=y, labels=tv.ms$inq[subscripts], pos=1, cex=0.8)
         },

HTh

Duncan

Duncan Mackay
Department of Agronomy and Soil Science
University of New England
Armidale NSW 2351
Email: home: [hidden email]


At 22:30 27/02/2013, you wrote:

>This is my reproducible example
>tv.ms<-structure(list(inq = structure(4:17,
>.Label = c("D4", "D5", "D6a", "D6b", "D6c",
>"D7", "D8", "F4", "F5a", "F5b", "F6a", "F6b",
>"F6c", "F6d", "F7a", "F7b", "F8"), class =
>"factor"), tv.km.median.iteq =
>c(0.320000000000004, 0.239999999999998,
>0.240000000000002, 0.0800000000000001,
>0.989999999999995, 0.309999999999999,
>4.47000000000003, 0.620000000000005,
>0.620000000000005, 0.18, 0.790000000000006,
>0.32, 0.0200000000000005, 0.01),
>ms.km.median.iteq = c(0.420000000000002,
>0.380000000000001, 0.33, 0.0900000000000001,
>1.06999999999994, 0.559999999999974,
>5.20000000000027, 1.5, 1.19, 0.469999999999999,
>0.310000000000002, 0.459999999999999,
>0.0400000000000003, 0.04 ), type = c("PCDD",
>"PCDD", "PCDD", "PCDD", "PCDF", "PCDF", "PCDF",
>"PCDF", "PCDF", "PCDF", "PCDF", "PCDF", "PCDF",
>"PCDF")), .Names = c("inq", "tv.km.median.iteq",
>"ms.km.median.iteq", "type"), row.names = 4:17,
>class = "data.frame") I worked out the chart
>mainly with the hints of this great forum
>(thanks again for that): what I’ve done so far
>accomplishes my needs except for that now I need
>a little final tweaking in order to avoid the
>overlapping of some specific labels (i.e. by
>looking at the plot the labels: F6b and F6a, F7a
>and F5a)
>xyplot(tv.km.median.iteq~ms.km.median.iteq|type,
>data=tv.ms,         layout=c(1,2),
>aspect="xy",         xlab = expression(paste('ms
>[ fg/', m^3, ' ]', sep = '')),         ylab =
>expression(paste('tv [ fg/', m^3, ' ]', sep =
>'')),         scales= list(relation="free",
>log=10, cex=0.8),                prepanel =
>function(x, y, subscripts) {           rr<-
>range(cbind(x,y))           list(xlim = rr,
>ylim= rr)         },         panel = function(x,
>y , subscripts,...) {           panel.xyplot(x,
>y, cex=0.8,...)           panel.abline(a = 0, b
>= 1, lty = 2, col
>="gray")           panel.text(x, y,
>labels=tv.ms$inq[subscripts],
>cex = 0.7, pos=3, offset=1, srt=0,
>adj=c(1,1))           #alternative to the use of
>panel.text           #ltext(x=x, y=y,
>labels=tv.ms$inq[subscripts], pos=1,
>cex=0.8)         },         #subscripts=TRUE,
>      xscale.components =
>function(...)  {           ans <-
>xscale.components.logpower(...)           range
><- ans$num.limit           newtck <-
>round(seq(range[1],range[2],l=7),1)
>ans$bottom$ticks$at <-
>newtck           ans$bottom$labels$at <-
>newtck           ans$bottom$labels$labels
><-parse(text=paste('10^',newtck,sep=''))
>ans         } ,         yscale.components  =
>function(...)  {           ans <-
>yscale.components.logpower(...)           range
><- ans$num.limit           newtck <-
>round(seq(range[1],range[2],l=7),1)
>ans$left$ticks$at <-
>newtck           ans$left$labels$at <-
>newtck           ans$left$labels$labels
><-parse(text=paste('10^',newtck,sep=''))
>ans         } ) I’m thinking to sort out the
>problem by: 1 -       plotting all labels except
>for those overlapping (i.e the above mentioned
>points); 2 -  plotting the remaining labels
>(i.e. the overlapping ones) by introducing a
>“manual displacement”; I know that’s
>probably not much efficient nor elegant
>resorting to a “manual solution” involving
>at least two “plotting steps” (the first to
>see where to tweak and the second to fix) but I
>can’t think to any other solution Any help?
>Thank you max -- View this message in context:
>http://r.789695.n4.nabble.com/lattice-xyplot-point-labelling-tp4659798.html 
>Sent from the R help mailing list archive at
>Nabble.com.
>______________________________________________
>[hidden email] 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.

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: lattice xyplot point labelling

maxbre
hi duncan, thanks a lot for your help!

yes, your solution is working fine with a little tweaking of the vector "poscec" : but on the other hand it's just affecting the relative position of labels around respective points;
to get more flexibility would be probably better to supply  (even if I do not know exactly how) a set of coordinates for respective labels via the parameters "x" and  "y" or maybe just changing the position of some specific labels remaing the rest unaltered
can you think to a viable solution for this approach?
I've been trying that but for reasons I do not fully understand I can't make it work

thanks again for your valuable help
Massimo Bressan 

ARPAV
Environmental Protection Agency of Veneto Region - Italy
Department of Treviso
31100 Treviso, Italy 



Il 27/02/2013 23:38, Duncan Mackay-2 [via R] ha scritto:
hi

the bottom panel seems ok so for the top you
supply a vector of positions that are your
required positions (name eg posvec) to the panel
function. may need to do the same for other functions
to access the correct panel there is the ifelse statement

posvec = c(...)

   panel = function(x, y , subscripts,...) {
           pnl = panel.number()
           panel.xyplot(x, y, cex=0.8,...)
           panel.abline(a = 0, b = 1, lty = 2, col ="gray")
           if (pnl == 2){
           panel.text(x, y, labels=tv.ms$inq[subscripts],
                      cex = 0.7, pos=3, offset=1, srt=0, adj=c(1,1))
           } else {
           panel.text(x, y, labels=tv.ms$inq[subscripts],
                      cex = 0.7, pos=posvec, offset=1, srt=0, adj=c(1,1))
           }
           #alternative to the use of panel.text
           #ltext(x=x, y=y, labels=tv.ms$inq[subscripts], pos=1, cex=0.8)
         },

HTh

Duncan

Duncan Mackay
Department of Agronomy and Soil Science
University of New England
Armidale NSW 2351
Email: home: [hidden email]


At 22:30 27/02/2013, you wrote:

>This is my reproducible example
>tv.ms<-structure(list(inq = structure(4:17,
>.Label = c("D4", "D5", "D6a", "D6b", "D6c",
>"D7", "D8", "F4", "F5a", "F5b", "F6a", "F6b",
>"F6c", "F6d", "F7a", "F7b", "F8"), class =
>"factor"), tv.km.median.iteq =
>c(0.320000000000004, 0.239999999999998,
>0.240000000000002, 0.0800000000000001,
>0.989999999999995, 0.309999999999999,
>4.47000000000003, 0.620000000000005,
>0.620000000000005, 0.18, 0.790000000000006,
>0.32, 0.0200000000000005, 0.01),
>ms.km.median.iteq = c(0.420000000000002,
>0.380000000000001, 0.33, 0.0900000000000001,
>1.06999999999994, 0.559999999999974,
>5.20000000000027, 1.5, 1.19, 0.469999999999999,
>0.310000000000002, 0.459999999999999,
>0.0400000000000003, 0.04 ), type = c("PCDD",
>"PCDD", "PCDD", "PCDD", "PCDF", "PCDF", "PCDF",
>"PCDF", "PCDF", "PCDF", "PCDF", "PCDF", "PCDF",
>"PCDF")), .Names = c("inq", "tv.km.median.iteq",
>"ms.km.median.iteq", "type"), row.names = 4:17,
>class = "data.frame") I worked out the chart
>mainly with the hints of this great forum
>(thanks again for that): what I’ve done so far
>accomplishes my needs except for that now I need
>a little final tweaking in order to avoid the
>overlapping of some specific labels (i.e. by
>looking at the plot the labels: F6b and F6a, F7a
>and F5a)
>xyplot(tv.km.median.iteq~ms.km.median.iteq|type,
>data=tv.ms,         layout=c(1,2),
>aspect="xy",         xlab = expression(paste('ms
>[ fg/', m^3, ' ]', sep = '')),         ylab =
>expression(paste('tv [ fg/', m^3, ' ]', sep =
>'')),         scales= list(relation="free",
>log=10, cex=0.8),                prepanel =
>function(x, y, subscripts) {           rr<-
>range(cbind(x,y))           list(xlim = rr,
>ylim= rr)         },         panel = function(x,
>y , subscripts,...) {           panel.xyplot(x,
>y, cex=0.8,...)           panel.abline(a = 0, b
>= 1, lty = 2, col
>="gray")           panel.text(x, y,
>labels=tv.ms$inq[subscripts],
>cex = 0.7, pos=3, offset=1, srt=0,
>adj=c(1,1))           #alternative to the use of
>panel.text           #ltext(x=x, y=y,
>labels=tv.ms$inq[subscripts], pos=1,
>cex=0.8)         },         #subscripts=TRUE,
>      xscale.components =
>function(...)  {           ans <-
>xscale.components.logpower(...)           range
><- ans$num.limit           newtck <-
>round(seq(range[1],range[2],l=7),1)
>ans$bottom$ticks$at <-
>newtck           ans$bottom$labels$at <-
>newtck           ans$bottom$labels$labels
><-parse(text=paste('10^',newtck,sep=''))
>ans         } ,         yscale.components  =
>function(...)  {           ans <-
>yscale.components.logpower(...)           range
><- ans$num.limit           newtck <-
>round(seq(range[1],range[2],l=7),1)
>ans$left$ticks$at <-
>newtck           ans$left$labels$at <-
>newtck           ans$left$labels$labels
><-parse(text=paste('10^',newtck,sep=''))
>ans         } ) I’m thinking to sort out the
>problem by: 1 -       plotting all labels except
>for those overlapping (i.e the above mentioned
>points); 2 -  plotting the remaining labels
>(i.e. the overlapping ones) by introducing a
>“manual displacement”; I know that’s
>probably not much efficient nor elegant
>resorting to a “manual solution” involving
>at least two “plotting steps” (the first to
>see where to tweak and the second to fix) but I
>can’t think to any other solution Any help?
>Thank you max -- View this message in context:
>http://r.789695.n4.nabble.com/lattice-xyplot-point-labelling-tp4659798.html 
>Sent from the R help mailing list archive at
>Nabble.com.
>______________________________________________
>[hidden email] 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.

______________________________________________
[hidden email] 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.



If you reply to this email, your message will be added to the discussion below:
http://r.789695.n4.nabble.com/lattice-xyplot-point-labelling-tp4659798p4659841.html
To unsubscribe from lattice xyplot point labelling, click here.
NAML