查看原文
其他

R|ggplot2(一)|一个完整的绘图流程

2017-05-25 Dwzb R语言中文社区

这一块内容包括如下几个部分

  • 首先简单画一个图出来

  • 做一些等价调整

  • 接受另一种类型的数据

  • 简单的参数调整

  • 纵坐标使用百分比表示

  • 更改横纵轴坐标、标题等

  • 在图中增加标注的文字

  • 调整字体、背景等,达成excel的效果

  • 保存图形

首先简单画一个图出来

# 我们拿到这样的数据 name <- c("多","中","少","中","少") data <- data.frame(name) # 转化为数据框 library(ggplot2) # 简单地画出一个图 ggplot(data,aes(x=name)) + geom_bar()


从上面我们知道如下信息

  • ggplot2作图需要输入数据框

  • 作图时我们没有输入频数,函数会自动数出三种类型有多少

  • ggplot函数中一般接两个参数,一个是数据框data,一个是用来做图的列,放在aes里面,这一点读者先记住就好,我们会在讲分组作图的部分中详细解释

  • 使用数据框中的列时,不需要使用$引用,直接使用列名就可以(只有放在aes中才可以)

  • 前面ggplot函数指定使用的数据,使用”+”来连接其他函数,geom_类函数表示作图类型,geom_bar是做柱状图的函数,如果要做点图就 + geom_point(),当然,点图的话前面就要加入两个参数x和y

# 画点图代码如下,读者可以自己运行 data1 <- data.frame(a=1:3,b=3:1) ggplot(data1,aes(a,b)) + geom_point()

下面我们做一点微调

  • 指定哪一列的aes()放在ggplot函数还是geom_bar函数中无所谓

  • 先做好的部分可以赋值保存,再去加其他内容

下面几种作图等价

ggplot(data,aes(x=name)) + geom_bar() ggplot(data) + geom_bar(aes(x=name)) p <- ggplot(data,aes(x=name)) p + geom_bar()

接受另一种类型的数据

我们画柱状图是使用的数据一般有两种

  • 一种是像上面那种,所有内容列出来,函数内部自己数

  • 一种是 名字-频数 对应形式

当我们得到的是 名字-频数 形式的数据,也可以作图

data1 <- data.frame(table(name)) # 将数据转化为 名字-频数 形式 data1 #   name Freq # 1   多    1 # 2   少    2 # 3   中    2 ggplot(data1,aes(x=name,y=Freq)) + geom_bar(stat="identity") # 和上图相同

上面我们发现以下信息

  • aes()中接受了两个参数,分别代表 名字-频数

  • geom_bar函数中加了一个参数stat=”identity”,表示不要像之前一样去查数,而是就使用数据Freq本身作为频数

简单的参数调整

上面的图片中,我们发现简单的代码就能画出比较高大上的图形。仔细观察这张图片。会发现函数默认设置了灰色背景、深灰色柱子、白色网格线、去掉图片边框等,正是这些默认的设置,让ggplot2包的简单代码作图远胜于基础函数作图。

不过如果你对这些设置还不满意,这些都是可以调整的,下面图形没有巨大改变,就不放图片了,读者可以自行尝试

p <-ggplot(data,aes(x=name)) p + geom_bar(col="red") # 调整柱子边框颜色为红色(注意这里col不是柱子颜色) p + geom_bar(fill="red") # 调整柱子颜色为红色(fill才是柱子内部颜色) p + geom_bar(width=0.5) # 调整柱子宽度,1时两个柱子挨在一起,0.5则宽度是1时的一半

纵坐标使用百分比表示

library(dplyr) # ggplot2 包常常和dplyr包一起使用 data1 <- data.frame(table(name)) data2 <- data1 %>% mutate(f=Freq/sum(Freq)) # 使用scales包中很方便的方法 ggplot(data2,aes(name,f)) + geom_bar(stat="identity") +  scale_y_continuous(labels = scales::percent) # 另外一种实现方法 ggplot(data2,aes(name,f)) + geom_bar(stat="identity") +  scale_y_continuous(breaks=seq(0,0.4,len=5),                     labels=paste(seq(0,0.4,len=5)*100,"%"))


这里使用的 scale_y_continuous 函数表示当y轴是连续数值时,调整其标度。如上面代码所示,第一种是使用scales包中的特殊表示方法,如果是常规使用方法,应该是下面这种表示方式。breaks表示在轴上哪些点的位置标标签,labels表示标什么标签。

如果想让坐标轴表示0-0.5的范围也只要用 limits 参数调整即可

ggplot(data2,aes(name,f)) + geom_bar(stat="identity") +  scale_y_continuous(breaks=seq(0,0.4,len=5),                     labels=paste(seq(0,0.4,len=5)*100,"%"),                     limits = c(0,0.5))

更改横纵轴坐标、标题等

p1 <- ggplot(data,aes(x=name)) + geom_bar(width=0.7) p1 + xlab("种类") + ylab("") +  ggtitle("运动情况")


所以更改 横纵轴坐标、标题 都是通过 + 特定的函数来实现的,而不可以在原有函数中增加参数来实现。

在图中增加标注的文字

p2 <- ggplot(data,aes(x=name)) +  geom_bar(width=0.7,fill=rgb(50,163,221,maxColorValue=255)) +  xlab("种类") + ylab("") + ggtitle("运动情况") (p3 <- p2 + geom_text(stat="count",   label=paste(table(name)/sum(table(name))*100,'%',sep=''),   colour = "black", vjust=-0.5, size=4.7))

增加标注文字使用geom_text函数,参数label表示标什么,后面参数调整颜色、位置和大小。

调整字体、背景等,达成excel的效果

这里调整也要使用函数,还涉及到ggplot2包中使用比较麻烦的一块——theme设置

ggplot2中默认使用的主题是灰色背景、白色网格、无边框,同时,它还定义了一些特殊的主题,只要通过+连接就可以使用

p3 + theme_bw()


从图中我们可以看到,theme_bw()是白色背景、灰色网格、有边框。除此之外,还有很多其他主题,读者可以在rstudio中打出 theme 就会自动弹出选项补全函数。

我们可以使用这种现成的主题,也可以自行定制,或者修改当前主题

mytheme <- theme_bw() +  theme(plot.title=element_text(size=rel(2),hjust=0.5),        axis.title=element_text(size=rel(1.5)),        axis.text=element_text(size=rel(1.5)),        panel.grid.major=element_line(color="white"),        panel.grid.minor=element_line(color="white"),        panel.border=element_rect(color="white"),        axis.line=element_line(color="gray",size=1)) p3 + mytheme


这样自己定义好的主题,就可以应用到其他各种图形中

下面解释一下theme函数中的参数。这里应该说有两层参数,一层是plot.title等theme函数的参数,第二层是size等element_函数参数,这就是theme设置复杂的原因。

参数的作用都可以根据名字顾名思义了

  • plot.title 调整标题文字,size 和 hjust参数则调整大小和位置(此处居中)

  • 后面调整轴名、标注名、网格线、坐标轴显示情况等内容

theme的问题我们之后会专门讲述,这里只是想让读者知道,这些设置都要在theme中调整,而不要以R中基础绘图的思路,想直接在geom_bar函数中使用参数设置。

保存图形

ggplot2包中有专门的保存函数ggsave

ggsave("1.png", dpi=300) # 默认保存最近的作图 ggsave("1.png", dpi=300, plot=p3) # 自己指定保存的图片

到这里,我们讲述了一个简单柱状图绘制的基本流程。当然,很多时候没有必要调整那么多参数,直接使用默认的图形就已经非常令人满意了,作图保存两行代码就搞定。这里讲这么多是为了能应对更多需求,完善自己的知识体系。

接下来,我会具体讲述更加复杂的需求,和一些需求的具体解释。

专栏信息

专栏主页:Data Analysishttps://zhuanlan.zhihu.com/Data-AnalysisR
专栏目录:目录(https://zhuanlan.zhihu.com/p/25780082)

文末彩蛋

这里讲一下各种赋值符号的区别,R语言中赋值符号有如下几种:= <- -> <<-

它们的区别有一下几点

  • <- 是R语言中对变量赋值的符号,这和其他语言使用=不同

  • =是函数中对参数的赋值,不过用于变量赋值也可以,但是还是推荐用 <-

  • -> 是把前面内容赋值给后面参数的符号,为了代码规范,不推荐使用

  • <<- 是改变作用域的赋值,在函数中使用,变量名在函数外面依然可以使用

->的使用

a <- 1:4 1:4 -> b a;b # 都可以实现赋值

=与<- 的区别

m=1:4;m n <- 1:4;n # 正常赋值没区别 f <- function(y,x) x+1 f(x=2) # 让参数x为2,正常返回3 f(x <- 2) # 报错 f <- function(y,x) x+1 f(0,2) # 3 f(0,aa <- 2) # 3 f(0,aa = 2) # 报错,没有这个参数aa

在函数中使用<- 的逻辑是,先赋值2给x,再让这个结果作为函数f的第一个参数,也就是让y是2,而函数要使用x进行计算,自然会报错

<-与<<-的区别

f1 <- function(x) (y<-x+1) f2 <- function(x) (y<<-x+1) f1(2) y # Error: object 'y' not found f2(2) y # 3

这说明在函数中使用<<-赋值,变量名可以函数外面被调用,这涉及到变量的作用空间问题,本专栏以后还会专门讲述

不过如果调用函数时使用了赋值号,这个变量是可以再外部使用的,因为它相当于在外部赋值之后,再作为参数传输进去的

f1(abcd <- 2) abcd # 2 f1(abc <<- 2) abc f1(x = 2) x # Error: object 'x' not found

Dwzb , R语言中文社区专栏作者,厦门大学统计专业学生。
知乎专栏:Data Analysis
https://zhuanlan.zhihu.com/Data-AnalysisR 




微信回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 


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

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