Re: [R] lattice xscale.components: different ticks on top/bottom axis
On Sat, Apr 2, 2011 at 1:29 AM, boris.vasil...@forces.gc.ca wrote: On Fri, Mar 11, 2011 at 12:28 AM, boris.vasil...@forces.gc.ca wrote: Good afternoon, I am trying to create a plot where the bottom and top axes have the same scale but different tick marks. I tried user-defined xscale.component function but it does not produce desired results. Can anybody suggest where my use of xscale.component function is incorrect? For example, the code below tries to create a plot where horizontal axes limits are c(0,10), top axis has ticks at odd integers, and bottom axis has ticks at even integers. library(lattice) df - data.frame(x=1:10,y=1:10) xscale.components.A - function(...,user.value=NULL) { # get default axes definition list; print user.value ans - xscale.components.default(...) print(user.value) # start with the same definition of bottom and top axes ans$top - ans$bottom # - bottom labels ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) # - top labels ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) # return axes definition list return(ans) } oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10),at=0:10,alternating=3)), xscale.components=xscale.components.A, user.value=1) print(oltc) The code generates a figure with incorrectly placed bottom and top labels. Bottom labels B-0, B-2, ... are at 0, 1, ... and top labels T-1, T-3, ... are at 0, 1, ... When axis-function runs out of labels, it replaces labels with NA. It appears that lattice uses top$ticks$at to place labels and top$labels$labels for labels. Is there a way to override this behaviour (other than to expand the labels$labels vector to be as long as ticks$at vector and set necessary elements to )? Well, top|bottom$ticks$at is used to place the ticks, and $labels$at is used to place the labels. They should typically be the same, but you have changed one and not the other. Everything seems to work if you set $ticks$at to the same values as $labels$at: ## - bottom labels + ans$bottom$ticks$at - seq(0,10,by=2) ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) ## - top labels + ans$top$ticks$at - seq(1,9,by=2) ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) Also, can user-parameter be passed into xscale.components() function? (For example, locations and labels of ticks on the top axis). In the code above, print(user.value) returns NULL even though in the xyplot() call user.value is 1. No. Unrecognized arguments are passed to the panel function only, not to any other function. However, you can always define an inline function: oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10), at = 0:10, alternating=3)), xscale.components = function(...) xscale.components.A(..., user.value=1)) Hope that helps (and sorry for the late reply). -Deepayan Deepyan, Thank you very much for your reply. It makes things a bit clearer. It other words in the list prepared by xscale.components(), vectors top|bottom$ticks$at and top|bottom$labels$at must be the same. If only every second tick is to be labelled then every second label should be set explicitly to empty strings: Now when you put it that way, the current behaviour does seem wrong (I didn't read your original post carefully enough). I guess this was one of the not-yet-implemented things mentioned in the Details section of ?xscale.components.default. I have added support for different ticks$at and labels$at in the SVN sources in r-forge. You can test it from there (your original code works as expected). I won't make a new release on CRAN until after R 2.13 is released (we are almost in code freeze now). -Deepayan Great! Thank you very much. Boris. __ R-help@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.
Re: [R] lattice xscale.components: different ticks on top/bottom axis
On Sat, Apr 2, 2011 at 1:29 AM, boris.vasil...@forces.gc.ca wrote: On Fri, Mar 11, 2011 at 12:28 AM, boris.vasil...@forces.gc.ca wrote: Good afternoon, I am trying to create a plot where the bottom and top axes have the same scale but different tick marks. I tried user-defined xscale.component function but it does not produce desired results. Can anybody suggest where my use of xscale.component function is incorrect? For example, the code below tries to create a plot where horizontal axes limits are c(0,10), top axis has ticks at odd integers, and bottom axis has ticks at even integers. library(lattice) df - data.frame(x=1:10,y=1:10) xscale.components.A - function(...,user.value=NULL) { # get default axes definition list; print user.value ans - xscale.components.default(...) print(user.value) # start with the same definition of bottom and top axes ans$top - ans$bottom # - bottom labels ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) # - top labels ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) # return axes definition list return(ans) } oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10),at=0:10,alternating=3)), xscale.components=xscale.components.A, user.value=1) print(oltc) The code generates a figure with incorrectly placed bottom and top labels. Bottom labels B-0, B-2, ... are at 0, 1, ... and top labels T-1, T-3, ... are at 0, 1, ... When axis-function runs out of labels, it replaces labels with NA. It appears that lattice uses top$ticks$at to place labels and top$labels$labels for labels. Is there a way to override this behaviour (other than to expand the labels$labels vector to be as long as ticks$at vector and set necessary elements to )? Well, top|bottom$ticks$at is used to place the ticks, and $labels$at is used to place the labels. They should typically be the same, but you have changed one and not the other. Everything seems to work if you set $ticks$at to the same values as $labels$at: ## - bottom labels + ans$bottom$ticks$at - seq(0,10,by=2) ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) ## - top labels + ans$top$ticks$at - seq(1,9,by=2) ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) Also, can user-parameter be passed into xscale.components() function? (For example, locations and labels of ticks on the top axis). In the code above, print(user.value) returns NULL even though in the xyplot() call user.value is 1. No. Unrecognized arguments are passed to the panel function only, not to any other function. However, you can always define an inline function: oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10), at = 0:10, alternating=3)), xscale.components = function(...) xscale.components.A(..., user.value=1)) Hope that helps (and sorry for the late reply). -Deepayan Deepyan, Thank you very much for your reply. It makes things a bit clearer. It other words in the list prepared by xscale.components(), vectors top|bottom$ticks$at and top|bottom$labels$at must be the same. If only every second tick is to be labelled then every second label should be set explicitly to empty strings: Now when you put it that way, the current behaviour does seem wrong (I didn't read your original post carefully enough). I guess this was one of the not-yet-implemented things mentioned in the Details section of ?xscale.components.default. I have added support for different ticks$at and labels$at in the SVN sources in r-forge. You can test it from there (your original code works as expected). I won't make a new release on CRAN until after R 2.13 is released (we are almost in code freeze now). -Deepayan __ R-help@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.
Re: [R] lattice xscale.components: different ticks on top/bottom axis
On Fri, Mar 11, 2011 at 12:28 AM, boris.vasil...@forces.gc.ca wrote: Good afternoon, I am trying to create a plot where the bottom and top axes have the same scale but different tick marks. I tried user-defined xscale.component function but it does not produce desired results. Can anybody suggest where my use of xscale.component function is incorrect? For example, the code below tries to create a plot where horizontal axes limits are c(0,10), top axis has ticks at odd integers, and bottom axis has ticks at even integers. library(lattice) df - data.frame(x=1:10,y=1:10) xscale.components.A - function(...,user.value=NULL) { # get default axes definition list; print user.value ans - xscale.components.default(...) print(user.value) # start with the same definition of bottom and top axes ans$top - ans$bottom # - bottom labels ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) # - top labels ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) # return axes definition list return(ans) } oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10),at=0:10,alternating=3)), xscale.components=xscale.components.A, user.value=1) print(oltc) The code generates a figure with incorrectly placed bottom and top labels. Bottom labels B-0, B-2, ... are at 0, 1, ... and top labels T-1, T-3, ... are at 0, 1, ... When axis-function runs out of labels, it replaces labels with NA. It appears that lattice uses top$ticks$at to place labels and top$labels$labels for labels. Is there a way to override this behaviour (other than to expand the labels$labels vector to be as long as ticks$at vector and set necessary elements to )? Well, top|bottom$ticks$at is used to place the ticks, and $labels$at is used to place the labels. They should typically be the same, but you have changed one and not the other. Everything seems to work if you set $ticks$at to the same values as $labels$at: ## - bottom labels + ans$bottom$ticks$at - seq(0,10,by=2) ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) ## - top labels + ans$top$ticks$at - seq(1,9,by=2) ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) Also, can user-parameter be passed into xscale.components() function? (For example, locations and labels of ticks on the top axis). In the code above, print(user.value) returns NULL even though in the xyplot() call user.value is 1. No. Unrecognized arguments are passed to the panel function only, not to any other function. However, you can always define an inline function: oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10), at = 0:10, alternating=3)), xscale.components = function(...) xscale.components.A(..., user.value=1)) Hope that helps (and sorry for the late reply). -Deepayan __ R-help@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.
Re: [R] lattice xscale.components: different ticks on top/bottom axis
On Fri, Mar 11, 2011 at 12:28 AM, boris.vasil...@forces.gc.ca wrote: Good afternoon, I am trying to create a plot where the bottom and top axes have the same scale but different tick marks. I tried user-defined xscale.component function but it does not produce desired results. Can anybody suggest where my use of xscale.component function is incorrect? For example, the code below tries to create a plot where horizontal axes limits are c(0,10), top axis has ticks at odd integers, and bottom axis has ticks at even integers. library(lattice) df - data.frame(x=1:10,y=1:10) xscale.components.A - function(...,user.value=NULL) { # get default axes definition list; print user.value ans - xscale.components.default(...) print(user.value) # start with the same definition of bottom and top axes ans$top - ans$bottom # - bottom labels ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) # - top labels ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) # return axes definition list return(ans) } oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10),at=0:10,alternating=3)), xscale.components=xscale.components.A, user.value=1) print(oltc) The code generates a figure with incorrectly placed bottom and top labels. Bottom labels B-0, B-2, ... are at 0, 1, ... and top labels T-1, T-3, ... are at 0, 1, ... When axis-function runs out of labels, it replaces labels with NA. It appears that lattice uses top$ticks$at to place labels and top$labels$labels for labels. Is there a way to override this behaviour (other than to expand the labels$labels vector to be as long as ticks$at vector and set necessary elements to )? Well, top|bottom$ticks$at is used to place the ticks, and $labels$at is used to place the labels. They should typically be the same, but you have changed one and not the other. Everything seems to work if you set $ticks$at to the same values as $labels$at: ## - bottom labels + ans$bottom$ticks$at - seq(0,10,by=2) ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) ## - top labels + ans$top$ticks$at - seq(1,9,by=2) ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) Also, can user-parameter be passed into xscale.components() function? (For example, locations and labels of ticks on the top axis). In the code above, print(user.value) returns NULL even though in the xyplot() call user.value is 1. No. Unrecognized arguments are passed to the panel function only, not to any other function. However, you can always define an inline function: oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10), at = 0:10, alternating=3)), xscale.components = function(...) xscale.components.A(..., user.value=1)) Hope that helps (and sorry for the late reply). -Deepayan Deepyan, Thank you very much for your reply. It makes things a bit clearer. It other words in the list prepared by xscale.components(), vectors top|bottom$ticks$at and top|bottom$labels$at must be the same. If only every second tick is to be labelled then every second label should be set explicitly to empty strings: ans$bottom$ticks$at - seq(0,10,by=1) ans$bottom$labels$at - seq(0,10,by=1) ans$bottom$labels$labels - paste(B,seq(0,10,by=1),sep=-) # replace B-1, B-3, ... with ans$bottom$labels$labels[seq(2,11,by=2)] - Sincerely, Boris. __ R-help@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.
[R] lattice xscale.components: different ticks on top/bottom axis
Good afternoon, I am trying to create a plot where the bottom and top axes have the same scale but different tick marks. I tried user-defined xscale.component function but it does not produce desired results. Can anybody suggest where my use of xscale.component function is incorrect? For example, the code below tries to create a plot where horizontal axes limits are c(0,10), top axis has ticks at odd integers, and bottom axis has ticks at even integers. library(lattice) df - data.frame(x=1:10,y=1:10) xscale.components.A - function(...,user.value=NULL) { # get default axes definition list; print user.value ans - xscale.components.default(...) print(user.value) # start with the same definition of bottom and top axes ans$top - ans$bottom # - bottom labels ans$bottom$labels$at - seq(0,10,by=2) ans$bottom$labels$labels - paste(B,seq(0,10,by=2),sep=-) # - top labels ans$top$labels$at - seq(1,9,by=2) ans$top$labels$labels - paste(T,seq(1,9,by=2),sep=-) # return axes definition list return(ans) } oltc - xyplot(y~x,data=df, scales=list(x=list(limits=c(0,10),at=0:10,alternating=3)), xscale.components=xscale.components.A, user.value=1) print(oltc) The code generates a figure with incorrectly placed bottom and top labels. Bottom labels B-0, B-2, ... are at 0, 1, ... and top labels T-1, T-3, ... are at 0, 1, ... When axis-function runs out of labels, it replaces labels with NA. It appears that lattice uses top$ticks$at to place labels and top$labels$labels for labels. Is there a way to override this behaviour (other than to expand the labels$labels vector to be as long as ticks$at vector and set necessary elements to )? Also, can user-parameter be passed into xscale.components() function? (For example, locations and labels of ticks on the top axis). In the code above, print(user.value) returns NULL even though in the xyplot() call user.value is 1. Sincerely, Boris Vasiliev. __ R-help@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.