ggplot里的各种mapping

来源:互联网 发布:adobe pdf reader mac 编辑:程序博客网 时间:2024/06/15 03:10

又有新任务= = 发现ggplot的mapping 不仅有 aes 一个函数,还有很多方便使用的变式,跟大家分享下。今天来不及把图片保存,下次有空补上~

男友想做下面这件事,用一个 for 循坏,每次对 ggplot 加一条线,最后打印。

library(ggplot2)v <- c("wt", "disp")p <- ggplot(mtcars)for(i in 1:2){  p <- p + geom_line(aes(x = mpg, y = mtcars[[v[i]]]))}print(p)

可是,结果却无论如何只打出了一条线。不解。研究了很久,发现ggplot 画图看起来好像是按顺序叠加,但其实本质上叠加过程只发生在定义,实际绘图的时候是同时的!而且上述方法不能成功的本质是,ggplot 把 mtcars[[v[i]]] 这个东东,注意带有 i 赋值给了y,并没有把具体的对应那列赋值(至于为什么要两个中括号,大家可以思考一下),所以只会按照最后的i(=2) 绘图。

那怎么解决呢?我很神奇的发现了 aes_string 这个函数,可以用字符串来代替本来写在 aes 里面的变量名。

p <- ggplot(mtcars)for(i in 1:2){  p <- p + geom_line(aes_string(x = "mpg", y = v[i], colour = quote(v[i])))}print(p)

这样就可以画出两条线啦,当然标记颜色的时候又遇到了刚刚的问题,就是颜色的赋值是v[i],而非具体的值,所以两条线只有一种颜色。(大家可能会想,为什么要加 quote 呀,如果不加的话,相当于用某变量的值来标记颜色)

最后,我又很神奇的发现了 aes_ 这个函数,不得不感叹ggplot 真是博大精深。

p <- ggplot(mtcars)for(i in 1:2){  p <- p + geom_line(aes_(x = ~mpg, y = as.name(v[i]), colour = v[i]))}print(p)

在 aes_ 里面,~和quote 的作用是一样的,而as.name 把字符串转成了名字(其实不是非常理解)。具体等价例子参见 http://docs.ggplot2.org/current/aes_.html 而且ggplot2 index 真的很方便,查起来一目了然~

0 0
原创粉丝点击