今天早上忙活了好久,想找到如何在ggplot中双对数坐标下绘制minor ticks,上Overflow找了一圈大多都没有提及如何绘制那种很漂亮的。正想等有空了再来自己写一个如何设置breaks和lable的函数时,却看到一个机器人翻译的页面,上面提到了一个函数annotation_logticks()
,正是我想要的函数,为什么要取这么个函数名,并且没有在任何相关的函数中提到过,官方文档里面也没有。
我想,终有一天,R的命名规范,以及实现途径会受人诟病。R里面有很多函数名看起来很不明显,并且一个功能往往有多个函数都可以来实现但是又有些微的差别。各个包也没有统一的函数,参数命名方式。我哪儿知道哪里改用.(c)
,哪里该用"c"
,又他妈哪里该用..c..
,这些命名方式都没有统一的含义,在各个包之间切换的时候很容易出问题,想当然,完全不符合程序语言的“最小惊喜”原则。
好吧,吐糟了这么多,要表扬的是R竟然支持中文名作为变量名,其他语言中倒没有见过,这让写出来的程序可能是很直白的。
这篇帖子专门用来记录我使用到的不容易想到名字的函数或功能,就从annotation_logticks()
开始吧。
-
scale_fill_continuous
函数有一个limits参数文档中没有介绍,可以用来指定颜色对应数值的范围。类似的scale_xxx_continuous
函数将直接删除范围以外的数据点。在不删除数据点的情况下限制坐标轴范围,可以使用coord_cartesian(xlim=c(min, max))
等函数。 -
利用
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='')
-
类似
guides(color=FALSE)
这样可以关闭掉图例。 -
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: 四周都有
-
函数
adjustcolor(col,alpha)
可以将某种颜色转换为具有指定透明度alpha的颜色。一些色板函数如heat.colors
等也可以设置alpha参数。包RColorBrewer
提供了额外的色板,使用display.brewer.all
查看其提供的色板,使用brewer.pal
设置色板。 -
函数
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)))
可方便地生成数学表达式。 -
整个ggplot对象只能使用一个
coord_xx
函数,因为对坐标轴的变换是在最后一次完成的。所以coord_flip
和coord_fixd/coord_equal
不能同时使用,要调节图片长款比例可以使用theme(aspect.ratio = 1)
-
scale_*_**
等系列函数有expand
参数可以调节边界数据点与坐标轴之间的空袭。 -
annotate_custom(grob=ggplotGrob(another.ggplot), xmin=0,xmax=1,ymin=0,ymax=1)
可以在指定位置嵌入一个子图。 -
gtable
和gridExtra
包提供了操纵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)
-
可将多个复用的layer存储在list中,然后一次性加到ggplot对象中。