RSVGTipsDevice {RSVGTipsDevice} | R Documentation |
This package contains a SVG (Scalable Vector Graphics) device that will write to
a file. The SVG shapes have optional tooltips and/or
hyperlinks. The resulting SVG files should conform the W3C Scalable
Vector Graphics (SVG) standard (with the possible exception of
toolTipMode=2
) and do display correctly in
the SVG viewer in Mozilla Firefox under Windows (XP) and Linux (Ubuntu).
This graphics device supplies the underlying functions that are called
by plot
, lines
, etc, and the following
functions that are called by the user to access the special
capabilities of the SVG device:
devSVGTips
Open an SVG device
setSVGShapeToolTip
Set a tool tip to be used
for the next graphics shape or text drawn
setSVGShapeURL
Set a URL to be used
in the hyperlink for the next graphics shape or text drawn
getSVGToolTipMode
Get the tool tip mode used by
the current graphics device
This driver is a modification by Tony Plate tplate@acm.org of the RSvgDevice driver written by T Jake Luciani jakeluciani@yahoo.com
Design and future possible features of the RSVGTips device.
library("RSVGTipsDevice") sessionInfo() devSVGTips("svgplot1.svg", toolTipMode=1, title="SVG example plot 1: shapes and points, tooltips are title + 1 line") plot(c(0,10),c(0,10), type="n", xlab="x", ylab="y", main="Example SVG plot with title + 1 line tips (mode=1)") setSVGShapeToolTip(title="A rectangle", desc="that is yellow") rect(1,1,4,6, col='yellow') setSVGShapeToolTip(title="1st circle with title only") points(5.5,7.5,cex=20,pch=19,col='red') setSVGShapeToolTip(title="A triangle", desc="big and green") polygon(c(3,6,8), c(3,6,3), col='green') # no tooltips on these points points(2:8, 8:2, cex=3, pch=19, col='black') # tooltips on each these points invisible(sapply(1:7, function(x) {setSVGShapeToolTip(title=paste("point", x)) points(x+1, 8-x, cex=3, pch=1, col='black')})) setSVGShapeToolTip(title="Text", desc="can have a tool tip too!") text(x=4, y=9, lab="Poke me!", col="blue") dev.off() devSVGTips("svgplot2.svg", toolTipMode=2, title="SVG example plot 2: shapes and points, tooltips are title + 2 lines") getSVGToolTipMode() setSVGShapeToolTip(title="First circle title only") plot(1:3, cex=10, main="Example SVG plot with title + 2 line tips (mode=2)") setSVGShapeToolTip(title="A rectangle", desc="with a 1 line tip") rect(1,1,2,2) setSVGShapeToolTip(title="second circle", desc1="first line of description", desc2="second line of description") points(1.5,2.5,cex=20,pch=19,col='red') dev.off() devSVGTips("svgplot3.svg", toolTipMode=2, title="SVG example plot 3: shapes, tooltips are title + 2 lines") plot(c(0,10),c(0,10), type="n", xlab="x", ylab="y", main="Example SVG plot, tooltips are title + 2 lines (mode=2)") setSVGShapeToolTip(title="A rectangle", desc="that is yellow") rect(1,1,4,6, col='yellow') setSVGShapeToolTip(title="1st circle", desc1="1st line of description", desc2="2nd line of description") points(5.5,7.5,cex=20,pch=19,col='red') setSVGShapeToolTip(title="A triangle", desc1="green", desc2="big") polygon(c(3,6,8), c(3,6,3), col='green') # no tooltips on these points points(2:8, 8:2, cex=3, pch=19, col='black') # tooltips on each of these points invisible(sapply(1:7, function(x) {setSVGShapeToolTip(title=paste("point", x)) points(x+1, 8-x, cex=3, pch=1, col='black')})) dev.off() devSVGTips("svgplot4.svg", title="SVG example plot 4: points and no tooltips") plot(1:11,(-5:5)^2, type='b', main="Simple Example Plot with no tooltips") dev.off() devSVGTips("svgplot5.svg", title="SVG example plot 5: points and a rectangle, no tooltips") plot(1:3) rect(1,1,2,2) dev.off() devSVGTips("svgplot6.svg", title="SVG example plot 6: supply XML code for tips (title + 1 line)") setSVGShapeContents("<title>first circle</title>") plot(1:3, cex=10) setSVGShapeContents("<title>hah!</title>") rect(1,1,2,2) setSVGShapeContents("<title>second circle</title><desc>description</desc>") points(1.5,2.5,cex=20,pch=19,col='red') dev.off() devSVGTips("svgplot7.svg", toolTipMode=2, title="SVG example plot 7: supply XML code for tips (title + 2 lines)") setSVGShapeContents("<title>first circle</title>") plot(1:3, cex=10) setSVGShapeContents("<title>hah!</title>") rect(1,1,2,2) setSVGShapeContents("<title>second circle</title><desc1>first line of description</desc1><desc2>second line of description</desc2>") points(1.5,2.5,cex=20,pch=19,col='red') dev.off() devSVGTips("svgplot8.svg", toolTipMode=1, title="SVG example plot 8: tooltips + hyperlink") plot(c(0,10),c(0,10), type="n", xlab="x", ylab="y", main="Example SVG plot with title + 1 line tips (mode=1) + hyperlink") setSVGShapeToolTip(title="A rectangle", desc="that is yellow") rect(1,1,4,6, col='yellow') setSVGShapeToolTip(title="1st circle with title only") points(5.5,7.5,cex=20,pch=19,col='red') setSVGShapeToolTip(title="A triangle", desc="big and green") polygon(c(3,6,8), c(3,6,3), col='green') # no tooltips on these points points(2:8, 8:2, cex=3, pch=19, col='black') # tooltips on each these points invisible(sapply(1:7, function(x) {setSVGShapeToolTip(title=paste("point", x)) points(x+1, 8-x, cex=3, pch=1, col='black')})) # Hyperlink to www.r-project.org setSVGShapeToolTip(title="www.r-project.org", desc="click to visit!") setSVGShapeURL("http://www.r-project.org") rect(8,6,10,7, col='blue') # Hyperlink to www.r-project.org that opens in a new browser window or tab setSVGShapeToolTip(title="www.r-project.org", desc="click to visit in a new page!") setSVGShapeURL("http://www.r-project.org", "_blank") rect(8,8,10,9, col='green') dev.off() devSVGTips("svgplot9.svg", toolTipMode=1, title="SVG example plot 9: line and point types") plot(c(0,20),c(0,5), type="n", xlab="x", ylab="y", main="Example SVG plot with different line and point types") for (i in 0:16) { lines(i+(0:4), (1:5), col=max(i,1), pch=i, lty=i, type="b") text(i, 0.5, lab=as.character(i), cex=2^(abs((i-8)/4)-1)) } dev.off() # This example checks encoding of characters that are special in XML: # <&'\"> # To avoid tripping up people who have already used the XML entity # (e.g., "&"), an ampersand followed by lower-case letters and a # semicolon is NOT encoded. devSVGTips("svgplot10.svg", toolTipMode=1, title="SVG example plot 10: shapes and points, tooltips are title + 1 line, special chars") plot(c(0,10),c(0,10), type="n", xlab="x", ylab="y", main="Example SVG plot with title + 1 line tips <mode=1>") setSVGShapeToolTip(title="A rectangle", desc="that is <yellow> & yellow") rect(1,1,4,6, col='yellow') setSVGShapeToolTip(title="1st circle with title only") points(5.5,7.5,cex=20,pch=19,col='red') setSVGShapeToolTip(title="A triangle", desc="big & green") polygon(c(3,6,8), c(3,6,3), col='green') text(lab="Special chars: <&'\">", 6, 9, adj=0, cex=1.3) text(lab="Already encoded: <&>", 6, 9.5, adj=0, cex=1.3) # no tooltips on these points points(2:8, 8:2, cex=3, pch=19, col='black') # tooltips on each these points invisible(sapply(1:7, function(x) {setSVGShapeToolTip(title=paste("<point ", x, ">", sep="")) points(x+1, 8-x, cex=3, pch=1, col='black')})) dev.off() # This example checks that the fontwidth information is accurate # by drawing a box closely around letters. # Compare appearance to other devices if you want to make things # more accurate. Note that some descenders and ascenders will go # outside of the bounds. This info is in src/devSVG.c:charwidth. devSVGTips("svgplot11.svg", toolTipMode=0, title="SVG example plot 11: text width with cex=1") charbysize0 <- "'ijlIJ,./\\|:;f!\"()[]rt-*?FLTYcksxyzv`_0123456789EKPRXabdeghnopqu{}\177$ wABCSVDGHNOQUZ#&+<=>MW^~%@m" allchars <- " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177" charbysize <- paste(c(charbysize0, setdiff(strsplit(allchars, NULL)[[1]], strsplit(charbysize0, NULL)[[1]])), collapse="") textinbox <- function(x, y, i) { cc <- substring(charbysize, i-31, i-31) # cc <- rawToChar(as.raw(i)) lab <- paste(rep(cc,10), collapse="") w <- strwidth(lab) if (cc==" ") lab <- paste(lab, "<", sep="") text(x, y, lab=lab, adj=c(0)) rect(x, y-strheight(lab)/2, x+w, y+strheight(lab)/2) } par(mar=c(0,0,0,0)) plot(y=c(0,25),x=c(0,4), type="n", axes=FALSE, xlab="", ylab="") text(2,25,"Character metric info: box is drawn around strings using strwidth & strheight") for (i in 32:127) textinbox(x=0.1+(i-32)%/%24, y=24-(i-32)%%24, i) # print(data.frame(letters, strwidth(letters))) dev.off() # This example checks that the character alignment information is # accurate. devSVGTips("svgplot12.svg", toolTipMode=0, title="SVG example plot 12: character alignment", height=6, width=6) par(mar=c(0,0,0,0)) plot(y=c(-5,5),x=c(-10,10), type="n", axes=FALSE, xlab="", ylab="") text(0,4.5,"Character alignment using adj= or pos= in text()") text(0,4,"Text is drawn at red '+' using args shown") text(0,3.5,lab="XXX") points(0,3.5,pch=3,col='red') for (xadj in (0:2)/2) { text(-3+6*(1-xadj),3,paste("X adj=", xadj," X",sep=""),adj=xadj) points(-3+6*(1-xadj),3,pch=3,col='red') } for (pos in 1:4) { text(c(0,-1,0,1)[pos], 1.5+0.5*c(-1,0,1,0)[pos], paste("X pos=", pos, " X", sep=""), pos=pos) points(c(0,-1,0,1)[pos], 1.5+0.5*c(-1,0,1,0)[pos], pch=3, col='red') } for (xadj in (0:2)/2) for (yadj in (0:2)/2) { text(6*(0.5-xadj),-1.5+(1-yadj),paste("X adj=", xadj,",",yadj," X",sep=""),adj=c(xadj,yadj)) points(6*(0.5-xadj),-1.5+(1-yadj),pch=3,col='red') } dev.off() # This example shows what happens with text clipping. # Too much clipping occurs! I think is is not calling # the text method for the device whenever the text might # be a little out-of-bounds (because of the setting # dd->canClip=FALSE in src/devSVG.c). It seems to be too # aggressive about this, e.g., when par(xpd=NA) (xpd=NA # means clip to device region, xpd=TRUE means clip to # figure region, and xpd=FALSE means clip to plot region). devSVGTips("svgplot13.svg", toolTipMode=0, title="SVG example plot 13: character clipping", height=6, width=6) par(xpd=FALSE) par(mfrow=c(2,2)) par(mar=c(5, 4, 4, 2) + 0.1) str <- paste(letters[c(1:6,21:26)],collapse="") plot(y=c(-10,10),x=c(-10,10), type="n", xlab="X axis", ylab="Y axis", main=paste("par(xpd=", par("xpd"), ")", sep="")) text(0,2,paste("clip to", switch(as.character(par("xpd")),"NA"="device","TRUE"="figure","FALSE"="plot"), "region")) text(-9,9,str,srt=45) text(9,0,str,srt=0) text(9,9,str,srt=-45) text(0,-9,str,srt=-90) text(9,-9,str,srt=-135) text(-9,0,str,srt=180) text(-9,-9,str,srt=135) text(0,9,str,srt=90) par(xpd=TRUE) plot(y=c(-10,10),x=c(-10,10), type="n", xlab="X axis", ylab="Y axis", main=paste("par(xpd=", par("xpd"), ")", sep="")) text(0,2,paste("clip to", switch(as.character(par("xpd")),"NA"="device","TRUE"="figure","FALSE"="plot"), "region")) text(-9,9,str,srt=45) text(9,0,str,srt=0) text(9,9,str,srt=-45) text(0,-9,str,srt=-90) text(9,-9,str,srt=-135) text(-9,0,str,srt=180) text(-9,-9,str,srt=135) text(0,9,str,srt=90) par(xpd=NA) plot(y=c(-10,10),x=c(-10,10), type="n", xlab="X axis", ylab="Y axis", main=paste("par(xpd=", par("xpd"), ")", sep="")) text(0,2,paste("clip to", switch(as.character(par("xpd")),"NA"="device","TRUE"="figure","FALSE"="plot"), "region")) text(-9,9,str,srt=45) text(9,0,str,srt=0) text(9,9,str,srt=-45) text(0,-9,str,srt=-90) text(9,-9,str,srt=-135) text(-9,0,str,srt=180) text(-9,-9,str,srt=135) text(0,9,str,srt=90) par(xpd=FALSE) dev.off()