基础知识 | R语言绘图基础之柱形图
R语言绘图基础之简单柱形图
在视觉性吸引方面,人类绝对是动物界的另类。当一张一张数据分析的统计表摆在眼前时,人们并不能快速的洞察其中的关系。然而,当一张张精心绘制图形展现零散数据时,往往会让人兴致盎然,阔然开朗,并能够快速的从视觉角度呈现洞察关系,作出非常有意义的比较。
01
创建数据框
#mydata数据框的创建,创建方式见往期文章基础知识 | R语言数据管理之变量创建。
#此处直接从mydata中提取子集,提取方式详见往期文章基础知识 | R语言数据管理之数据集取子集。
newdata<-c("City","Age")
mydata1<-mydata[newdata]
mydata1
City Age
1 福州 18
2 厦门 50
3 泉州 26
4 龙岩 25
5 漳州 48
6 三明 35
02
单数据系列柱形图的绘制
#柱形图的绘制采用ggplot2函数进行。
library(ggplot2)
ggplot(data=mydata1,aes(City,Age))+geom_bar(stat="identity",
width=0.8,colour="black",size=0.25,fill="green",alpha=0.8)
图1 单数据系列柱形图
我们可以看到,图1的视觉效果并不是很好,如何使得图片的Y轴柱形图的高度从左到右是依次降低的呢?一般来说,X轴的数据可以分为数值型、序列型和类别型,图1的X轴很明显属于类别型,根据城市类别进行分类的。Y轴变量通常都是数值型的。如X轴的数据类型属于类别型,一般需要对数据进行降序处理,再展示图表。通常来说,用ggplot2绘图时,默认X轴类别按照字母顺序排列,比如图1 X轴顺序,按照城市首字母进行排序。这主要是因为ggplot2是根据因子向量的水平按顺序展示的,而不是根据X轴的因子向量顺序排列,因子向量叫做factor,水平向量为level。
⚠️要实现X轴变量的降序,需要改变因子向量的水平顺序,一定要对表格或者因子向量排序后,再改变其水平顺序,才能使得X轴的类别顺序能够匹配Y轴变量的降序呈现。如果仅仅通过一条语句是无法到达效果的:
mydata1<-dplyr::arrange(mydata1,desc(TRUE))
#必须进行如下操作才能实现:
order<-sort(mydata1$Age,index.return=TRUE,decreasing=TRUE)
order
#根据Age进行排序。
mydata1$City<-factor(mydata1$City,levels=mydata1$City[order$ix])
#根据“Age”的排序结果设定因子向量的水平顺序。
ggplot(data=mydata1,aes(City,Age))+geom_bar(stat="identity",
width=0.8,colour="black",size=0.25,fill="pink",alpha=1)
图2 降序处理的单数据柱形图
03
多数据系列柱形图
#创建多数据列表
newdata<-c("Gender","City","Age")
mydata1<-mydata[newdata]
mydata1
Gender City Age
1 M 福州 18
2 F 厦门 25
3 F 泉州 26
4 M 龙岩 35
5 F 漳州 48
6 M 三明 50
order<-sort(mydata1$Age,index.return=TRUE,decreasing=TRUE)
#根据Age进行排序
mydata1$City<-factor(mydata1$City,levels=mydata$City[order$ix])
#根据“Age”的排序结果设定因子向量的水平顺序
ggplot(data=mydata1,aes(City,Age,fill=Gender))+
geom_bar(stat="identity",position=position_dodge(),
width=0.8,colour="black",size=0.25)
小结
geom_bar():ggplot2中绘制柱形图的函数
identity:表position不做位置调整。
position=position_dodge():柱形并排展示
width:表示柱形的宽度,范围是(0,1)
alpha:表示透明度。
- javascript 红皮高程(21)-- 乘性操作符
- javascript 红皮高程(20)-- 逻辑或
- javascript 红皮高程(19)-- 逻辑与
- 技术分享 | 浅谈 RAS
- Sniper-OJ 练习平台多题WriteUp
- 怎么能学透一个知识点
- Jarvis-OJ平台多题WriteUp分享
- 会员提问 之 JS中的私有方法有什么意义?
- 本周末的QQ群视频--还是电商网站的事
- 【译】使用Apache的mod重写来保护你的C2 Empire
- 大白话,设计一个购物车对象
- 【译】Cromos – 下载并注入代码到谷歌 Chrome 浏览器扩展中
- X-NUCA 2017第三期 WriteUp
- 学习分享 | Flipped Ciphertext Bits
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 剑指Offer第2题详解(附Python、Java代码实现)
- 剑指Offer第3题详解(附Java、Python源码)
- 从String中移除空白字符的多种方式!?差别竟然这么大!
- Stack.peek() 与 Stack.pop() 的区别
- 傅里叶变换有什么用?
- 剑指Offer第4题详解(附Java、Python源码)
- 帅地问我:Dubbo服务调用过程
- 用两个栈实现队列详解(附Java、Python源码)——《剑指Offer》
- PS2020制作电子签名
- 原创 | 险些翻车,差一点没做出来的基础算法题
- 原创 | 你追我,如果你追到我……那就算你赢了
- 原创 | 详解gitignore的使用方法,让你尽情使用git add .
- 第31天:面试比 KMP 还容易被问到的匹配算法!
- 原创 | 深度学习开篇,来聊聊感知机的原理
- 算法题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字