首页 > 科研绘图 > 这些条形图的用法您都知道吗?
2022
08-21

这些条形图的用法您都知道吗?

前言

条形图专用于离散变量和数值变量之间的可视化展现,其通过柱子的高低,直观地比较离散变量各水平之间的差异,它被广泛地应用于工业界和学术界。在R语言的ggplot2包中,读者可以借助于geom_bar函数轻松地绘制条形图。对于条形图大家对其的印象是什么呢?又见过哪些种类的条形图呢?在本篇文章我将带着各位网友说道说道有关条形图的哪些品种。

ggplot2的语法讲解

如果读者对R语言比较熟悉,一定听过或使用过ggplot2的绘图体系了。通常,在使用geom_*簇函数绘制几何图形之前,都会添加ggplot函数生成图形对象,它们的组合形式如下:

ggplot(…) + geom_*(…) + geom_*(…) + …

在如上的语法格式中,有两点需要说明,一方面,在ggplot2绘图过程中均采用图层思想,将多个图形进行叠加和设置;另一方面,图层思想是通过代码中的加号(+)表现出来的。

条形图函数geom_bar的讲解

在了解了绘图语法后,首先介绍ggplot函数与geom_bar函数的用法及参数含义,具体如下:

# 使用ggplot函数初始化一个图形对象

ggplot(data = NULL, mapping = aes())data:指定绘图所需的原始数据,如果不指定,则必须在geom_*函数中指定;mapping:通过aes的方式指定图形的属性(如x轴的变量,y轴的变量,颜色变量、形状变量、填充色变量等);

# 绘制条形图的函数

geom_bar(mapping = NULL, data = NULL, stat = "count", position = "stack", ..., width = NULL, binwidth = NULL, na.rm = FALSE,show.legend = NA, inherit.aes = TRUE)mapping:通过aes的方式指定图形的属性(如轴信息、边框色、填充色等),但要求属性值来自于原始的绘图数据data;data:指定绘图所需的原始数据,如果使用默认的 NULL值,则图形数据将来自于ggplot函数;如果指定一个明确的数据框,则该数据框将覆盖ggplot函数所指定的数据框;stat:借助于该参数控制绘图数据的统计变换,默认为 'count',表示计数(前提是绘图数据为明细数据);如果指定为 'identity',表示直接使用原始数据绘制y轴(前提是绘图数据已做了统计汇总);position:用于设置条形图的摆放位置,默认为 'stack',表示绘制堆叠条形图;如果指定为 'dodge',表示绘制水平交错条形图;如果为 'fill',表示绘制百分比堆叠条形图;

...:用于设置条形图的其他属性信息,如统一的边框色、填充色、透明度等;width:用于设置条形图的宽度,默认为 0.9的比例;binwidth:该参数在条形图中已不再使用,但可以使用在绘制直方图的geom_histogram函数中;na.rm:bool类型的参数,在剔除绘图数据中的缺失值时,是否不返回警告信息,默认为 FALSE;show.legend:bool类型的参数,是否显示条形图的图例信息,默认为 NA,即表示显示图例;如果设置为 FALSE,则不显示任何图例;如果设置为 TRUE,则显示图例;inherit.aes:bool类型的参数,绘图时是否延用ggplot函数中的数据和轴属性,默认为 TRUE;根据作者的经验,如果ggplot函数中的数据与geom_*函数中的数据存在冲突时,可以将该参数设置为 FALSE

为使读者进一步理解和掌握上面所介绍的函数,接下来利用如上的geom_bar绘制几种常见的条形图。

单离散单数值变量的条形图 # 加载第三方包

library(ggplot2)

library(gridExtra)

# 已汇总数据--单离散变量条形图的绘制

df <- data.frame(Province = c( '北京', '上海', '天津', '重庆'), GDP = c( 28000, 30133, 18595, 19530))

# 绘制无序的条形图

p1 <- ggplot(data = df, # 指定绘图数据# 指定x轴和y轴的变量mapping = aes(x = Province, y = GDP)) + # 绘制条形图geom_bar(stat = 'identity', # y轴数据直接来自于原始数据框color = 'black', # 边框色为黑色fill = 'steelblue'# 填充色为铁蓝色) + # 删除x轴的标题labs(x = '') # 绘制有序的条形图

p2 <- ggplot(data = df, # 要求x轴的省份按GDP的大小降序排序mapping = aes(x = reorder(Province, -GDP), y = GDP)) + geom_bar(stat = 'identity', color = 'black', fill = 'steelblue') + labs(x = '') + # 添加数值标签geom_text(mapping = aes(x = Province, y = GDP, label = GDP, vjust = - 0.2)) + # 添加水平参考线geom_hline(yintercept = mean(df$GDP), color = 'red', lty = 'dashed')

# 合并p1和p2两幅图

grid.arrange(p1, p2, ncol = 2)

如上图所示,使用grid.arrange函数将两张图组合在一个图框内,其中左图是使用geom_bar函数直接生成的原始图形,右图则是在左图的基础上添加了三项功能,分别是条形图的排序(代码中reorder函数实现重排序)、数值标签的添加(代码中的geom_text函数)以及平均水平参考线的添加(代码中的geom_hline)。

在实际应用中,对于单离散变量和单数值变量的条形图,右图会更加受欢迎,因为它更加直观(借助于排序可以迅速地发现柱子的最高、最低及差异;借助于数值标签可以明确地得知各离散水平下的具体值;借助于参考线可以比较哪些水平值高于平均水平,哪些则低于平均水平,进而形成整体对比)。

如果绘图数据涉及的是双离散变量单数值变量或者双数值变量单离散变量时,也可以借助于geom_bar函数绘制堆叠条形图、百分比堆叠条形图、交错条形图和对比条形图。

双离散单数值的堆叠条形图 # 加载第三方包

library(readxl)

# 读取外部数据 -- weather2017.xlsx(上海2017年天气数据)

weather2017 <- read_excel(path = file.choose())

# 明细数据--双离散单数值变量的堆叠条形图

ggplot(data = weather2017, mapping = aes(x = aqiInfo, fill = fengli) # 指定x轴变量和填充色变量) + geom_bar(stat = 'count'# 需对明细数据中的离散变量作频数统计) + labs(x = '')

如上图所示,可以查看组间的绝对值差异以及组内的分布特征(如2017上海天气质量为良好等级的天数最多,其次是优等级,重度污染等级的天数最少;但不管哪种空气质量等级下,1~2级的风力天数是最多的)。然而,在实际的企业环境中,这样的图形出现的频次并不是很高,因为绝对数量的堆叠条形图并不能够达到刺激效果。读者不妨使用下面介绍的百分比堆叠条形图。

双离散单数值的百分比堆叠条形图 # 明细数据--双离散单数值变量的百分比堆叠条形图

ggplot(data = weather2017, mapping = aes(x = aqiInfo, fill = fengli)) + geom_bar(stat = 'count', position = 'fill'# 条形图的摆放位置设置为百分比堆叠) + labs(x = '', y = 'Rate')

如上图所示,通过该图形可以查看内部的比例差异和趋势(如空气质量为优、良和轻度污染的等级下,1~2级风力的天数占比并没有较大的差异,均在70%左右;对于中度污染等级而言,风力1~2级和4~5级的天数各占一半)。所以,比例问题或差异问题才是企业更关注的数据点。堆叠条形图也有弊端,那就是只能够解决可叠加问题的可视化,假设数值型指标不能够叠加(如平均薪资、渗透率等指标是不能相加的),就不可以使用该类图形,但不妨可以试试水平交错条形图。

双离散单数值的交错条形图 # 明细数据--双离散变量单数值变量的交错条形图

ggplot(data = weather2017, mapping = aes(x = aqiInfo, fill = fengli)) + geom_bar(stat = 'count', position = 'dodge'# 条形图的摆放位置设置为水平交错) + labs(x = '')

如上图所示,该图形的最大的好处是既可以实现数据的组内比较(如相同空气质量等级下不同风力的比较),也可以实现数据的组间比较(如相同风力下不同空气质量的比较)。

各位读者是否发现一个规律,前面介绍的4中条形图都有一个共同特点,那就是数值型变量只有一个。对于数值型变量有两个,离散型变量有一个的数据该如何绘制条形图呢(如常见的环比、同比问题),这里提供一个解决思路,那就是使用对比条形图

双数值单离散的对比条形图 # 构造绘图数据

name <- c( '张三', '李四', '王二', '赵五', '丁一')sales <- c( 230, 452, 128, 337, 278)target <- c( 200, 480, 150, 350, 250)sales_data <- data.frame(name, sales, target)

# 根据sales_data数据集,衍生出是否完成目标的变量is_done

sales_data <- transform(sales_data, is_done = ifelse(sales >= target, 1, 0))

# 已汇总数据 -- 单离散变量双数值型变量的比较条形图

ggplot(data = sales_data, mapping = aes(x = name, y = target)) + geom_bar(stat = 'identity', color = 'gray', alpha = 0.5) + geom_bar(data = sales_data, mapping = aes(x = name, y = sales, fill = factor(is_done)), width = 0.6, stat = 'identity') + # 修改图例值scale_fill_discrete(name = '', breaks = c( 0, 1), labels = c( '未达标', '达标')) + labs(x = '', y = 'Sales')

浅色且较宽的条形图可以用作参考对象(如数据中的目标销售额),深色且较窄的条形图可以用作比较对象(如数据中的实际销售额)。通过这种图形,就能够一眼发现参考对象与比较对象之间的差异。

结语

OK,有关条形图的5种变形就分享到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步

本文中的代码和数据可以从百度云盘中下载,只需关注“数据分析1480”公众号,并回复“条形图”即可。



最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情