Quantcast

Zoo panel function

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Zoo panel function

Gene Leynes-2
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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Zoo panel function

Achim Zeileis-4
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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Zoo panel function

Gene Leynes-2
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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Zoo panel function

Gabor Grothendieck
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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Zoo panel function

Gabor Grothendieck
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.
Loading...