Re: [R] adding line to spinogram/histogram/etc solved

From: Viktor Tron <v.tron_at_ed.ac.uk>
Date: Wed 17 May 2006 - 10:56:02 EST

Thanks loads, extremely useful.

So just for the record again.
You have to get into the viewport that contains the actual graphplot with the axes.
So, how you do it:

  1. viewports have names. In case of histograms the relevant viewport is something like "plotA.panel.X.Y.vp" where A is the plot index and X, Y are the x, y indexes of the panel (as usual, starting from bottom left) but you can try out the other names shown by the current.vpTree() command in case in trouble. In case of spinograms you have to use the pop=FALSE option for the graph viewport inside the root to be retained. Then it is just called "spinelot".
  2. Once you figured out the name of the viewport you want to add plot to, issue seekViewport("spineplot") to get the "focus" on the viewport and then you can use the grid primitives the same way as you use lines, segments on normal plots.
  3. If you want to use the scale of the axes (natrually what you want) you have to tell grid to use the NATIVE scale of the viewport (default.units="native").

So something like this will do:

grid.segments(,100,,100,gp=gpar(col="red"),default.units="native")

to add a "100 items cut-off line" across a "count" type histogram. (Note the left out parameters which resolve to start/end as x1 and x2)

Brilliant, cheers Achim.
V

On Tue, 16 May 2006 19:09:14 +0100, Achim Zeileis <Achim.Zeileis@wu-wien.ac.at> wrote:

> On Tue, 16 May 2006 17:42:22 +0100 Viktor Tron wrote:
>
>> Hello,
>> Thanks for the hint.
>> grid.segments seemed the closest I got.
>> I did manage to draw (well fake) a line with it. I can only address
>> the whole drawing frame, which means I can only adjust the position
>> and length of the line
>> by trial and error. I see no way to address the y axis scale of my
>> spinogram/histogram.
>> Is there a way?
>
> Yes, that's the wonderful thing about grid!
>
> Consider this example with data from vcd
> spine(Fail ~ Temperature, data = SpaceShuttle)
> Then you can look at the viewport tree in which you can navigate:
> current.vpTree()
> which leaves you here only with the ROOT node, hence you had troubles
> adjusting your lines. But looking at ?spine reveals that
> spine(Fail ~ Temperature, data = SpaceShuttle, pop = FALSE)
> does *not* pop away the viewport tree which is here relatively simple
> current.vpTree()
> just shows "viewport[ROOT]->(viewport[spineplot])".
>
> So you can hop into the main picture
> seekViewport("spineplot")
> (which you can also name differently) and do more or less sensible
> things, e.g.
> grid.rect(gp = gpar(col = 2))
> adds a red box around the plot or
> grid.lines(c(0, 1), c(0.3, 0.7), gp = gpar(col = 4))
> adds a blue line. Note that both x- and y-axis are on a probability
> scale, i.e., it plots P(Temperature <= x) vs. P(Fail = "no").
>
> To see a more elaborated example how these graphics can be re-used,
> look at example(mob) in library("party").
>
> Best,
> Z
>
>> Not a huge problem, but I thought someone must have thought of
>> adding lines to their spinograms or histograms before...
>> V
>>
>>
>> On Mon, 15 May 2006 14:13:00 +0100, Prof Brian Ripley
>> <ripley@stats.ox.ac.uk> wrote:
>>
>> > Package vcd is built on grid, not base graphics.
>> >
>> > On Mon, 15 May 2006, Viktor Tron wrote:
>> >
>> >> Dear all,
>> >> I wonder what's special about spinograms {vcd} that prevents me
>> >> from using
>> >> it the way I do with other plots.
>> >>
>> >> I do:
>> >>
>> >>> spine(f.speaker.identity ~ x.log.lengthening,
>> >>> data=ms,breaks=45,gp=gpar(fill=c("red","green")),xlab="length
>> >>> difference
>> >>> (log ms)",ylab="speaker")
>> >>> curve(0*x,add=T)
>> >> Error in plot.xy(xy.coords(x, y), type = type, col = col, lty =
>> >> lty, ...) :
>> >> plot.new has not been called yet
>> >>
>> >>
>> >> OK, if I do
>> >>> curve(0*x,add=)
>> >>> spine(f.speaker.identity ~ x.log.lengthening,
>> >>> data=ms,breaks=45,gp=gpar(fill=c("red","green")),xlab="length
>> >>> difference
>> >>> (log ms)",ylab="speaker")
>> >>> curve(0*x,add=T)
>> >>
>> >> then the plot is what I want, but note that I had to use y=0 to
>> >> get the line put at 0.5!!!! so it is already suspicious.
>> >> But then:
>> >>
>> >>> dev.print(pdf,"mde_speakerration_by_lengthening.pdf")
>> >> Error in dev.copy(device = function (file = ifelse(onefile,
>> >> "Rplots.pdf",
>> >> :
>> >> invalid graphics state
>> >>
>> >> Can anyone suggest a remedy?
>> >
>> > Use grid primitives to add to the plot.
>> >
>>
>> ______________________________________________
>> R-help@stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide!
>> http://www.R-project.org/posting-guide.html



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Wed May 17 11:06:34 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 17 May 2006 - 22:10:12 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.