|
I would really like some help with understanding the panel function, in
zoo. Thank you. R 15.1 and zoo 1.7-7. library(zoo) x = seq(0,3*pi,length.out=100) y = sin(x) zobj = zoo(y, x) ########################################################### ## EXAMPLE 1 - GLOBAL ARGUMENT ## This panel function works ## But, it relies on mycol, which is a global variable ########################################################### palette(rainbow(100)) mypanel_v1 = function(x, y, ...){ lines(x, y, lty=2, col='grey') points(x, y, col=mycol, pch=16) } mycol = round((y - min(y)) / (max(y) - min(y)) * 99) + 1 plot(zobj, panel=mypanel_v1) ########################################################### ## EXAMPLE 2 - PASSING IN MY_COLOR AS PARAM (WITH WARNING) ## How would I make the color argument modular? ## This works, but throws errors ## What is the best way to to this? ########################################################### palette(rainbow(100)) mypanel_v2 = function(x, y, MY_COLOR, ...){ lines(x, y, lty=2, col='grey') points(x, y, col=MY_COLOR, pch=16) ## By the way I also tried a variety of strategies ## like this: # points(..., col=MY_COLOR, pch=16) ## but I get got warnings about passing in pch and col ## more than once, and "matching multiple arguments". ## The col value has the length of number of zoo ## objects rather than the number of points in each ## column.... } mycol = round((y - min(y)) / (max(y) - min(y)) * 50) + 1 plot(zobj, panel=mypanel_v2, MY_COLOR = mycol) Thank you, Gene Leynes _____________________________________________ *Data Scientist* *http://www.linkedin.com/in/geneleynes * <http://goog_598053156>*http://geneorama.com/ <http://geneorama.com/%20>* [[alternative HTML version deleted]] ______________________________________________ [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. |
|
On Sun, 29 Jul 2012, Gene Leynes wrote:
> I would really like some help with understanding the panel function, in > zoo. Thank you. Have you looked at ?plot.zoo. Some of the features you ask about are explained there. In particular, it is explained that arguments like col, lty, etc. are expanded to the number of series. See also the "Plotting" section of vignette("zoo", package = "zoo"). In your case you want the color selection based on the response anyway, so you could do something like mycol <- function(i) hcl( h = ifelse(i > 0, 260, 0), c = 80 * abs(i)^1.5, l = 90 - 60 * abs(i)^1.5 ) mypanel <- function(x, y, ...) { lines(x, y, col = "gray") points(x, y, col = mycol(y / max(abs(y))), pch = 19) } plot(zobj, panel = mypanel) In case of a univariate series, you could also do plot(time(zobj), coredata(zobj), ...) and then use the usual base plot arguments. (The above uses a diverging color scheme for selecting a color based on the value of the response. The underlying ideas are explained in Zeileis, Hornik, Murrell (2009). Escaping RGBland: Selecting Colors for Statistical Graphics. Computational Statistics & Data Analysis, 53, 3259-3270. doi:10.1016/j.csda.2008.11.033) hth, Z > R 15.1 and zoo 1.7-7. > > > library(zoo) > x = seq(0,3*pi,length.out=100) > y = sin(x) > zobj = zoo(y, x) > > ########################################################### > ## EXAMPLE 1 - GLOBAL ARGUMENT > ## This panel function works > ## But, it relies on mycol, which is a global variable > ########################################################### > palette(rainbow(100)) > mypanel_v1 = function(x, y, ...){ > lines(x, y, lty=2, col='grey') > points(x, y, col=mycol, pch=16) > } > mycol = round((y - min(y)) / (max(y) - min(y)) * 99) + 1 > plot(zobj, panel=mypanel_v1) > > > ########################################################### > ## EXAMPLE 2 - PASSING IN MY_COLOR AS PARAM (WITH WARNING) > ## How would I make the color argument modular? > ## This works, but throws errors > ## What is the best way to to this? > ########################################################### > palette(rainbow(100)) > mypanel_v2 = function(x, y, MY_COLOR, ...){ > lines(x, y, lty=2, col='grey') > points(x, y, col=MY_COLOR, pch=16) > > ## By the way I also tried a variety of strategies > ## like this: > # points(..., col=MY_COLOR, pch=16) > ## but I get got warnings about passing in pch and col > ## more than once, and "matching multiple arguments". > > ## The col value has the length of number of zoo > ## objects rather than the number of points in each > ## column.... > } > mycol = round((y - min(y)) / (max(y) - min(y)) * 50) + 1 > plot(zobj, panel=mypanel_v2, MY_COLOR = mycol) > > > > Thank you, > Gene Leynes > _____________________________________________ > *Data Scientist* > *http://www.linkedin.com/in/geneleynes > * > <http://goog_598053156>*http://geneorama.com/ <http://geneorama.com/%20>* > > [[alternative HTML version deleted]] > > ______________________________________________ > [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. |
|
Achim,
Thank you for your response, and for your work on the zoo package in general. Also, that implementation of the color scheme looks great. Frankly, I can't remember exactly what I was originally trying to accomplish for this particular problem, but I think that your suggestion of reviewing the plotting section of the zoo vignette would solve the problem. Calculating the colors ahead of time and passing them in as a list is great solution that I didn't know was possible. I still have some lingering questions about the panel function, which has been one of those things in R that I would like to understand better. Using your example, I would like to be able to pass in an additional variable to make each set of hues like this: mycol <- function(i, v) hcl( h = ifelse(i > 0, v, 0), c = 80 * abs(i)^1.5, l = 90 - 60 * abs(i)^1.5) mypanel <- function(x, y, v, ...) { lines(x, y, col = "gray") points(x, y, col = mycol(y / max(abs(y)), v), pch = 19) } plot(zobj, panel = mypanel, v=0) plot(zobj, panel = mypanel, v=50) plot(zobj, panel = mypanel, v=100) plot(zobj, panel = mypanel, v=150) This runs, but generates warnings. I was trying to find the right way to pass additional arguments to panel. I was trying things like this: plot(zobj, panel = mypanel(x, y, v=150)) plot(zobj, panel = mypanel(..., v=150)) I was surprised at how many ways I could call panel, but how unpredictable (to me) the results were! Things that I didn't think would work were ok, and other things that seemed correct would threw errors. If you have some insight I would like to hear it, but this isn't that important because there are obviously other approaches for making the same / similar output. Thank you, Gene Leynes _____________________________________________ *Data Scientist* *http://www.linkedin.com/in/geneleynes * <http://goog_598053156>*http://geneorama.com/ <http://geneorama.com/%20>* On Tue, Jul 31, 2012 at 3:24 AM, Achim Zeileis <[hidden email]>wrote: > On Sun, 29 Jul 2012, Gene Leynes wrote: > > I would really like some help with understanding the panel function, in >> zoo. Thank you. >> > > Have you looked at ?plot.zoo. Some of the features you ask about are > explained there. In particular, it is explained that arguments like col, > lty, etc. are expanded to the number of series. See also the "Plotting" > section of vignette("zoo", package = "zoo"). > > In your case you want the color selection based on the response anyway, so > you could do something like > > mycol <- function(i) hcl( > h = ifelse(i > 0, 260, 0), > c = 80 * abs(i)^1.5, > l = 90 - 60 * abs(i)^1.5 > ) > mypanel <- function(x, y, ...) { > lines(x, y, col = "gray") > points(x, y, col = mycol(y / max(abs(y))), pch = 19) > } > plot(zobj, panel = mypanel) > > In case of a univariate series, you could also do plot(time(zobj), > coredata(zobj), ...) and then use the usual base plot arguments. > > (The above uses a diverging color scheme for selecting a color based on > the value of the response. The underlying ideas are explained in Zeileis, > Hornik, Murrell (2009). Escaping RGBland: Selecting Colors for Statistical > Graphics. Computational Statistics & Data Analysis, 53, 3259-3270. > doi:10.1016/j.csda.2008.11.**033) > > hth, > Z > > R 15.1 and zoo 1.7-7. >> >> >> library(zoo) >> x = seq(0,3*pi,length.out=100) >> y = sin(x) >> zobj = zoo(y, x) >> >> ##############################**############################# >> ## EXAMPLE 1 - GLOBAL ARGUMENT >> ## This panel function works >> ## But, it relies on mycol, which is a global variable >> ##############################**############################# >> palette(rainbow(100)) >> mypanel_v1 = function(x, y, ...){ >> lines(x, y, lty=2, col='grey') >> points(x, y, col=mycol, pch=16) >> } >> mycol = round((y - min(y)) / (max(y) - min(y)) * 99) + 1 >> plot(zobj, panel=mypanel_v1) >> >> >> ##############################**############################# >> ## EXAMPLE 2 - PASSING IN MY_COLOR AS PARAM (WITH WARNING) >> ## How would I make the color argument modular? >> ## This works, but throws errors >> ## What is the best way to to this? >> ##############################**############################# >> palette(rainbow(100)) >> mypanel_v2 = function(x, y, MY_COLOR, ...){ >> lines(x, y, lty=2, col='grey') >> points(x, y, col=MY_COLOR, pch=16) >> >> ## By the way I also tried a variety of strategies >> ## like this: >> # points(..., col=MY_COLOR, pch=16) >> ## but I get got warnings about passing in pch and col >> ## more than once, and "matching multiple arguments". >> >> ## The col value has the length of number of zoo >> ## objects rather than the number of points in each >> ## column.... >> } >> mycol = round((y - min(y)) / (max(y) - min(y)) * 50) + 1 >> plot(zobj, panel=mypanel_v2, MY_COLOR = mycol) >> >> >> >> Thank you, >> Gene Leynes >> ______________________________**_______________ >> *Data Scientist* >> *http://www.linkedin.com/in/**geneleynes<http://www.linkedin.com/in/geneleynes> >> * >> <http://goog_598053156>*http:/**/geneorama.com/ <http://geneorama.com/> < >> http://geneorama.com/%20>* >> >> [[alternative HTML version deleted]] >> >> ______________________________**________________ >> [hidden email] mailing list >> https://stat.ethz.ch/mailman/**listinfo/r-help<https://stat.ethz.ch/mailman/listinfo/r-help> >> PLEASE do read the posting guide http://www.R-project.org/** >> posting-guide.html <http://www.R-project.org/posting-guide.html> >> and provide commented, minimal, self-contained, reproducible code. >> >> [[alternative HTML version deleted]] ______________________________________________ [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. |
|
On Wed, Aug 1, 2012 at 12:40 AM, Gene Leynes <[hidden email]> wrote:
> Achim, > > Thank you for your response, and for your work on the zoo package in > general. Also, that implementation of the color scheme looks great. > > Frankly, I can't remember exactly what I was originally trying to > accomplish for this particular problem, but I think that your suggestion of > reviewing the plotting section of the zoo vignette would solve the problem. > Calculating the colors ahead of time and passing them in as a list is > great solution that I didn't know was possible. > > I still have some lingering questions about the panel function, which has > been one of those things in R that I would like to understand better. > > Using your example, I would like to be able to pass in an additional > variable to make each set of hues like this: > > mycol <- function(i, v) hcl( > h = ifelse(i > 0, v, 0), > c = 80 * abs(i)^1.5, > l = 90 - 60 * abs(i)^1.5) > > mypanel <- function(x, y, v, ...) { > lines(x, y, col = "gray") > points(x, y, col = mycol(y / max(abs(y)), v), pch = 19) > } > plot(zobj, panel = mypanel, v=0) > plot(zobj, panel = mypanel, v=50) > plot(zobj, panel = mypanel, v=100) > plot(zobj, panel = mypanel, v=150) > > > This runs, but generates warnings. I was trying to find the right way to > pass additional arguments to panel. > > I was trying things like this: > plot(zobj, panel = mypanel(x, y, v=150)) > plot(zobj, panel = mypanel(..., v=150)) > > > I was surprised at how many ways I could call panel, but how unpredictable > (to me) the results were! Things that I didn't think would work were ok, > and other things that seemed correct would threw errors. > > If you have some insight I would like to hear it, but this isn't that > important because there are obviously other approaches for making the same > / similar output. > As documented in ?plot.zoo the ... argument consists of graphical parameters so its not just passed to the panel function -- you can expect warnings if, as here, the parameters are not graphical (as they are passed to other functions and not just the panel function). What you can do is to create a panel constructor that uses lexical scoping to encapsulate the additional parameters: make.mypanel <- function(v) function(...) mypanel(..., v) plot(zobj, panel = make.mypanel(v=0) ) Here make.mypanel constructs a mypanel function with the v argument filled in so you don't have to separately pass it via ... . -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.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. |
|
On Wed, Aug 1, 2012 at 7:31 AM, Gabor Grothendieck
<[hidden email]> wrote: > On Wed, Aug 1, 2012 at 12:40 AM, Gene Leynes <[hidden email]> wrote: >> Achim, >> >> Thank you for your response, and for your work on the zoo package in >> general. Also, that implementation of the color scheme looks great. >> >> Frankly, I can't remember exactly what I was originally trying to >> accomplish for this particular problem, but I think that your suggestion of >> reviewing the plotting section of the zoo vignette would solve the problem. >> Calculating the colors ahead of time and passing them in as a list is >> great solution that I didn't know was possible. >> >> I still have some lingering questions about the panel function, which has >> been one of those things in R that I would like to understand better. >> >> Using your example, I would like to be able to pass in an additional >> variable to make each set of hues like this: >> >> mycol <- function(i, v) hcl( >> h = ifelse(i > 0, v, 0), >> c = 80 * abs(i)^1.5, >> l = 90 - 60 * abs(i)^1.5) >> >> mypanel <- function(x, y, v, ...) { >> lines(x, y, col = "gray") >> points(x, y, col = mycol(y / max(abs(y)), v), pch = 19) >> } >> plot(zobj, panel = mypanel, v=0) >> plot(zobj, panel = mypanel, v=50) >> plot(zobj, panel = mypanel, v=100) >> plot(zobj, panel = mypanel, v=150) >> >> >> This runs, but generates warnings. I was trying to find the right way to >> pass additional arguments to panel. >> >> I was trying things like this: >> plot(zobj, panel = mypanel(x, y, v=150)) >> plot(zobj, panel = mypanel(..., v=150)) >> >> >> I was surprised at how many ways I could call panel, but how unpredictable >> (to me) the results were! Things that I didn't think would work were ok, >> and other things that seemed correct would threw errors. >> >> If you have some insight I would like to hear it, but this isn't that >> important because there are obviously other approaches for making the same >> / similar output. >> > > As documented in ?plot.zoo the ... argument consists of graphical > parameters so its not just passed to the panel function -- you can > expect warnings if, as here, the parameters are not graphical (as they > are passed to other functions and not just the panel function). > > What you can do is to create a panel constructor that uses lexical > scoping to encapsulate the additional parameters: > > make.mypanel <- function(v) function(...) mypanel(..., v) > plot(zobj, panel = make.mypanel(v=0) ) > > Here make.mypanel constructs a mypanel function with the v argument > filled in so you don't have to separately pass it via ... . One further idea that will save you from defining a constructor function is to use Curry from the functional package like this: library(functional) plot(zobj, panel = Curry(mypanel, v=0) ) Here Curry returns mypanel but with v filled in already. -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.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. |
| Powered by Nabble | Edit this page |
