热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

第三篇:R语言数据可视化之条形图

条形图简介数据可视化中,最常用的图非条形图莫属,它主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值。其中有两点要重点注意:1.条形图横轴上的数据是离散而

条形图简介

        数据可视化中,最常用的图非条形图莫属,它主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值。其中有两点要重点注意:

        1. 条形图横轴上的数据是离散而非连续的。比如想展示两商品的价格随时间变化的走势,则不能用条形图,因为时间变量是连续的;

        2. 有时条形图的值表示数值本身,但也有时是表示数据集中的频数,不要引起混淆;

绘制基本条形图

        本例选用测试数据集如下:

        绘制方法是首先调用ggplot函数选定数据集,并在aes参数中指明横轴纵轴。然后调用条形图函数geom_bar(stat="identity")便可绘制出基本条形图。其中stat="identity"表明取用样本点对应纵轴值,R语言实现代码如下:

# 基函数:aes绑定条形图横轴纵轴
ggplot(pg_mean, aes(x = group, y = weight)) +
# 条形图函数:stat表明取用样本点对应纵轴值
geom_bar(stat = "identity")

        运行效果:

        如果觉得灰色调比较难看,可以在条形图函数中指定条形图需要填充的颜色以及条形图的边框颜色。R语言实现代码如下:

# 基函数
ggplot(pg_mean, aes(x = group, y = weight)) +
# 条形图函数:fill设置条形图填充色,colour设置条形图边界颜色
geom_bar(stat = "identity", fill = "lightblue", colour = "black")

        运行效果:

        要强调的是如果横轴对应数据非离散型,则须先将其转为因子类型,否则结果会出现"空条"。

绘制(簇状)条形图

        本例选用测试集如下:

        绘制方法是在条形图函数中设置fill参数,将数据集中表示分类的列赋值给它。R语言实现代码如下:

# 基函数:fill绑定"美学特征"
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) +
# 条形图函数:position设置条形图类型为簇状
geom_bar(position = "dodge", stat = "identity")

        运行效果:

        可使用填充标尺函数scale_fill_brewer(palette)重新选择配色,并为条状加上黑色边框。R语言实现代码如下:

# 基函数
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) +
# 条形图函数
geom_bar(position = "dodge", stat = "identity", colour = "black") +
# 调色标尺:设置调色板为Pastel1
scale_fill_brewer(palette="Pastel1")

        运行效果:

绘制频数条形图

        选用测试数据集如下:

        本例需要展示的是不同cut类型变量的样本个数,要实现这点关键在于将stat参数设置为bin。之前将stat设置为identity是直接展示样本点绑定的纵轴值,而设置为bin则会统计样本点落到横轴上各离散值的个数,这种情况下ggplot的aes参数只需绑定横轴。R语言实现代码如下:

# 基函数
ggplot(diamonds, aes(x = cut)) +
# 条形图函数:stat参数默认为bin
geom_bar(fill = "lightblue", colour = "black")

        执行效果:

        如果横轴是连续变量,那么这张图就会变成直方图。和将来要讲的geom_histogram()函数效果是一样的。

对正负条形图分别着色

        本例测试数据集如下:

        如若现在需要绘制出数据集中Anomaly10y列随时间的变化,同时可视化方面要求做到小于0的用蓝色表示,大于0的用红色表示。

        对于这种情况可为数据集创建一个辅助列pos,该列为布尔类型:TRUE表示Anomaly10y属性大于0,而FALSE表示Anomaly10y列小于0。之后原数据集便多了一个pos列,表征Anomaly10y列值大于等于/小于0。然后将这个字段fiil到ggplot函数,再调用标尺函数对配色进行自定义并令guide=FALSE取消图例。R语言实现代码如下:

# 增加辅助列,表示当前记录Anomaly10y值大于/小于0。
csub$pos = csub$Anomaly10y >= 0

# 基函数
ggplot(csub, aes(x = Year, y = Anomaly10y, fill = pos)) +
# 条形图函数:position设置为"identity"是为了避免系统因绘制负值条形而引发的警告
geom_bar(stat = "identity", position = "identity", colour = "black", size = 0.1) +
# 手动调色标尺:大于0为红,小于0为蓝
scale_fill_manual(values = c("#CCEEFF", "#FFDDDD"), guide = FALSE)

        运行效果:

绘制(百分比)堆积型条形图

        本例测试数据集如下:

        使用ggplot2绘制条形图时,只要不修改geom_bar()函数的position参数,所得条形图便为堆积型。但堆积条形图纵轴大都采用百分比形式,故在具体绘制前,需要对原数据集进行预处理,将纵轴数据转换为分类百分比格式。

        本例要统计c39和c52两个品种在不同日期下的重量对比,则需首先将各记录的Weight值除以该记录所在类目的Weight和,然后再将新的百分比列绑定到纵轴。R语言实现代码如下:

# 计算Weight列的分类百分比列
library(plyr)
ce = ddply(cabbage_exp, "Date", transform, percent_weight = Weight / sum(Weight) * 100)

# 基函数
ggplot(ce, aes(x = Date, y = percent_weight, fill = Cultivar)) +
# 条形图函数:未将position参数显示设置为dodge,则绘制出的条形图为堆积型
geom_bar(stat = "identity", colour = "black") +
# 调色标尺
scale_fill_brewer(palette = "Pastel1")

        运行效果:

添加数据标签

        本例测试数据集如下:

        为了给条形图添加标签显示纵轴值,关键在于gemo_text()函数。使用这个函数时,需要在它的aes参数里绑定各样本的横纵坐标,以及要展示的值。

        下面首先来展示不同Cultivar分类在不同日期下Weight的对比簇状条形图。R语言实现代码如下:

# 基函数
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) +
# 条形图函数
geom_bar(stat = "identity", position = "dodge") +
# 标签函数:label设置展示标签,vjust设置标签偏移(正上负下),position设置各标签的间距
geom_text(aes(label = Weight), vjust = 1.5, colour = "white", position = position_dodge(.9), size = 5)

        运行结果:

        特别要注意的是geom_text()函数的position参数,绘制簇状图必须通过该参数指定各标签的间距。否则一个簇的所有标签都会堆到同一横轴坐标上,像下面这样:

        如果要在堆积状的条形图上打标签,则稍微复杂一点。因为要对每组数据进行求和及居中化处理,才能更好的展示出结果。其中关键点在于使用ggplot库提供的ddply方法对分组变量进行汇总求和。具体R语言实现代码如下:

# 根据日期和性别对数据进行排序
ce = arrange(cabbage_exp, Date, Cultivar)
# 对不同Date分组内的数据进行累加求和
ce = ddply(ce, "Date", transform, label_y = cumsum(Weight) - 0.5*Weight)

# 基函数
ggplot(ce, aes(x = Date, y = Weight, fill = Cultivar)) +
# 条形图函数
geom_bar(stat = "identity", colour = "black") +
# 标签函数:paste和format方法对标签进行格式化
geom_text(aes(y=label_y, label = paste(format(Weight, nsmall=2), "kg")), size = 4) +
# 图例函数:反转图例
guides(fill = guide_legend(reverse = TRUE)) +
# 调色标尺
scale_fill_brewer(palette = "Pastel1")

        运行结果:

 


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍 GBase ADO.NET 中 FillSchema 方法的多个重载函数,该方法用于填充 DataSet 或 DataTable 的架构,并根据指定的 SchemaType 配置架构。通过这些重载函数,开发人员可以灵活地控制数据架构的生成方式。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入解析 HDFS Federation:多命名空间架构详解
    HDFS Federation 是一种扩展 HDFS 架构的方式,通过引入多个独立的 NameNode 来解决单点故障和性能瓶颈问题。本文将详细探讨 HDFS Federation 的工作原理、优势以及潜在挑战。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • IT项目管理过程中的方法、工具、技术
    工欲善其事,必先利其器。而对于一个软件开发项目,最重要的器就是方法,工具和技术。而这三要素中重要的又是方法论,方法是基础&# ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
author-avatar
刻骨铭心2502914183_610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有