Tao Yan
简介
条形图可以说是我们最常用的数据可视化方法了,通常用于展示不同分类条件下(在x轴上)某个数值型变量的取值(y轴上)。绘制条形图时需要特别注意的一个细节是条形图的条形高度有时表示的是数据集中变量的频数,有时表示的则是变量本身。本文将会介绍这两类条形图的绘图技巧。
绘制条形图
使用ggplot()
函数与geom_bar(stat="identity")
,绘制条形图,我们将利用gcookbook包中的数据进行绘制。
#没安装包要先安装包gcookbook、ggplot2以及dplyr
library(gcookbook)#加载gcookbook以使用其包含的数据
library(ggplot2)#用于可视化
library(dplyr)#用于数据处理
这里我们调用**gcookbook**里的数据集绘制条形图
head(pg_mean)#查看数据集
## group weigh
1 ctrl 5.032
2 trt1 4.661
3 trt2 5.526
ggplot(data=pg_mean, aes(x=group, y=weight))+#将group、weight分别赋值给x、y轴
geom_bar(stat = "identity")#必须将geom_bar()中的stat(统计变换)参数设置
为”identity“,即对原始数据集不作任何统计变换,而该参数的默认值为'count',即观测数量。
当x是连续型(数值型)变量时,条形图略有不同,需要略作调整,具体如下:
str(BOD)#查看BOD数据集可以发现Time变量是数值型
## 'data.frame': 6 obs. of 2 variables:
## $ Time : num 1 2 3 4 5 7
## $ demand: num 8.3 10.3 19 16 15.6 19.8
## - attr(*, "reference")= chr "A1.4, p. 270"
ggplot(data=BOD, aes(x=Time, y=demand))+ geom_bar(stat = "identity")#此时Time是数值型
ggplot(data=BOD, aes(x=factor(Time), y=demand))+
geom_bar(stat = "identity")#将Time转换为因子型(分类/离散变量),仔细比较两图
条形图颜色有两部分:填充颜色(fill)以及边框颜色(color),因此调整条形图颜色要调两部分,具体如下:
ggplot(data=BOD, aes(x=factor(Time), y=demand))+
geom_bar(stat = "identity", fill="blue", color="black")#可以自己设定喜好的颜色
绘制簇状条形图
方法:将分类变量映射到fill参数,运用geom_bar(position="dodge")
绘制,具体如下:
head(cabbage_exp)#查看数据,发现含有两个分类变量:`Cultivar`和`Date`以及一个连续型变量Weight
## Cultivar Date Weight sd n se
## 1 c39 d16 3.18 0.9566144 10 0.30250803
## 2 c39 d20 2.80 0.2788867 10 0.08819171
## 3 c39 d21 2.74 0.9834181 10 0.31098410
## 4 c52 d16 2.26 0.4452215 10 0.14079141
## 5 c52 d20 3.11 0.7908505 10 0.25008887
## 6 c52 d21 1.47 0.2110819 10 0.06674995
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+#分别将Date与Cultivar映射给x和fill
geom_bar(stat = "identity", position = "dodge")#position = "dodge"表示条形图分开不重叠(簇形图),默认的为stack(堆叠式),还有百分比堆叠式(fill)
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat = "identity", position = "stack")#堆叠式
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat = "identity", position = "fill")#百分比堆叠式
设置颜色或者调用调色板
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat = "identity", position = "dodge", color="black")+
scale_fill_brewer(palette = "Set1")#Set1为调色板,后期将会专门讲解Color设置
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat = "identity", position = "dodge", color="black")+
scale_fill_manual(values = c("darkred", "purple"))#自设置颜色
绘制频数条形图
head(diamonds,n=10)#查看前10行数据
## # A tibble: 10 × 10
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
## 4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
## 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
## 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
## 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
## 10 0.23 Very Good H VS1 59.4 61 338 4.00 4.05 2.39
ggplot(diamonds, aes(x=cut))+#此时不要映射任何变量到y
geom_bar()#等价于geom_bar(stat="bin")
绘制y轴正负轴都有数据的条形图
#首先先创建一下数据集
set.seed(1111)#此命令保证数据结果可以重现在任何电脑上
x <- 1980+1:36#赋值x
y <- round(100*rnorm(36))#赋值y
mydata <- data.frame(x=x, y=y)#创建数据集mydata
head(mydata)#查看数据集
## x y
## 1 1981 -9
## 2 1982 132
## 3 1983 64
## 4 1984 117
## 5 1985 12
## 6 1986 -293
mydata <- mydata%>%#%>%管道操作,结合dplyr为数据处理神器
mutate(judge=ifelse(y>=0,"Yes", "No"))#创建judge变量,将y正负分类
head(mydata)#查看数据
## x y judge
## 1 1981 -9 No
## 2 1982 132 Yes
## 3 1983 64 Yes
## 4 1984 117 Yes
## 5 1985 12 Yes
## 6 1986 -293 No
#接下来绘制条形图
ggplot(data=mydata, aes(x=x, y=y, fill=judge))+
geom_bar(stat = "identity",position = "identity")+#这里position="identity"可以避免系统对负值绘制条形图发出警告信息
scale_fill_manual(values = c("purple", "blue"), guide=FALSE)+xlab("Year")#guide=FALSE表示不要图例,x轴标题为Year
通过width来调整条形宽度以及条形距离
head(diamonds)
## # A tibble: 6 × 10
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
## 4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
ggplot(data=diamonds, aes(x=color, y=price, fill=cut))+
geom_bar(stat = "identity", width = 0.6, position = position_dodge(0.8))+#调整条形宽度以及条形距离
scale_fill_brewer(palette = "Set1")
geom_text()
添加数据标签
使用geom_text()
为条形图添加标签,需要分别指定一个变量映射给x、y以及标签(label),vjust
和hjust
分别调整标签的竖直和水平位置。
#标签在条形图顶端下方
ggplot(data=cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight))+
geom_bar(stat = "identity")+
geom_text(aes(label=Weight), vjust=1.5, color="white")
#标签在条形图顶端上方
ggplot(data=cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight))+
geom_bar(stat = "identity")+
geom_text(aes(label=Weight), vjust=-0.3, color="red")#可以通过color、size等自行调整标签属性
#堆叠图也一样
ggplot(data=cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+
geom_bar(stat="identity", position = "stack")+
geom_text(aes(label=Weight), size=5, color="black", vjust=3.5, hjust=0.5,
position = position_stack())#这里的position要与geom_bar()里面的保持一致,各种参数多调整才能效果最佳
下次将重点讲解如何添加误差棒、显著性标记、坐标轴标题、图标题以及部分小技巧等等