Linux下R调用png绘图报错External2(C_X11错误unable to start device PNG

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

问题背景:

本人在使用用 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()
 

再执行,可以看到图片生成成功,其他类似修改即可。

 

效果
 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值