graphical behavior of a table of numbers

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

graphical behavior of a table of numbers

Richard M. Heiberger
## This example is from R-intro.pdf page 21 (R-3.3.2)

d <- outer(0:9, 0:9)
fr <- table(outer(d, d, "-"))
plot(as.numeric(names(fr)), fr, type="h",
            xlab="Determinant", ylab="Frequency")
## The y-axis tick marks are at c(-21,24,65).
## This seems to be because class(fr) == "table"

## Switching the class to array gives the more appropriate
## y-axis ticks at seq(0,500,100) .

fr.array <- fr
class(fr.array) <- "array"
plot(as.numeric(names(fr)), fr.array, type="h",
            xlab="Determinant", ylab="Frequency")


## I have a question and a recommendation.
## Question:
## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
##
## Recommendation:
## Changed the example on page 21 to show the ticks at seq(0,500,100)?

## Rich

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

Re: graphical behavior of a table of numbers

Bert Gunter-2
Rich:

Simpler: Just lose the "table" class.

plot(as.numeric(names(fr)), as.vector(fr),  type="h",
            xlab="Determinant", ylab="Frequency")


However, I'm no less puzzled by the "strange" behavior than you.

In addition, it's probably worth noting that xyplot in lattice (and no
doubt ggplot,too) does not have this problem (as I'm sure you know):

xyplot(fr ~ as.numeric(names(fr)),  type="h",
            xlab="Determinant", ylab="Frequency")


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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:

> ## This example is from R-intro.pdf page 21 (R-3.3.2)
>
> d <- outer(0:9, 0:9)
> fr <- table(outer(d, d, "-"))
> plot(as.numeric(names(fr)), fr, type="h",
>             xlab="Determinant", ylab="Frequency")
> ## The y-axis tick marks are at c(-21,24,65).
> ## This seems to be because class(fr) == "table"
>
> ## Switching the class to array gives the more appropriate
> ## y-axis ticks at seq(0,500,100) .
>
> fr.array <- fr
> class(fr.array) <- "array"
> plot(as.numeric(names(fr)), fr.array, type="h",
>             xlab="Determinant", ylab="Frequency")
>
>
> ## I have a question and a recommendation.
> ## Question:
> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
> ##
> ## Recommendation:
> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
>
> ## Rich
>
> ______________________________________________
> [hidden email] 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.

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

Re: graphical behavior of a table of numbers

Jim Lemon-4
Hi Richard,
I think there may be something amiss in the plot.table function. As
you note, changing the class of fr to array produces a more sensible
plot, as does Bert's "as.vector". Yet inside plot.table we find:

plot(x0, unclass(x), ...

and that should produce an array:

class(unclass(fr))
[1] "array"

The plot.table function looks like it should produce the plot you
want, but it doesn't. I think (therefore I am probably wrong) that a
1D table is handled in the same way as  multiD table rather than being
squeezed into a vector.

Jim


On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:

> Rich:
>
> Simpler: Just lose the "table" class.
>
> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
>             xlab="Determinant", ylab="Frequency")
>
>
> However, I'm no less puzzled by the "strange" behavior than you.
>
> In addition, it's probably worth noting that xyplot in lattice (and no
> doubt ggplot,too) does not have this problem (as I'm sure you know):
>
> xyplot(fr ~ as.numeric(names(fr)),  type="h",
>             xlab="Determinant", ylab="Frequency")
>
>
> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
>>
>> d <- outer(0:9, 0:9)
>> fr <- table(outer(d, d, "-"))
>> plot(as.numeric(names(fr)), fr, type="h",
>>             xlab="Determinant", ylab="Frequency")
>> ## The y-axis tick marks are at c(-21,24,65).
>> ## This seems to be because class(fr) == "table"
>>
>> ## Switching the class to array gives the more appropriate
>> ## y-axis ticks at seq(0,500,100) .
>>
>> fr.array <- fr
>> class(fr.array) <- "array"
>> plot(as.numeric(names(fr)), fr.array, type="h",
>>             xlab="Determinant", ylab="Frequency")
>>
>>
>> ## I have a question and a recommendation.
>> ## Question:
>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
>> ##
>> ## Recommendation:
>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
>>
>> ## Rich
>>
>> ______________________________________________
>> [hidden email] 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.
>
> ______________________________________________
> [hidden email] 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.

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

Re: graphical behavior of a table of numbers

Duncan Murdoch-2
On 29/01/2017 12:05 AM, Jim Lemon wrote:

> Hi Richard,
> I think there may be something amiss in the plot.table function. As
> you note, changing the class of fr to array produces a more sensible
> plot, as does Bert's "as.vector". Yet inside plot.table we find:
>
> plot(x0, unclass(x), ...
>
> and that should produce an array:
>
> class(unclass(fr))
> [1] "array"
>
> The plot.table function looks like it should produce the plot you
> want, but it doesn't. I think (therefore I am probably wrong) that a
> 1D table is handled in the same way as  multiD table rather than being
> squeezed into a vector.

I think the issue is that Axis() is called without removing the class.
Axis.table sets ticks based on the names of the table.

Duncan Murdoch

>
> Jim
>
>
> On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:
>> Rich:
>>
>> Simpler: Just lose the "table" class.
>>
>> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
>>             xlab="Determinant", ylab="Frequency")
>>
>>
>> However, I'm no less puzzled by the "strange" behavior than you.
>>
>> In addition, it's probably worth noting that xyplot in lattice (and no
>> doubt ggplot,too) does not have this problem (as I'm sure you know):
>>
>> xyplot(fr ~ as.numeric(names(fr)),  type="h",
>>             xlab="Determinant", ylab="Frequency")
>>
>>
>> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
>>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
>>>
>>> d <- outer(0:9, 0:9)
>>> fr <- table(outer(d, d, "-"))
>>> plot(as.numeric(names(fr)), fr, type="h",
>>>             xlab="Determinant", ylab="Frequency")
>>> ## The y-axis tick marks are at c(-21,24,65).
>>> ## This seems to be because class(fr) == "table"
>>>
>>> ## Switching the class to array gives the more appropriate
>>> ## y-axis ticks at seq(0,500,100) .
>>>
>>> fr.array <- fr
>>> class(fr.array) <- "array"
>>> plot(as.numeric(names(fr)), fr.array, type="h",
>>>             xlab="Determinant", ylab="Frequency")
>>>
>>>
>>> ## I have a question and a recommendation.
>>> ## Question:
>>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
>>> ##
>>> ## Recommendation:
>>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
>>>
>>> ## Rich
>>>
>>> ______________________________________________
>>> [hidden email] 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.
>>
>> ______________________________________________
>> [hidden email] 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.
>
> ______________________________________________
> [hidden email] 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.
>

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

Re: graphical behavior of a table of numbers

Martin Maechler
>>>>> Duncan Murdoch <[hidden email]>
>>>>>     on Sun, 29 Jan 2017 06:32:27 -0500 writes:

    > On 29/01/2017 12:05 AM, Jim Lemon wrote:
    >> Hi Richard, I think there may be something amiss in the
    >> plot.table function. As you note, changing the class of
    >> fr to array produces a more sensible plot, as does Bert's
    >> "as.vector". Yet inside plot.table we find:
    >>
    >> plot(x0, unclass(x), ...
    >>
    >> and that should produce an array:
    >>
    >> class(unclass(fr)) [1] "array"
    >>
    >> The plot.table function looks like it should produce the
    >> plot you want, but it doesn't. I think (therefore I am
    >> probably wrong) that a 1D table is handled in the same
    >> way as multiD table rather than being squeezed into a
    >> vector.

    > I think the issue is that Axis() is called without
    > removing the class.  Axis.table sets ticks based on the
    > names of the table.

    > Duncan Murdoch

yes indeed!  So this answers Rich Heiberger's question.

The example stems from a time long before there was
a plot.table() method, and even longer before plot.default() had
started using  Axis() and its methods.

So a much nicer example for the R-intro -- committed a few
minutes ago -- is making use of the  plot.table() S3 method :

  d <- outer(0:9, 0:9)
  fr <- table(outer(d, d, "-"))
  plot(fr, type="h", xlab="Determinant", ylab="Frequency")

So this fulfills Rich's recommendation.

Martin


    >> On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:
    >>> Rich:
    >>>
    >>> Simpler: Just lose the "table" class.
    >>>
    >>> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
    >>>      xlab="Determinant", ylab="Frequency")
    >>>
    >>> However, I'm no less puzzled by the "strange" behavior than you.
    >>>
    >>> In addition, it's probably worth noting that xyplot in lattice (and no
    >>> doubt ggplot,too) does not have this problem (as I'm sure you know):
    >>>
    >>> xyplot(fr ~ as.numeric(names(fr)),  type="h",
    >>>        xlab="Determinant", ylab="Frequency")
    >>>
    >>>
    >>> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
    >>>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
    >>>>
    >>>> d <- outer(0:9, 0:9)
    >>>> fr <- table(outer(d, d, "-"))
    >>>> plot(as.numeric(names(fr)), fr, type="h",
    >>>>      xlab="Determinant", ylab="Frequency")
    >>>> ## The y-axis tick marks are at c(-21,24,65).
    >>>> ## This seems to be because class(fr) == "table"
    >>>>
    >>>> ## Switching the class to array gives the more appropriate
    >>>> ## y-axis ticks at seq(0,500,100) .
    >>>>
    >>>> fr.array <- fr
    >>>> class(fr.array) <- "array"
    >>>> plot(as.numeric(names(fr)), fr.array, type="h",
    >>>>      xlab="Determinant", ylab="Frequency")
    >>>>
    >>>>
    >>>> ## I have a question and a recommendation.
    >>>> ## Question:
    >>>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
    >>>> ##
    >>>> ## Recommendation:
    >>>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
    >>>>
    >>>> ## Rich
    >>>>

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

Re: graphical behavior of a table of numbers

Richard M. Heiberger
Duncan, thank you for locating the problem.
Martin, thank you for explaining the behavior and for the first pass
at fixing it.
With the fix, now the x-axis has ticks at all integers, and tick labels at
c(-81,-67,-53,-39,-25,-11,0,9,19,31,43,55,67,79)
This is with R-3.3.2, as I interpret your fix to be to only the
R-intro.pdf manual with no change
to the code of any of the functions.
More work has to be done to repair the example.

I recommend
plot(as.numeric(fr) ~ as.numeric(names(fr)), type="h",
xlab="Determinant", ylab="Frequency")

The slightly more obvious solution doesn't work
> plot(fr ~ as.numeric(names(fr)), type="h", xlab="Determinant", ylab="Frequency")
Error in plot.table(c(-81, -80, -79, -78, -77, -76, -75, -74, -73, -72,  :
  invalid table 'x'

## It is possible to change graphics:::Axis.table to
if (is.num) axis(side, ...)
## and that would make the x-axis for the determinant example
plot(fr, type="h", xlab="Determinant", ylab="Frequency")
## look sensible, but would
## be less appropriate for the following example.

## The current behavior of Axis.table makes sense in this example
tt <- as.table(array(c(10,20,30), dimnames=list(c(100, 120, 200))))
tt
plot(tt)

On Mon, Jan 30, 2017 at 5:38 AM, Martin Maechler
<[hidden email]> wrote:

>>>>>> Duncan Murdoch <[hidden email]>
>>>>>>     on Sun, 29 Jan 2017 06:32:27 -0500 writes:
>
>     > On 29/01/2017 12:05 AM, Jim Lemon wrote:
>     >> Hi Richard, I think there may be something amiss in the
>     >> plot.table function. As you note, changing the class of
>     >> fr to array produces a more sensible plot, as does Bert's
>     >> "as.vector". Yet inside plot.table we find:
>     >>
>     >> plot(x0, unclass(x), ...
>     >>
>     >> and that should produce an array:
>     >>
>     >> class(unclass(fr)) [1] "array"
>     >>
>     >> The plot.table function looks like it should produce the
>     >> plot you want, but it doesn't. I think (therefore I am
>     >> probably wrong) that a 1D table is handled in the same
>     >> way as multiD table rather than being squeezed into a
>     >> vector.
>
>     > I think the issue is that Axis() is called without
>     > removing the class.  Axis.table sets ticks based on the
>     > names of the table.
>
>     > Duncan Murdoch
>
> yes indeed!  So this answers Rich Heiberger's question.
>
> The example stems from a time long before there was
> a plot.table() method, and even longer before plot.default() had
> started using  Axis() and its methods.
>
> So a much nicer example for the R-intro -- committed a few
> minutes ago -- is making use of the  plot.table() S3 method :
>
>   d <- outer(0:9, 0:9)
>   fr <- table(outer(d, d, "-"))
>   plot(fr, type="h", xlab="Determinant", ylab="Frequency")
>
> So this fulfills Rich's recommendation.
>
> Martin
>
>
>     >> On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:
>     >>> Rich:
>     >>>
>     >>> Simpler: Just lose the "table" class.
>     >>>
>     >>> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
>     >>>      xlab="Determinant", ylab="Frequency")
>     >>>
>     >>> However, I'm no less puzzled by the "strange" behavior than you.
>     >>>
>     >>> In addition, it's probably worth noting that xyplot in lattice (and no
>     >>> doubt ggplot,too) does not have this problem (as I'm sure you know):
>     >>>
>     >>> xyplot(fr ~ as.numeric(names(fr)),  type="h",
>     >>>        xlab="Determinant", ylab="Frequency")
>     >>>
>     >>>
>     >>> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
>     >>>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
>     >>>>
>     >>>> d <- outer(0:9, 0:9)
>     >>>> fr <- table(outer(d, d, "-"))
>     >>>> plot(as.numeric(names(fr)), fr, type="h",
>     >>>>      xlab="Determinant", ylab="Frequency")
>     >>>> ## The y-axis tick marks are at c(-21,24,65).
>     >>>> ## This seems to be because class(fr) == "table"
>     >>>>
>     >>>> ## Switching the class to array gives the more appropriate
>     >>>> ## y-axis ticks at seq(0,500,100) .
>     >>>>
>     >>>> fr.array <- fr
>     >>>> class(fr.array) <- "array"
>     >>>> plot(as.numeric(names(fr)), fr.array, type="h",
>     >>>>      xlab="Determinant", ylab="Frequency")
>     >>>>
>     >>>>
>     >>>> ## I have a question and a recommendation.
>     >>>> ## Question:
>     >>>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
>     >>>> ##
>     >>>> ## Recommendation:
>     >>>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
>     >>>>
>     >>>> ## Rich
>     >>>>
>
> ______________________________________________
> [hidden email] 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.

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

Re: graphical behavior of a table of numbers

Martin Maechler
>>>>> Richard M Heiberger <[hidden email]>
>>>>>     on Mon, 30 Jan 2017 10:19:53 -0500 writes:

    > Duncan, thank you for locating the problem.
    > Martin, thank you for explaining the behavior and for the first pass
    > at fixing it.


    > With the fix, now the x-axis has ticks at all integers, and tick labels at
    > c(-81,-67,-53,-39,-25,-11,0,9,19,31,43,55,67,79)

Note that *which* tick labels are shown depends quite a bit
on your graphics window width, your font sizes etc !

    > This is with R-3.3.2, as I interpret your fix to be to only the
    > R-intro.pdf manual with no change
    > to the code of any of the functions.

That's correct.  If this is about improving any of
the base graphics functions,  there's the  R-devel mailing list
and the bugzilla repository for "wishes"... rather than the
R-help list.

    > More work has to be done to repair the example.

I strongly disagree:
The example (which does not even need a 'type = "h"', and no longer
uses it) now mentions that the plot.factor method is used.
... and I do like its graphics output, given the simplicity of
the plot() function call.

Code as the one below may be preferable in some cases, but not
there in the   "Introduction to R".


    > I recommend
    > plot(as.numeric(fr) ~ as.numeric(names(fr)), type="h",
    > xlab="Determinant", ylab="Frequency")

    > The slightly more obvious solution doesn't work
    >> plot(fr ~ as.numeric(names(fr)), type="h", xlab="Determinant", ylab="Frequency")
    > Error in plot.table(c(-81, -80, -79, -78, -77, -76, -75, -74, -73, -72,  :
    > invalid table 'x'

    > ## It is possible to change graphics:::Axis.table to
    > if (is.num) axis(side, ...)
    > ## and that would make the x-axis for the determinant example
    > plot(fr, type="h", xlab="Determinant", ylab="Frequency")
    > ## look sensible, but would
    > ## be less appropriate for the following example.

    > ## The current behavior of Axis.table makes sense in this example
    > tt <- as.table(array(c(10,20,30), dimnames=list(c(100, 120, 200))))
    > tt
    > plot(tt)

Indeed.  I doubt we would want to change Axis.table()
just because of examples like the determinant one....
(and then again: such considerations would be part of a new thread on R-devel...)

Martin Maechler


    > On Mon, Jan 30, 2017 at 5:38 AM, Martin Maechler
    > <[hidden email]> wrote:
    >>>>>>> Duncan Murdoch <[hidden email]>
    >>>>>>> on Sun, 29 Jan 2017 06:32:27 -0500 writes:
    >>
    >> > On 29/01/2017 12:05 AM, Jim Lemon wrote:
    >> >> Hi Richard, I think there may be something amiss in the
    >> >> plot.table function. As you note, changing the class of
    >> >> fr to array produces a more sensible plot, as does Bert's
    >> >> "as.vector". Yet inside plot.table we find:
    >> >>
    >> >> plot(x0, unclass(x), ...
    >> >>
    >> >> and that should produce an array:
    >> >>
    >> >> class(unclass(fr)) [1] "array"
    >> >>
    >> >> The plot.table function looks like it should produce the
    >> >> plot you want, but it doesn't. I think (therefore I am
    >> >> probably wrong) that a 1D table is handled in the same
    >> >> way as multiD table rather than being squeezed into a
    >> >> vector.
    >>
    >> > I think the issue is that Axis() is called without
    >> > removing the class.  Axis.table sets ticks based on the
    >> > names of the table.
    >>
    >> > Duncan Murdoch
    >>
    >> yes indeed!  So this answers Rich Heiberger's question.
    >>
    >> The example stems from a time long before there was
    >> a plot.table() method, and even longer before plot.default() had
    >> started using  Axis() and its methods.
    >>
    >> So a much nicer example for the R-intro -- committed a few
    >> minutes ago -- is making use of the  plot.table() S3 method :
    >>
    >> d <- outer(0:9, 0:9)
    >> fr <- table(outer(d, d, "-"))
    >> plot(fr, type="h", xlab="Determinant", ylab="Frequency")
    >>
    >> So this fulfills Rich's recommendation.
    >>
    >> Martin
    >>
    >>
    >> >> On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:
    >> >>> Rich:
    >> >>>
    >> >>> Simpler: Just lose the "table" class.
    >> >>>
    >> >>> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
    >> >>>      xlab="Determinant", ylab="Frequency")
    >> >>>
    >> >>> However, I'm no less puzzled by the "strange" behavior than you.
    >> >>>
    >> >>> In addition, it's probably worth noting that xyplot in lattice (and no
    >> >>> doubt ggplot,too) does not have this problem (as I'm sure you know):
    >> >>>
    >> >>> xyplot(fr ~ as.numeric(names(fr)),  type="h",
    >> >>>        xlab="Determinant", ylab="Frequency")
    >> >>>
    >> >>>
    >> >>> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
    >> >>>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
    >> >>>>
    >> >>>> d <- outer(0:9, 0:9)
    >> >>>> fr <- table(outer(d, d, "-"))
    >> >>>> plot(as.numeric(names(fr)), fr, type="h",
    >> >>>>      xlab="Determinant", ylab="Frequency")
    >> >>>> ## The y-axis tick marks are at c(-21,24,65).
    >> >>>> ## This seems to be because class(fr) == "table"
    >> >>>>
    >> >>>> ## Switching the class to array gives the more appropriate
    >> >>>> ## y-axis ticks at seq(0,500,100) .
    >> >>>>
    >> >>>> fr.array <- fr
    >> >>>> class(fr.array) <- "array"
    >> >>>> plot(as.numeric(names(fr)), fr.array, type="h",
    >> >>>>      xlab="Determinant", ylab="Frequency")
    >> >>>>
    >> >>>>
    >> >>>> ## I have a question and a recommendation.
    >> >>>> ## Question:
    >> >>>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
    >> >>>> ##
    >> >>>> ## Recommendation:
    >> >>>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
    >> >>>>
    >> >>>> ## Rich
    >> >>>>
    >>
    >> ______________________________________________
    >> [hidden email] 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.

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

Re: graphical behavior of a table of numbers

Richard M. Heiberger
I still think

plot(fr, xlab="Determinant", ylab="Frequency")

has a totally non-intuitive x-axis.

I recommend that the example in R-intro.pdf include an additional
sentence and option.


## In this example, where the x-axis is the entire set of integers -81:81,
## displaying them as an ordinary numeric axis might be preferable, in
which case use
   plot(fr, xlab="Determinant", ylab="Frequency", xaxt="n")
   axis(1)


While thinking on this, I looked at ?plot.table
The example
     plot(table(state.division))
doesn't display most of the labels, and I think it therefore not a good example.
I recommend revising it, perhaps to
    old.oma <- par(oma=c(6,1,0,1));
    plot(table(state.division), las=2, mgp=c(.5,2,0))
    par(old.oma)
I agree the code for the legible labels is difficult to read.

Rich

On Mon, Jan 30, 2017 at 10:59 AM, Martin Maechler
<[hidden email]> wrote:

>>>>>> Richard M Heiberger <[hidden email]>
>>>>>>     on Mon, 30 Jan 2017 10:19:53 -0500 writes:
>
>     > Duncan, thank you for locating the problem.
>     > Martin, thank you for explaining the behavior and for the first pass
>     > at fixing it.
>
>
>     > With the fix, now the x-axis has ticks at all integers, and tick labels at
>     > c(-81,-67,-53,-39,-25,-11,0,9,19,31,43,55,67,79)
>
> Note that *which* tick labels are shown depends quite a bit
> on your graphics window width, your font sizes etc !
>
>     > This is with R-3.3.2, as I interpret your fix to be to only the
>     > R-intro.pdf manual with no change
>     > to the code of any of the functions.
>
> That's correct.  If this is about improving any of
> the base graphics functions,  there's the  R-devel mailing list
> and the bugzilla repository for "wishes"... rather than the
> R-help list.
>
>     > More work has to be done to repair the example.
>
> I strongly disagree:
> The example (which does not even need a 'type = "h"', and no longer
> uses it) now mentions that the plot.factor method is used.
> ... and I do like its graphics output, given the simplicity of
> the plot() function call.
>
> Code as the one below may be preferable in some cases, but not
> there in the   "Introduction to R".
>
>
>     > I recommend
>     > plot(as.numeric(fr) ~ as.numeric(names(fr)), type="h",
>     > xlab="Determinant", ylab="Frequency")
>
>     > The slightly more obvious solution doesn't work
>     >> plot(fr ~ as.numeric(names(fr)), type="h", xlab="Determinant", ylab="Frequency")
>     > Error in plot.table(c(-81, -80, -79, -78, -77, -76, -75, -74, -73, -72,  :
>     > invalid table 'x'
>
>     > ## It is possible to change graphics:::Axis.table to
>     > if (is.num) axis(side, ...)
>     > ## and that would make the x-axis for the determinant example
>     > plot(fr, type="h", xlab="Determinant", ylab="Frequency")
>     > ## look sensible, but would
>     > ## be less appropriate for the following example.
>
>     > ## The current behavior of Axis.table makes sense in this example
>     > tt <- as.table(array(c(10,20,30), dimnames=list(c(100, 120, 200))))
>     > tt
>     > plot(tt)
>
> Indeed.  I doubt we would want to change Axis.table()
> just because of examples like the determinant one....
> (and then again: such considerations would be part of a new thread on R-devel...)
>
> Martin Maechler
>
>
>     > On Mon, Jan 30, 2017 at 5:38 AM, Martin Maechler
>     > <[hidden email]> wrote:
>     >>>>>>> Duncan Murdoch <[hidden email]>
>     >>>>>>> on Sun, 29 Jan 2017 06:32:27 -0500 writes:
>     >>
>     >> > On 29/01/2017 12:05 AM, Jim Lemon wrote:
>     >> >> Hi Richard, I think there may be something amiss in the
>     >> >> plot.table function. As you note, changing the class of
>     >> >> fr to array produces a more sensible plot, as does Bert's
>     >> >> "as.vector". Yet inside plot.table we find:
>     >> >>
>     >> >> plot(x0, unclass(x), ...
>     >> >>
>     >> >> and that should produce an array:
>     >> >>
>     >> >> class(unclass(fr)) [1] "array"
>     >> >>
>     >> >> The plot.table function looks like it should produce the
>     >> >> plot you want, but it doesn't. I think (therefore I am
>     >> >> probably wrong) that a 1D table is handled in the same
>     >> >> way as multiD table rather than being squeezed into a
>     >> >> vector.
>     >>
>     >> > I think the issue is that Axis() is called without
>     >> > removing the class.  Axis.table sets ticks based on the
>     >> > names of the table.
>     >>
>     >> > Duncan Murdoch
>     >>
>     >> yes indeed!  So this answers Rich Heiberger's question.
>     >>
>     >> The example stems from a time long before there was
>     >> a plot.table() method, and even longer before plot.default() had
>     >> started using  Axis() and its methods.
>     >>
>     >> So a much nicer example for the R-intro -- committed a few
>     >> minutes ago -- is making use of the  plot.table() S3 method :
>     >>
>     >> d <- outer(0:9, 0:9)
>     >> fr <- table(outer(d, d, "-"))
>     >> plot(fr, type="h", xlab="Determinant", ylab="Frequency")
>     >>
>     >> So this fulfills Rich's recommendation.
>     >>
>     >> Martin
>     >>
>     >>
>     >> >> On Sun, Jan 29, 2017 at 11:19 AM, Bert Gunter <[hidden email]> wrote:
>     >> >>> Rich:
>     >> >>>
>     >> >>> Simpler: Just lose the "table" class.
>     >> >>>
>     >> >>> plot(as.numeric(names(fr)), as.vector(fr),  type="h",
>     >> >>>      xlab="Determinant", ylab="Frequency")
>     >> >>>
>     >> >>> However, I'm no less puzzled by the "strange" behavior than you.
>     >> >>>
>     >> >>> In addition, it's probably worth noting that xyplot in lattice (and no
>     >> >>> doubt ggplot,too) does not have this problem (as I'm sure you know):
>     >> >>>
>     >> >>> xyplot(fr ~ as.numeric(names(fr)),  type="h",
>     >> >>>        xlab="Determinant", ylab="Frequency")
>     >> >>>
>     >> >>>
>     >> >>> 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 Sat, Jan 28, 2017 at 3:03 PM, Richard M. Heiberger <[hidden email]> wrote:
>     >> >>>> ## This example is from R-intro.pdf page 21 (R-3.3.2)
>     >> >>>>
>     >> >>>> d <- outer(0:9, 0:9)
>     >> >>>> fr <- table(outer(d, d, "-"))
>     >> >>>> plot(as.numeric(names(fr)), fr, type="h",
>     >> >>>>      xlab="Determinant", ylab="Frequency")
>     >> >>>> ## The y-axis tick marks are at c(-21,24,65).
>     >> >>>> ## This seems to be because class(fr) == "table"
>     >> >>>>
>     >> >>>> ## Switching the class to array gives the more appropriate
>     >> >>>> ## y-axis ticks at seq(0,500,100) .
>     >> >>>>
>     >> >>>> fr.array <- fr
>     >> >>>> class(fr.array) <- "array"
>     >> >>>> plot(as.numeric(names(fr)), fr.array, type="h",
>     >> >>>>      xlab="Determinant", ylab="Frequency")
>     >> >>>>
>     >> >>>>
>     >> >>>> ## I have a question and a recommendation.
>     >> >>>> ## Question:
>     >> >>>> ## Why are the y-axis ticks for the table defaulted to c(-21,24,65).
>     >> >>>> ##
>     >> >>>> ## Recommendation:
>     >> >>>> ## Changed the example on page 21 to show the ticks at seq(0,500,100)?
>     >> >>>>
>     >> >>>> ## Rich
>     >> >>>>
>     >>
>     >> ______________________________________________
>     >> [hidden email] 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.

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