Android with root Git for version control Lircd with Raspberry Pi for IR receiver and sender Tips for Windows Depolying your own password management tool -- KeeWeb Depoly your flask app into Heroku Fix shit IE code manually ISBN to Book Category by Scraping DangDang A Generic Makefile for C/C++ Program Configure Raspberry pi Remove watermark with PyPDF2 tips for docker Anaconda+TensorFlow+CUDA Snippets Configure Remote Mathematica Kernel Build your own ngrok server Access Array SSL VPN 使用Rstudio制作html5幻灯片 tips for Mac OS X system Tips for ipython notebook 配置Ubuntu server + Openbox (Obuntu) tips for Vimperator tips for Vim 安装CUDA My First Jekyll Blog rsync常见选项 在Linux中读取Ipod touch的文件 tip for texmacs 在VPS上建站的一些tip Gnuplot绘图札记 Samba系统和autofs自动挂载 Linux中alsamixer声卡无法录音 搭建自己的RSS订阅器——Tiny Tiny RSS Grub2引导安装Ubuntu awk tips 将Ubuntu系统装入U盘 The Great Rtorrent 编译GCC 再这样剁手!!!该死的libgd 使用ulimit进行资源限制 使用SSH代理上IPV6 使用RCurl抓取网页数据 修复Ubuntu Grub记 openbox中的文件关联 在Ubuntu 12.04下编译qtiplot 处理BCM4312网卡驱动纪实 配置我的Ubuntu Server记 Cygwin杂记 Linux 使普通用户具有以超级权限执行脚本 让firefox自定义地处理文件类型 WordPress优秀主题及插件 在phpcloud上搭建wordpress UBUNTU下用pptpd做VPN server ubuntu升级内核过后的一些问题 安装telnet服务 kubuntu札记 64位kubuntu札记 统计软件R Virtualbox stardict星际译王 Ubuntu重装windows系统后的grub引导修复 SSH服务及花生壳域名解析 采用cbp2make工具由code::blocks工程创建makefile文件 UBUNTU 札记

ggplot包不常见函数集合

2013年04月12日

今天早上忙活了好久,想找到如何在ggplot中双对数坐标下绘制minor ticks,上Overflow找了一圈大多都没有提及如何绘制那种很漂亮的。正想等有空了再来自己写一个如何设置breaks和lable的函数时,却看到一个机器人翻译的页面,上面提到了一个函数annotation_logticks(),正是我想要的函数,为什么要取这么个函数名,并且没有在任何相关的函数中提到过,官方文档里面也没有。

我想,终有一天,R的命名规范,以及实现途径会受人诟病。R里面有很多函数名看起来很不明显,并且一个功能往往有多个函数都可以来实现但是又有些微的差别。各个包也没有统一的函数,参数命名方式。我哪儿知道哪里改用.(c),哪里该用"c",又他妈哪里该用..c..,这些命名方式都没有统一的含义,在各个包之间切换的时候很容易出问题,想当然,完全不符合程序语言的“最小惊喜”原则。

好吧,吐糟了这么多,要表扬的是R竟然支持中文名作为变量名,其他语言中倒没有见过,这让写出来的程序可能是很直白的。

这篇帖子专门用来记录我使用到的不容易想到名字的函数或功能,就从annotation_logticks()开始吧。

  1. scale_fill_continuous 函数有一个limits参数文档中没有介绍,可以用来指定颜色对应数值的范围。类似的scale_xxx_continuous函数将直接删除范围以外的数据点。在不删除数据点的情况下限制坐标轴范围,可以使用coord_cartesian(xlim=c(min, max))等函数。

  2. 利用stat_function绘制曲线并利用scale_color_manual手动设置颜色

     ggplot(data.frame(x=c(0,2*pi)),aes(x))+
       stat_function(aes(color='sin'),fun=sin)+
       stat_function(aes(color='cos'),fun=cos)+
       scale_color_manual(values=c('sin'='red',
                                   'cos'='black'))+
       labs(color='')
    
  3. 类似guides(color=FALSE)这样可以关闭掉图例。

  4. annotation_logticks

     library(ggplot2)
     library(MASS)
     library(scales)
     a <- ggplot(Animals, aes(x = body, y = brain)) + geom_point() +
       scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),
                     labels = trans_format("log10", math_format(10^.x))) +
       scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                     labels = trans_format("log10", math_format(10^.x))) +
       theme_bw()
     # 上面使用trans_breaks及trans_format来制作一个函数实现将刻度转化为更好看的形式,而非普通的很多0的数值
    
     a + annotation_logticks()                # Default: log ticks 在下面和左边
     a + annotation_logticks(sides = "lr")    # left and right: 在左边和右边(y轴上)
     a + annotation_logticks(sides = "trbl")  # All four sides: 四周都有
    

    annotation_logticks

  5. 函数adjustcolor(col,alpha)可以将某种颜色转换为具有指定透明度alpha的颜色。一些色板函数如heat.colors等也可以设置alpha参数。包RColorBrewer提供了额外的色板,使用display.brewer.all查看其提供的色板,使用brewer.pal设置色板。

  6. 函数facet_grid有一个参数labeller可以用来指定处理子图标题的转换函数。例如采用A~B进行分面,指定函数function(var,value){paste(ifelse(var=='A','A','B'),value,sep=": ")}(v1.0)或function(var){v <- list(paste(ifelse(colnames(var)=='A','A','B'),var[,1])); names(v) <- colnames(var); v}(v2.0)即可在子图标题上添加对应变量名称。v2.0提供了一些函数来快速生成需要的标签函数,比如facet_wrap('alpha',labeller = label_bquote(alpha==.(alpha)))可方便地生成数学表达式。

  7. 整个ggplot对象只能使用一个coord_xx函数,因为对坐标轴的变换是在最后一次完成的。所以coord_flipcoord_fixd/coord_equal不能同时使用,要调节图片长款比例可以使用theme(aspect.ratio = 1)

  8. scale_*_**等系列函数有expand参数可以调节边界数据点与坐标轴之间的空袭。

  9. annotate_custom(grob=ggplotGrob(another.ggplot), xmin=0,xmax=1,ymin=0,ymax=1)可以在指定位置嵌入一个子图。

  10. gtablegridExtra包提供了操纵ggplot对象的低级函数,采用如下方式可以将多幅子图(存放在list中比较方便)合并并对齐坐标轴:

    rbind.ggplot.list <- function(gl, size='first'){
      gl <- lapply(gl, ggplotGrob)
      p <- do.call(rbind,args = c(gl,size=size))
      p$widths <- do.call(unit.pmax,lapply(pl, function(x){x$widths}))
      return(p)
    }
    pl <- rbind.ggplot.list(pl)
    grid.newpage()
    grid.draw(pl)
    
  11. 可将多个复用的layer存储在list中,然后一次性加到ggplot对象中。