查看原文
其他

把你用R画的图(base或ggplot2)变成ASCII纯文本!

Y叔叔 YuLabSMU 2022-09-20

ASCII画图,好处多多:

  • 签名档装逼(曾经的论坛/QQ签名)

  • 终端直接出图

  • log文件出图

第一点,我删掉了,因为时代变了,它还暴露年龄,没人玩这个了。

终端直接出图,这一点很重要,因为有时候你只是瞄一眼,而你的终端是ssh到服务器上,这时候如果服务器没开X-server,那你想看一下图,就得生成文件,然后传到本地,再看。费时费力啊。即使你本地,比如说WSL,你也可以不用为了看一张图而专门去开X-server。第三点,你自己写程序的话,计算过程写Log文件,纯文本的,你现在也可以考虑在log文件里写ASCII图了,纯文本嘛,而图又能快速传达信息。

当年在《Y叔要求职》一文中,我就画了一个散点图,说我每年发表一作文章的数目。用的就是ASCII纯文本的。


还写过一篇《纯文本可视化FASTQ质量数据》用凹凸凹凸的形状来展示测序质量:


但这些毕竟是针对特殊的类型,第一个用了txtplot包,第二个用了pillar包。txtplot算是功能强大了,可以画散点、曲线、柱状图和箱式图。但毕竟能出的图太有限了。如果用base plotggplot2出的图,都能够变成ASCII的话,那就太爽了,而且我前面谈到的,也就能够轻松实现。

这得益于一个R包,devout

通常R的画图设备是C/C++:

devout让你用纯R代码实现画图设备:

这个包带了一个ascii()的设备,于是你画图,在这个设备上画出来,就是ASCII码。来个实例,这可是小提琴图,变ASCII,就是这么简单。


base plot呢?照常支持:



让我们来画个饼图吧:


> ascii()
> pie(c(1,3,5))
> invisible(dev.off())


                                   2#########                                   
                               ###
##        #####                               
                            ###                 ####                            
                           ##                     ###                           
                          #                    ###   ##1                        
                         ####               ###      ##                         
                         #   #######     ###          #                         
                        ##          ###################                         
                         #                            #                         
                         ##                          ##                         
                          ##                        ##                          
                           ##                      ##                           
                             ###                ###                             
                                #####      #####                                
                                   3 ######                                     


来个曲线图吧:

> ascii()
> ggplot(mtcars, aes(disp, mpg)) + geom_line()
> invisible(dev.off())
  35 O  #                                                                       
         #                                                                      
     O   #  #                                                                   
  30 .....### ....... ........ ....... ........ ....... ....... ........ .......
          #  #                                                                  
     ........#..#.... ........ ....... ........ ....... ....... ........ .......
  25 O        # #    #                                                          
     ........ ####.####....... ....... ........ ....... ....... ........ .......
m               ###  ##                 #                                       
20 O               # #             ### #                                      
g    ........ ....... ..#..... .....#. ..#..... ....... .#.....##....... .......
                        ############      ##            ##  ###  ##             
     ........ ....... ........ ....... ....##..#####...#.#.#... ...##... .......
  15 O                                       ###    ## # ##          ##         
                                                      ##               #        
     ........ ....... ........ ....... ........ ....... ....... ........##......
  10 O                                                                    ###   
     ......100....... ......200....... ......300....... .....400........ .......
                                       disp                                     


再来个柱状图:


ascii()
ggplot(mtcarsaes(factor(cyl))) + geom_bar()
invisible(dev.off())
     .............. ...................... ............xxxxxxxxxxxxxxxxxxxxx....
     .............. ...................... ............xxxxxxxxxxxxxxxxxxxxx....
                                                       xxxxxxxxxxxxxxxxxxxxx    
     ...xxxxxxxxxxxxxxxxxxxxxx............ ............xxxxxxxxxxxxxxxxxxxxx....
     O  xxxxxxxxxxxxxxxxxxxxxx                         xxxxxxxxxxxxxxxxxxxxx    
  10 ...xxxxxxxxxxxxxxxxxxxxxx............ ............xxxxxxxxxxxxxxxxxxxxx....
     ...xxxxxxxxxxxxxxxxxxxxxx............ ............xxxxxxxxxxxxxxxxxxxxx....
c       xxxxxxxxxxxxxxxxxxxxxx                         xxxxxxxxxxxxxxxxxxxxx    
o    ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
u    ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
n  5 O  xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx  xxxxxxxxxxxxxxxxxxxxx    
t    ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
     ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
        xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx  xxxxxxxxxxxxxxxxxxxxx    
     ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
     ...xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxx....
   0 O  xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx  xxxxxxxxxxxxxxxxxxxxx    
     .............4O.....................6O.....................8O..............
                                    factor(cyl)                                 

往期精彩

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存