[R] graphical behavior of a table of numbers
Richard M. Heiberger
rmh at temple.edu
Mon Jan 30 16:19:53 CET 2017
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
<maechler at stat.math.ethz.ch> wrote:
>>>>>> Duncan Murdoch <murdoch.duncan at gmail.com>
>>>>>> 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 <bgunter.4567 at gmail.com> 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 <rmh at temple.edu> 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
> >>>>
>
> ______________________________________________
> R-help at 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.
More information about the R-help
mailing list