ggplot2饼图和图注顺序不一致如何解决
时间:2022-07-22
本文章向大家介绍ggplot2饼图和图注顺序不一致如何解决,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
不知道大家用ggplot2绘制饼图的时候有没有遇到过饼图上展示的顺序和图注上展示的顺序不一致的情况。今天小编就来跟大家一起来探讨一下这个问题。
首先我们来构建这样一个数据框,里面包含7种水果和相应的数目。
data=data.frame(name=c("apple","pear","orange","banana","grape","peach","cherry"),
num=c(10,5,9,3,7,5,8)
)
输出来是这样的
> data
name num
1 apple 10
2 pear 5
3 orange 9
4 banana 3
5 grape 7
6 peach 5
7 cherry 8
接下来我们用R里面的dplyr这个包来简单的处理一下数据,我们来算一下每种水果所占的百分比
library(dplyr)
data=data %>% mutate(prop=round(num/sum(num),2))
这时候数据就变成了
> data
name num prop
1 apple 10 0.21
2 pear 5 0.11
3 orange 9 0.19
4 banana 3 0.06
5 grape 7 0.15
6 peach 5 0.11
7 cherry 8 0.17
接下来用ggplot2来绘制饼图
library(ggplot2)
pie=ggplot(data, aes(x="", y=prop, fill=name)) +
geom_bar(stat="identity", width=1, color="white")
pie + coord_polar("y", start=0) + theme_void()+
geom_text(aes(x=1.6,label = paste0(prop*100, "%")),
position = position_stack(vjust = 0.5))+
geom_text(aes(label = num),
position = position_stack(vjust = 0.5))+
scale_fill_discrete(name="fruite distribution",
labels=sprintf("%s %d",data$name, data$num))+
ggtitle("fruite distribution")+
theme(plot.title = element_text(hjust = 0.5))
你会得到这样一张图,图注上的顺序以及数字跟data里面的一致,但是饼图上的顺序和数字却不太对劲。
问题其实出在name的levels上,饼图默认会根据name的levels来按逆时针绘制。我们从堆积柱形图上可以发现,程序会默认按字母顺序来对name进行排序,这也是因子levels的默认排序方法。
所以这样得到的饼图的顺序实际上是apple,banana,cherry......而图注的顺序跟name本身的顺序一致为apple,pear,orange......
查看data$name你就会发现其中的玄机
> data$name
[1] apple pear orange banana grape peach cherry
Levels: apple banana cherry grape orange peach pear
那么针对这个问题,我们有两种解决方案
1. 修改name的levels,使其跟图注中的顺序一致
library(dplyr)
data=data.frame(name=c("apple","pear","orange","banana","grape","peach","cherry"),
num=c(10,5,9,3,7,5,8)
)
#重新构建一列叫type,指定levels跟name的顺序一致
data=data %>% mutate(prop=round(num/sum(num),2)) %>%
mutate(type=factor(name,levels=name))
library(ggplot2)
#画图的时候fill用type
pie=ggplot(data, aes(x="", y=prop, fill=type)) +
geom_bar(stat="identity", width=1, color="white")
pie + coord_polar("y", start=0) + theme_void()+
geom_text(aes(x=1.6,label = paste0(prop*100, "%")),
position = position_stack(vjust = 0.5))+
geom_text(aes(label = num),
position = position_stack(vjust = 0.5))+
scale_fill_discrete(name="fruite distribution",
labels=sprintf("%s %d",data$name, data$num))+
ggtitle("fruite distribution")+
theme(plot.title = element_text(hjust = 0.5))
可以得到如下结果
2. 修改图注中的顺序,使其跟原来name的levels的顺序一致
library(dplyr)
data=data.frame(name=c("apple","pear","orange","banana","grape","peach","cherry"),
num=c(10,5,9,3,7,5,8)
)
data=data %>% mutate(prop=round(num/sum(num),2))
#获取name的levels的顺序
index=order(data$name)
library(ggplot2)
pie=ggplot(data, aes(x="", y=prop, fill=name)) +
geom_bar(stat="identity", width=1, color="white")
#标题居中
pie + coord_polar("y", start=0) + theme_void()+
geom_text(aes(x=1.6,label = paste0(prop*100, "%")),
position = position_stack(vjust = 0.5))+
geom_text(aes(label = num),
position = position_stack(vjust = 0.5))+
scale_fill_discrete(name="fruite distribution",
labels=sprintf("%s %d",data$name[index], data$num[index]))+ #这里指定label的顺序
ggtitle("fruite distribution")+
theme(plot.title = element_text(hjust = 0.5))
可以得到如下结果
按所占百分比排序之后再绘制饼图的代码如下
- 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 数组属性和方法
- HTML布局标记和列表标记
- 使用frp搭建内网穿透
- CNS图表复现03—单细胞区分免疫细胞和肿瘤细胞
- C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】
- Python 库引用问题:name 'json' is not defined,原因及解决办法
- Java集合类之Collection接口,集合的“爸爸”接口了解一下?
- Python 微信机器人-下载微信接收到的语音、图片等资源
- Python源文件打包成可执行的exe应用,给你的代码变个身!
- Python 技术篇-ffmpeg.exe的安装及配置
- Python 库配置问题-"Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work",原因及解决办法
- 小白都能看懂的简单爬虫入门案例剖析(爬虫入门看它就够了!)
- Python 技术篇-音频mp3格式转wav格式,高保真
- Python3 模块
- Python 微信机器人-向好友发送名片、转发名片
- iOS多线程:GCD使用介绍