绘制单组和多组柱状图

 No one knows everything, and you don't have to.”   --free傻孩子
"R数据分析"专题·第6篇
  编辑 | free傻孩子
  4445字 | 7分钟阅读
本期推送内容
在数据分析中最常见的一种图形类型是柱状图,尤其是单组的简单柱状图。但是,在使用常规绘图软件画图时经常需要先对绘图的数据进行预处理,如计算平均值、计算标准差等;之后,才能使用这些处理后的数据进行画图。数据规模较小时,数据预处理所花费的时间成本比较小,但是当数据规模较大时,则时间成本将较高。本节为大家介绍一种不需要对原始数据处理,直接使用原始数据绘制柱状图的方法。
01

单组柱状图

载入需要的安装包和案例数据

library(export)
library(tidyverse)
data("mtcars")
names(mtcars)

本节我们使用mpg(英里/加仑)作为y轴,cyl(气缸数量)作为x轴;通过str(mtcars)这一代码,我们能够得知无论是y轴还是x轴,其向量类型都是数值型。因为柱状图中x轴的数据通常是字符型变量,所以我们把x轴转变为了字符型变量。

代码如下:

mtcars %>%
  mutate(cyl2 = as.character(cyl)) -> mtcars2

绘图之前,首先我们设置一下绘图的各个细节,如字体大小、背景等等参数。

代码如下:

main_theme = theme(panel.background=element_blank(),
                   panel.grid=element_blank(),
                   axis.line.x=element_line(size=0.5, colour="NA"),
                   axis.line.y=element_line(size=0.5, colour="NA"),
                   axis.ticks=element_line(color="black"),
                   axis.text=element_text(color="black", size=12),
                   legend.position="right",
                   legend.background=element_blank(),
                   legend.key=element_blank(),
                   legend.text= element_text(size=12),
                   text=element_text(family="sans", size=12))

展示一下原始数据格式方便大家绘图,格式如下:

绘图

ggplot(mtcars2,aes(x= cyl2,y=mpg))+
     stat_summary(aes(fill = cyl2),fun = mean,geom = "bar",width = 0.4)+
     stat_summary(fun.data = mean_sdl,geom = "errorbar",
                  width = 0.1, size = 0.25)+
     labs(x=" Cyl (Number of cylinders)",
          y = "Mpg (Miles/(US) gallon)")+
     theme_bw()+
     main_theme

出图如下

代码详解:ggplot必须包含数据data,映射aes(); x定义x轴;y定义y轴,fill定义柱状图的颜色类型;stat_ summary(); 该函数是本节推荐的核心内容,它能够根据给定的代码对数据进行处理;例如fun= mean,意思是根据x轴分组,对y轴数据取平均值;geom是定义绘图数据类型的函数,geom=“bar”意思是绘制柱状图,还可以是“point”(点)、“pointrange”(点范围)、“line”(线)、“errorbar”(误差线)等;width是定义柱子粗细的函数,size是定义线粗细的函数。

导出图片:

graph2ppt(file = "bar",width = 6, height = 4.5, append = TRUE)
02

分组柱状图

library(tidyverse)
library(MASS)#为了使用这个包里面的数据所以才加载的

使用states模拟存在多组情况的数据

states <- data.frame(state.region, state.x77)
states %>%
  mutate(group = if_else(Illiteracy <1, "low",
                         if_else(Illiteracy >2, "high", "medium"))) %>%
  dplyr::select(state.region,Income,group) %>%
  filter(state.region=="South"|state.region=="West") ->states2
#如果是自己的数据,上面这些代码是不需要运行的。
#以上代码的目的是收集和整理原始数据。

states2是存在两个分组的原始数据,组1为state.region;组2为group。原始数据格式如下:

对数据进行处理(分组柱状图需要对数据变形):

states2_melt <- reshape2::melt(states2, id.vars = c("state.region","group"))

变形后的绘图数据如下:

绘图

ggplot(states2_melt, aes(x = group, y = value, group = state.region))+
  stat_summary(aes(fill = state.region),fun = mean,
               geom = "bar",width = 0.42,
               position=position_dodge(0.45))+
  stat_summary(fun.data = mean_sdl,size = 0.25,
               geom = "errorbar",width = 0.15,
               position=position_dodge(0.45))+
  theme_bw()+
  main_theme

出图如下

注意:分组柱状图需要在ggplot 的映射信息中给出分组信息,如本示例中的“group = state.region”

导出图片:

graph2ppt(file = "bar",width = 6, height = 4.5, append = TRUE)

注:若有任何问题可以进入我们的群讨论如下:

(0)

相关推荐