[R] how to place a rug on only the x-axis in a scatterplot with lattice

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Tue Nov 5 23:41:38 CET 2019


For the record, I left out a key word in my prior "explanation", which I
have corrected below. I also needed to clarify something, as my original
wording is confusing. Sorry about that.

Bert


On Tue, Nov 5, 2019 at 11:09 AM Bert Gunter <bgunter.4567 using gmail.com> wrote:

> Lattice functions pass down their **unrecognized** arguments to the panel
> function. Once you know this, argument handling is controlled by R's usual
> rules, especially with regard to the "..." argument. Hence, you may wish to
> review tutorials on argument passing in function calls in R.
>
> But briefly, the following may be informative:
>
> xyplot(y ~ foo,
>    panel = function(...){## x and y in ... arguments
>      panel.xyplot(...)
>      panel.rug(..., col = "black")
> })
>
> will pass down all the **unrecognized** arguments in the xyplot call
> (there are none here) **plus** the x and y arguments obtained from the
> formula method. Thus panel.rug(...) will get *both* x =  and y = arguments
> and will accordingly put rugs on BOTH axes, as you saw.
>
> To prevent this, you only want to pass down the x argument, not y. Here
> are several ways to do this (check them!):
>
> ## pass down x in ... but pass y explicitly and set it to NULL in
> panel.rug call
> xyplot(y ~ foo,
>        panel = function(y,...) { ## x is in ... arguments
>           panel.xyplot(y,..., col = "red")
>           panel.rug(y = NULL,..., col="black")
>        })
>
> ## explicitly omit y from the panel.rug call (same as above):
> xyplot(y ~ foo,
>        panel = function(y,...) { ## x is in ... arguments
>           panel.xyplot(y,..., col = "red")
>           panel.rug(..., col="black")## y omitted
>        })
>
> ## only pass down x explicitly and omit y
> xyplot(y ~ foo,
>        panel = function(x,...) {  ## y is in ... arguments
>           panel.xyplot(x,..., col = "red")
>           panel.rug(x, col="black") ## only x argument is passed
>        })
>
> Cheers,
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming along and
> sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
>
> On Tue, Nov 5, 2019 at 10:04 AM Christopher W Ryan <cryan using binghamton.edu>
> wrote:
>
>> Thanks Bert. So my lesson here is that I have to "feed" "x" to all my
>> panel functions "upstream" from my panel.rug()?
>>
>> --Chris Ryan
>>
>> On Tue, Nov 5, 2019 at 12:28 PM Bert Gunter <bgunter.4567 using gmail.com>
>> wrote:
>>
>>> Here's how you pass an argument down to the panel function.
>>>
>>> foo <- runif(30,0,5)
>>> y <- rnorm(30, mean = 10)
>>> xyplot(y~foo,
>>>        panel = function(x,...) {
>>>           panel.xyplot(x,..., col = "red")
>>>           panel.rug(x, col="black")
>>>        })
>>>
>>> Cheers,
>>> Bert
>>>
>>>
>>> Bert Gunter
>>>
>>> "The trouble with having an open mind is that people keep coming along
>>> and sticking things into it."
>>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>>>
>>>
>>> On Tue, Nov 5, 2019 at 8:41 AM Christopher W Ryan <cryan using binghamton.edu>
>>> wrote:
>>>
>>>> The following produces a scatterplot with rugs on both the vertical and
>>>> horizontal axes.
>>>>
>>>> library(dplyr)
>>>> library(stringr)
>>>> library(lattice)
>>>> library(latticeExtra)
>>>> ## .....
>>>> xyplot(scheduleInterval ~ calledForApptDate, data = dd.2, xlab = "Date
>>>> patient called for appointment", ylab = "Days in the future that patient
>>>> was scheduled",
>>>> panel = function(...) {
>>>> panel.xyplot(..., col = "red")
>>>> panel.smoother(..., span = 0.9, se = FALSE)
>>>> panel.rug(...)
>>>> })
>>>>
>>>> I'd like a rug to appear only on the horizontal axis.  None of the
>>>> following seem to be the correct syntax:
>>>>
>>>> panel.rug(..., y = NULL)
>>>> panel.rug(..., y = FALSE)
>>>> panel.rug(x)
>>>> panel.rug(x = ...)
>>>>
>>>> This does the job:
>>>>
>>>> xyplot(scheduleInterval ~ calledForApptDate, data = dd.2, xlab = "Date
>>>> patient called for appointment", ylab = "Days in the future that patient
>>>> was scheduled",
>>>> panel = function(...) {
>>>> panel.xyplot(..., col = "red")
>>>> panel.smoother(..., span = 0.9, se = FALSE)
>>>> panel.rug(x = dd.2$calledForApptDate)
>>>> })
>>>>
>>>> but seems inadvisable. Shouldn't I be making use of ... for passing
>>>> arguments through to the panel.rug() function?  Specifying a variable
>>>> in a
>>>> dataframe by name isn't generalizable.
>>>>
>>>> Thanks.
>>>>
>>>> --Chris Ryan
>>>>
>>>>         [[alternative HTML version deleted]]
>>>>
>>>> ______________________________________________
>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>> 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.
>>>>
>>>

	[[alternative HTML version deleted]]



More information about the R-help mailing list