问题背景:
本人在使用用 benchmarksql 对某国产数据库进行 tpcc 压测后,对 my_result_.. 目录调用 generateGraphs.sh 绘图,然而命令却报错,如下:
Generating .. png ... Error in .External2(C_X11, paste0("png::", filename), g$width, g$height, :
unable to start device PNG
Calls: png
In addition: Warning message:
..................
no png support in this version of R
Execution halted
ERROR
看起来是似乎png未进行安装。
解决过程
在R命令行下,执行:
> capabilities()
jpeg png tiff tcltk X11 aqua
FALSE FALSE FALSE FALSE TRUE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE TRUE TRUE TRUE TRUE
NLS profmem cairo ICU long.double libcurl
TRUE FALSE FALSE FALSE TRUE TRUE
> install.packages("Cairo")
--- Please select a CRAN mirror for use in this session ---
Secure CRAN mirrors
1: 0-Cloud [https]
2: Australia (Canberra) [https]
输入一个源数字后安装完毕,
> capabilities()
jpeg png tiff tcltk X11 aqua
FALSE FALSE FALSE FALSE TRUE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE TRUE TRUE TRUE TRUE
NLS profmem cairo ICU long.double libcurl
TRUE FALSE FALSE FALSE TRUE TRUE
> library(Cairo)
> Cairo.capabilities()
png jpeg tiff pdf svg ps x11 win raster
TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE
可以看到png不能直接支持,Cairo库支持,从网上查询得到有关信息说 “生成图片需要X11,但是Unix shell是没有X11”,并且提供了两种方法:
“1.在X11模式下执行R语言命令,也就是在linux的桌面。如果你只是在桌面上画画图,那选择这个方式就可以了。
2.不使用X11生成,使用 图形渲染库Cairo。比如我,需要用脚本,根据实时数据生成统计图,那么用这个方式就很方便。”
对于本人应用需求来说,那就是使用第二个方式,改用Cairo库。
从脚本里看,调用了misc目录下的 tmp_nopm.R 等脚本,报错之处为:
png("tpm_nopm.png", width=@WIDTH@, height=@HEIGHT@)
修改为:
library(Cairo) //需要加载Cairo库
CairoPNG("tpm_nopm.png", width=@WIDTH@, height=@HEIGHT@)
Cairo使用起来非常简单,和基础包grDevices中的函数对应。
CairoPNG: 对应grDevices:png()
CairoJPEG: 对应grDevices:jpeg()
CairoTIFF: 对应grDevices:tiff()
CairoSVG: 对应grDevices:svg()
CairoPDF: 对应grDevices:pdf()
再执行,可以看到图片生成成功,其他类似修改即可。
效果

在Linux系统中,作者在使用benchmarksql压测后尝试用R绘制图表时遇到无法启动PNG设备的错误。通过R的`capabilities()`函数发现png支持缺失。安装Cairo包并使用其提供的图形渲染库解决了问题,通过修改脚本将`png()`替换为`CairoPNG()`成功生成了图片。

被折叠的 条评论
为什么被折叠?



