目录
- 1. 基本分组条形图
- 2. 使柱子并排放置
- 3. 改变条形图配色
- 4. 使纵坐标呈现百分比
- 5. 删掉图例名称
1. 基本分组条形图
假设我们有如下数据,其大致结构如图。
dat = data.frame(专业=rep(c('统计','计算机'),each = 2),
语言 = rep(c('R','Python'),2),
比例 = c(0.8,0.2,0.1,0.9))
现在想以专业
为横坐标,比例
为纵坐标,语言
为组别(区分颜色),来绘制条形图。最基本的条形图格式如下:
library(ggplot2)
ggplot(dat,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',aes(fill = 语言))
这幅图存在的硬伤为:中文没有显示,通过改变字体来解决问题。
其他影响美观的问题有:
- 柱子太宽了(可以通过在
geom_bar
函数里设置width
参数解决); - 灰色背景和白色线条我不喜欢;
- 横纵坐标的数字太小了看不清楚。
对如上三个问题,也可以直接参考下面代码如法炮制:
ggplot(dat2,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',aes(fill = 语言),width = 0.9) +
theme(text=element_text(family="Songti SC",size=12,face = "bold"), #设置文字的字体字号(设置字体是为了确保汉字可以显示,字号和加粗请随意)
axis.text.x = element_text(size=10)) # 设置X轴文字大小
2. 使柱子并排放置
我觉得两种颜色的柱子叠在一起不够直观,于是将柱子并排放置。这是通过改变geom_bar
函数中的position
参数实现的。
ggplot(dat,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',aes(fill = 语言),position = position_dodge(0.9)) +#使柱子并排放置
theme_bw()+
theme(text=element_text(family="Songti SC",size=12,face = "bold"), #设置文字的字体字号(确保汉字可以显示)
axis.text.x = element_text(size=10))# 设置X轴文字大小
3. 改变条形图配色
ggplot2
的红配绿不得我心,希望自己换个颜色。这里面我们使用了scale_fill_manual
函数。
【注1】:请注意这个函数的名称,fill
指填充色(相对应的有color
指边框/线条色),manual
指手动设置。掌握了这种命名规则后,我们也可以在其他ggplot2
绘图中,用scale_color_manual
函数来改变默认的线条颜色。 【注2】:这里设置颜色时用到了十六进制颜色码,比如"#FBD84A"。如果图片没有明确颜色要求,当然可以直接设置’red’'gray’等等有名字的颜色;但是如果我们需要特定没有名字的颜色,可以直接使用十六进制颜色码。
ggplot(dat2,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',
aes(fill = 语言),
position = position_dodge(0.9)) +#使柱子并排放置
theme_bw()+
theme(text=element_text(family="Songti SC",size=12,face = "bold"), #设置文字的字体字号(确保汉字可以显示)
axis.text.x = element_text(size=10)) + # 设置X轴文字大小
scale_fill_manual(values=c("#FBD84A","#666666")) # 设置填充颜色
4. 使纵坐标呈现百分比
纵坐标的比例值,按照default是直接呈现小数的。为了使其直接表示比例,可以安装scales
包并加入scale_y_continuous(labels=percent)
library(scales)
ggplot(dat,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',aes(fill = 语言),position = position_dodge(0.9)) +#使柱子并排放置
theme_bw()+
theme(text=element_text(family="Songti SC",size=12,face = "bold"), #设置文字的字体字号(确保汉字可以显示)
axis.text.x = element_text(size=10)) + # 设置X轴文字大小
scale_fill_manual(values=c("#FBD84A","#666666"))+ # 设置填充颜色
scale_y_continuous(labels=percent) # 使纵坐标呈现百分比
【注】:如果有更好的方法欢迎讨论!
5. 删掉图例名称
最后just for fun,我们可以删掉图例的名称。请看最后一行代码。(应该还有其他方法,比如在theme
中直接设置blank之类的,但是我记不住了。欢迎补充!)
library(scales)
ggplot(dat,aes(x = 专业,y = 比例))+
geom_bar(stat = 'identity',aes(fill = 语言),position = position_dodge(0.9)) +#使柱子并排放置
theme_bw()+
theme(text=element_text(family="Songti SC",size=12,face = "bold"), #设置文字的字体字号(确保汉字可以显示)
axis.text.x = element_text(size=10)) + # 设置X轴文字大小
scale_fill_manual(values=c("#FBD84A","#666666"))+ # 设置填充颜色
scale_y_continuous(labels=percent) + # 使纵坐标呈现百分比
guides(fill = guide_legend(title = NULL)) # 删掉图例名称