分享

R语言ggplot2包之画直方图

 杉杉之园 2017-09-13

引言

ggplot2包的作图质量毋庸置疑,但是其作图语法对新手来说还是有点难度,ggplot2:数据分析与图形艺术这本书也介绍了ggplot2包的基本哲学思想和操作,个人感觉例子还不够丰富,所以对该包的用法还是停留在半瓶醋的水平。某天,突然发现一本ggplot2包的例子书,大喜,英文版名字为 R Graphics Cookbook,中文版叫做 R数据可视化手册,鉴于高昂的价格,我决定硬着头皮翻下英文版,顺便做点笔记,供自己或者各位朋友参考,英文水平不高,如有错误,莫怪。

基本操作

首先,我想介绍的是用ggplot2画直方图,基本用法如下:

install.packages('gcookbook')#R数据可视化手册书中的数据集
library(ggplot2)
library(gcookbook) 
ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity")
  • 1
  • 2
  • 3
  • 4
  • 5

直方图
ggplot()函数生成图层,aes()指定x和y轴变量,x一般为名义变量;geom_bar生成直方图图层。

如果x为连续变量或者数值变量,直方图会有点不同。如果是连续变量,直方图的横坐标会取连续变量最大值与最小值之间每一个数值;如果是数值变量,你得把数值变量转化成因子,例子见代码。

BOD#BBD数据集 Time变量不包含6这个数值
Time demand
1 8.3
2 10.3
3 19.0
4 16.0
5 15.6
7 19.8
ggplot(BOD, aes(x=Time, y=demand)) + geom_bar(stat="identity")#直接赋值,不做因子转化
ggplot(BOD, aes(x=factor(Time), y=demand)) + geom_bar(stat="identity")#变量进行因子转化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

图2
图3
直接把连续变量赋值给x和数值转为因子后给x的差异从图中就能很清楚的看出来。

调整颜色

直方图默认为黑灰色填充,我们可以对填充颜色和直方图边框颜色进行修改。

ggplot(pg_mean, aes(x=group, y=weight)) +
geom_bar(stat="identity", fill="lightblue", colour="black")
  • 1
  • 2

图4

分组直方图

有时候我们想对同一数据中的两类不同对象进行比较,我们可以使用分组直方图。我们使用cabbage_exp数据集,该数据集包含两类不同数据

cabbage_exp#数据集
Cultivar Date Weight
c39 d16 3.18
c39 d20 2.80
c39 d21 2.74
c52 d16 2.26
c52 d20 3.11
c52 d21 1.47
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+geom_bar(stat='identity',position="dodge")#identity意味着把y当做值去输入,如果改成bin,就会计算y出现的频数。dodge意味是各组是左右分布而不是上下重叠
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+geom_bar(stat='identity')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

图5
图12上下重叠分组

制作频数直方图

频数直方图不需要指定变量y,而是根据变量x出现的频数自动生成。

ggplot(diamonds, aes(x=cut)) + geom_bar(stat="bin")#stat="bin"可有可无,该参数是默认的
  • 1

图6

给正值和负值直方图赋予不同颜色

csub <- subset(climate, Source=="Berkeley" & Year >= 1900)
csub$pos <- csub$Anomaly10y >= 0 #pos变量是个布尔变量,值为T or F
ggplot(csub, aes(x=Year, y=Anomaly10y, fill=pos)) +geom_bar(stat="identity", position="identity")#position="identity"是为了关闭负值直方图没有定义的警告
  • 1
  • 2
  • 3

图7

调整直方图柱子大小及宽度

直方图宽度调整用width函数,默认值为0.9。我们可以通过修改该值,使柱子变得更宽or更窄。

ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity", width=0.5)#窄柱子
ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity", width=0.5)#宽柱子
  • 1
  • 2

图8窄柱子
图9宽柱子
还有在分组直方图中,各组柱子之间是没有空隙的,如果要改变柱子之间距离,我们需要设置position=po
sition_dodge()。

ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +geom_bar(stat="identity", width=0.5, position=position_dodge(0.6))#值越大越离得远
  • 1

图10

图中增加数据

可以用geom_text()给直方图中增加图注或数据,通过设定vjust可以使数据显示在柱子上或立面。

ggplot(cabbage_exp,aes(x=interaction(Date, Cultivar),y=Weight))+geom_bar(stat="identity")+geom_text(aes(label=Weight), vjust=-0.2)#显示在上面
ggplot(cabbage_exp,aes(x=interaction(Date,Cultivar),y=Weight))+geom_bar(stat="identity") +geom_text(aes(label=Weight),vjust=1.5,colour="white")#显示在里面
  • 1
  • 2

图13显示在上面
显示在里面
暂时先介绍些基础,需要更多高级主题或例子,可以参考R数据可视化手册,或者多用help().

引言

ggplot2包的作图质量毋庸置疑,但是其作图语法对新手来说还是有点难度,ggplot2:数据分析与图形艺术这本书也介绍了ggplot2包的基本哲学思想和操作,个人感觉例子还不够丰富,所以对该包的用法还是停留在半瓶醋的水平。某天,突然发现一本ggplot2包的例子书,大喜,英文版名字为 R Graphics Cookbook,中文版叫做 R数据可视化手册,鉴于高昂的价格,我决定硬着头皮翻下英文版,顺便做点笔记,供自己或者各位朋友参考,英文水平不高,如有错误,莫怪。

基本操作

首先,我想介绍的是用ggplot2画直方图,基本用法如下:

install.packages('gcookbook')#R数据可视化手册书中的数据集
library(ggplot2)
library(gcookbook) 
ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity")
  • 1
  • 2
  • 3
  • 4
  • 5

直方图
ggplot()函数生成图层,aes()指定x和y轴变量,x一般为名义变量;geom_bar生成直方图图层。

如果x为连续变量或者数值变量,直方图会有点不同。如果是连续变量,直方图的横坐标会取连续变量最大值与最小值之间每一个数值;如果是数值变量,你得把数值变量转化成因子,例子见代码。

BOD#BBD数据集 Time变量不包含6这个数值
Time demand
1 8.3
2 10.3
3 19.0
4 16.0
5 15.6
7 19.8
ggplot(BOD, aes(x=Time, y=demand)) + geom_bar(stat="identity")#直接赋值,不做因子转化
ggplot(BOD, aes(x=factor(Time), y=demand)) + geom_bar(stat="identity")#变量进行因子转化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

图2
图3
直接把连续变量赋值给x和数值转为因子后给x的差异从图中就能很清楚的看出来。

调整颜色

直方图默认为黑灰色填充,我们可以对填充颜色和直方图边框颜色进行修改。

ggplot(pg_mean, aes(x=group, y=weight)) +
geom_bar(stat="identity", fill="lightblue", colour="black")
  • 1
  • 2

图4

分组直方图

有时候我们想对同一数据中的两类不同对象进行比较,我们可以使用分组直方图。我们使用cabbage_exp数据集,该数据集包含两类不同数据

cabbage_exp#数据集
Cultivar Date Weight
c39 d16 3.18
c39 d20 2.80
c39 d21 2.74
c52 d16 2.26
c52 d20 3.11
c52 d21 1.47
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+geom_bar(stat='identity',position="dodge")#identity意味着把y当做值去输入,如果改成bin,就会计算y出现的频数。dodge意味是各组是左右分布而不是上下重叠
ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+geom_bar(stat='identity')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

图5
图12上下重叠分组

制作频数直方图

频数直方图不需要指定变量y,而是根据变量x出现的频数自动生成。

ggplot(diamonds, aes(x=cut)) + geom_bar(stat="bin")#stat="bin"可有可无,该参数是默认的
  • 1

图6

给正值和负值直方图赋予不同颜色

csub <- subset(climate, Source=="Berkeley" & Year >= 1900)
csub$pos <- csub$Anomaly10y >= 0 #pos变量是个布尔变量,值为T or F
ggplot(csub, aes(x=Year, y=Anomaly10y, fill=pos)) +geom_bar(stat="identity", position="identity")#position="identity"是为了关闭负值直方图没有定义的警告
  • 1
  • 2
  • 3

图7

调整直方图柱子大小及宽度

直方图宽度调整用width函数,默认值为0.9。我们可以通过修改该值,使柱子变得更宽or更窄。

ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity", width=0.5)#窄柱子
ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity", width=0.5)#宽柱子
  • 1
  • 2

图8窄柱子
图9宽柱子
还有在分组直方图中,各组柱子之间是没有空隙的,如果要改变柱子之间距离,我们需要设置position=po
sition_dodge()。

ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +geom_bar(stat="identity", width=0.5, position=position_dodge(0.6))#值越大越离得远
  • 1

图10

图中增加数据

可以用geom_text()给直方图中增加图注或数据,通过设定vjust可以使数据显示在柱子上或立面。

ggplot(cabbage_exp,aes(x=interaction(Date, Cultivar),y=Weight))+geom_bar(stat="identity")+geom_text(aes(label=Weight), vjust=-0.2)#显示在上面
ggplot(cabbage_exp,aes(x=interaction(Date,Cultivar),y=Weight))+geom_bar(stat="identity") +geom_text(aes(label=Weight),vjust=1.5,colour="white")#显示在里面
  • 1
  • 2

图13显示在上面
显示在里面
暂时先介绍些基础,需要更多高级主题或例子,可以参考R数据可视化手册,或者多用help().

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多