目录

  • 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))

R语言 荆状图 r语言ggplot条形图_统计学


现在想以专业为横坐标,比例为纵坐标,语言为组别(区分颜色),来绘制条形图。最基本的条形图格式如下:

library(ggplot2)
ggplot(dat,aes(x = 专业,y = 比例))+
  geom_bar(stat = 'identity',aes(fill = 语言))

R语言 荆状图 r语言ggplot条形图_数据可视化_02


这幅图存在的硬伤为:中文没有显示,通过改变字体来解决问题。

其他影响美观的问题有:

  1. 柱子太宽了(可以通过在geom_bar函数里设置width参数解决);
  2. 灰色背景和白色线条我不喜欢;
  3. 横纵坐标的数字太小了看不清楚。

对如上三个问题,也可以直接参考下面代码如法炮制:

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轴文字大小

R语言 荆状图 r语言ggplot条形图_r语言_03

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"))  # 设置填充颜色

R语言 荆状图 r语言ggplot条形图_数据可视化_04

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) # 使纵坐标呈现百分比

R语言 荆状图 r语言ggplot条形图_R语言 荆状图_05


【注】:如果有更好的方法欢迎讨论!

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)) # 删掉图例名称

R语言 荆状图 r语言ggplot条形图_r语言_06