Viktor, what you said below was all correct for the specific situation you looked at, to get more of a general overview, look at some of the vignettes in the grid package vignette(package = "grid") particularly "grid" and "viewport" and then maybe at vignette(package = "vcd") which explains some of the ideas implemented in vcd.
Best wishes, Z On Wed, 17 May 2006 01:56:02 +0100 Viktor Tron wrote: > 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 > <[EMAIL PROTECTED]> 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 > >> <[EMAIL PROTECTED]> 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 > ______________________________________________ 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