don*_*zao 6 latex r tikz ggplot2 sweave
我不久前开始使用Sweave.但是,像大多数人一样,我很快遇到一个主要问题:速度.扫描大型文档需要很长时间才能运行,这使得高效工作非常具有挑战性.使用cacheSweave可以加速数据处理.但是,情节 - 特别是ggplot;) - 渲染时间仍然太长.这是我想要使用pgfSweave的方式.
经过许多小时,我终于成功地用Eclipse/StatET/Texlipse建立了一个工作系统.然后,我想将现有的报告转换为与pgfSweave一起使用,并且有一个惊喜:我的大多数ggplots似乎都不再起作用了.以下示例在控制台和Sweave中完美运行:
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
Run Code Online (Sandbox Code Playgroud)
然而,使用pgfSweave运行它,我收到此错误:
Error in if (width > 0) { : missing value where TRUE/FALSE needed
In addition: Warning message:
In if (width > 0) { :
the condition has length > 1 and only the first element will be used
Error in driver$runcode(drobj, chunk, chunkopts) :
Error in if (width > 0) { : missing value where TRUE/FALSE needed
Run Code Online (Sandbox Code Playgroud)
当我从geom_point中删除aes(...)时,该图与pgfSweave完美配合.
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
Run Code Online (Sandbox Code Playgroud)
编辑:我对问题进行了更多调查,可以将问题减少到tikz-device.
这很好用:
quartz()
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
Run Code Online (Sandbox Code Playgroud)
这给出了上述错误:
tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
dev.off()
Run Code Online (Sandbox Code Playgroud)
这也很好用:
tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
dev.off()
Run Code Online (Sandbox Code Playgroud)
我可以用5种不同的ggplots重复这个.在映射中不使用颜色(或大小,alpha,...)时,它适用于tikz.
Q1:有没有人对这种行为有任何解释?
此外,非绘图代码块的缓存不能很好地工作.使用Sweave时,以下代码块完全没有时间.使用pgfSweave,大约需要10秒.
<<plot.opts,echo=FALSE,results=hide,cache=TRUE>>=
#colour and plot options are globally set
pal1 <- brewer.pal(8,"Set1")
pal_seq <- brewer.pal(8,"YlOrRd")
pal_seq <- c("steelblue1","tomato2")
opt1 <- opts(panel.grid.major = theme_line(colour = "white"),panel.grid.minor = theme_line(colour = "white"))
sca_fill_cont_opt <- scale_fill_continuous(low="steelblue1", high="tomato2")
ory <- geom_hline(yintercept=0,alpha=0.4,linetype=2)
orx <- geom_vline(xintercept=0,alpha=0.4,linetype=2)
ts1 <- 2.3
ts2 <- 2.5
ts3 <- 2.8
ps1 <- 6
offset_x <- function(x,y) 0.15*x/pmax(abs(x),abs(y))
offset_y <- function(x,y) 0.05*y/pmax(abs(x),abs(y))
plot_size <- 50*50
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常奇怪的行为,因为只有一些变量被设置供以后使用.
Q2:有人对此有任何解释吗?
Q3:更一般地说,我想问一下是否有人成功使用pgfSweave?成功的意思是所有在Sweave中工作的东西也可以在pgfSweave中工作,还有漂亮字体和提高速度的额外好处.;)
非常感谢您的回复!
Q1:有人对这种行为有任何解释吗?
以下是 tikzDevice 在尝试构建绘图时出错的三个原因:
当您添加创建图例的美学映射时,例如aes(colour=que_id),ggplot2 将使用变量名称作为图例的标题 — 在本例中为 que_id。
tikzDevice 将所有字符串(例如图例标题)传递给 LaTeX 进行排版。
在 LaTeX 中,下划线字符 ,_用于表示下标。如果在数学模式之外使用下划线,则会导致错误。
当 tikzDevice 尝试计算图例标题“que_id”的高度和宽度时,它将字符串传递给 LaTeX 进行排版,并期望 LaTeX 返回字符串的宽度和高度。LaTeX 会出现错误,因为数学模式之外的字符串中使用了未转义的下划线。tikzDevice 收到NULL字符串宽度而不是数字,这会导致if (width > 0)检查失败。
避免问题的方法
通过添加色阶来指定要使用的图例标题:
p1 <- ggplot(plot_info, aes(elevation, area))
p1 <- p1 + geom_point(aes(colour=que_id))
# Add a name that is easier for humans to read than the variable name
p1 <- p1 + scale_colour_brewer(name="Que ID")
# Or, replace the underscore with the appropriate LaTeX escape sequence
p1 <- p1 + scale_colour_brewer(name="que\\textunderscore id")
Run Code Online (Sandbox Code Playgroud)使用 tikzDevice 0.5.0 中引入的字符串清理功能(但直到 0.5.2 才被破坏)。目前,字符串清理只会转义以下字符:默认情况下%,$、{、}、 和^。tikzSanitizeCharacters但是,您可以通过和选项指定其他替换对tikzReplacementCharacters:
# Add underscores to the sanitization list
options(tikzSanitizeCharacters = c('%','$','}','{','^', '_'))
options(tikzReplacementCharacters = c('\\%','\\$','\\}','\\{',
'\\^{}', '\\textunderscore'))
# Turn on string sanitization when starting the plotting device
tikz('myPlot.tex', standAlone = TRUE, sanitize = TRUE)
print(p1)
dev.off()
Run Code Online (Sandbox Code Playgroud)我们将在接下来的几周内发布 tikzDevice 的 0.5.3 版本,以解决由于 R 处理方式的变化而出现的一些烦人的警告消息system()。我将在下一个版本中添加以下更改:
更好的警告消息width表明NULL绘图文本可能有问题。
将下划线和一些其他字符添加到字符串清理程序查找的默认字符集中。
希望这可以帮助!