ggplot2柱状图进阶画法
首先导入需要的包:
library (ggplot2)
library(cowplot)#将图片组合在一起
library(gcookbook)#数据集
library(plyr)#后面用到ddply函数
首先从最简单的柱状图画起,以数据集BOD为例
> BODTime demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8p1 <- ggplot(BOD,aes(x=Time,y=demand))+geom_bar(stat = "identity")
p1
注意这里要加stat = "identity"
这样显示感觉不太美观,我们可以在横坐标上做文章,利用factor函数稍作调整
p2 <- ggplot(BOD,aes(x=factor(Time),y=demand))+geom_bar(stat = "identity")
p2
这样就会自动隐藏第六列,而且横坐标也不是连续型而是离散的数值
下面演示另一种情况,统计某一品类出现的次数该怎么办,以mpg数据集为例
> mpg
# A tibble: 234 x 11manufacturer model displ year cyl trans drv cty hwy fl class <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr> 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact3 audi a4 2 2008 4 manual(m6) f 20 31 p compact4 audi a4 2 2008 4 auto(av) f 21 30 p compact5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact7 audi a4 3.1 2008 6 auto(av) f 18 27 p compact8 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p compact9 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p compact
10 audi a4 quattro 2 2008 4 manual(m6) 4 20 28 p compact
# ... with 224 more rows
p3 <- ggplot(mpg,aes(manufacturer))+geom_bar()#每种品牌车的数量
p3
那么如何给柱状图调色呢
p4 <- ggplot(BOD,aes(x=factor(Time),y=demand))+geom_bar(stat = "identity",fill = "lightblue",#填充颜色为浅蓝色colour = "black")#边框颜色为黑色
p4
有时我们的数据并不只有一类数据,而是有多个,那么我们怎么才能更好的描绘出这类数据呢,下面我将演示两种情形,以cabbage_exp数据集为例
#这里面有两个品种的卷心菜c39 c52,分别对应三个日期
> cabbage_expCultivar Date Weight sd n se
1 c39 d16 3.18 0.9566144 10 0.30250803
2 c39 d20 2.80 0.2788867 10 0.08819171
3 c39 d21 2.74 0.9834181 10 0.31098410
4 c52 d16 2.26 0.4452215 10 0.14079141
5 c52 d20 3.11 0.7908505 10 0.25008887
6 c52 d21 1.47 0.2110819 10 0.06674995
堆叠柱状图
p5 <- ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity",position = position_stack(reverse = T))
p5
p5.1 <- ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity",position = position_stack(reverse = F))
p5.1
注意看区别,这里在geom_bar()中添加参数 position = position_stack(reverse = T)可以改变上下位置
当然还有另一种表示方式,利用双柱分别表示每一类别,下面展示这样该如何画
p6 <- ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity",position="dodge")
p6
在cabbage_exp数据集中,如果d21只有品种c39的数据用以上的方法会得到这样一个图
ca <- cabbage_exp[1:5,]#将最后一行数据删除
p7 <- ggplot(ca,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity",position="dodge")
p7
显然在这种情况下要想保证美观可以在最后加上一行NA
ca <- cabbage_exp[1:5,]
ca <- edit(ca)
p8 <- ggplot(ca,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity" ,position="dodge")
p8
如何展示一个数据集中各类包含的数量,以diamonds为例
summary(diamonds)#可以看到,cut有五个类,下面我们展示每一类的包含多少个样本
p9 <- ggplot(diamonds,aes(cut))+geom_bar()
p9
利用柱状图展示样本中carat的分布
p10 <- ggplot(diamonds,aes(carat))+geom_bar()
p10
#等价于
ggplot(diamonds,aes(carat))+geom_histogram()
在分类数据中如何调色,以uspopchange数据集为例
#以uspopchange数据集为例,取变化最大的前十个州
df1 <- subset(uspopchange,rank(Change)>40)
p11 <- ggplot(df1,aes(x=Abb,y=Change,fill=Region))+geom_bar(stat = "identity")+scale_fill_manual(values = c("skyblue","green"))#这里也可以用取色器取,输入色号
p11
这里用到的函数为scale_fill_manual(values = c("颜色1","颜色2"))
如果我们想让上面这个图以change为度量递增显示,该怎么实现呢
p12 <- ggplot(df1,aes(x=reorder(Abb,Change),y=Change,fill=Region))+geom_bar(stat = "identity")+scale_fill_manual(values = c("blue","green"))
p12
涉及函数reorder(x,values):对x以values升序排序
如果数据中有正有负,怎么对数据正负以不同的颜色显示呢?
city <- c("北京","上海","南京","广州","深圳","哈尔滨","青岛","兰州")
value <- c(150,100,-95,120,30,-60,85,75)
df2 <- data.frame(city = city,value = value)
p13 <- ggplot(data = df2,mapping = aes(x = city, y = value))+geom_bar(stat = "identity",fill = ifelse(df2$value>0,"pink","skyblue"))
p13
加一个ifelse语句来控制颜色
或者用以下方法:
df2$pos <- value>=0
df2
> df2city value pos
1 北京 150 TRUE
2 上海 100 TRUE
3 南京 -95 FALSE
4 广州 120 TRUE
5 深圳 30 TRUE
6 哈尔滨 -60 FALSE
7 青岛 85 TRUE
8 兰州 75 TRUE
p14 <- ggplot(data = df2,mapping = aes(x = city, y = value,fill = pos))+geom_bar(stat = "identity",position = "identity")+scale_fill_manual(values = c("pink","skyblue"),guide="none")#guide="none":去除图例
p14
scale_fill_manual()函数里的guide="none",读者可以尝试一下如果不加会怎样
如何调整柱子的宽度?
p15 <- ggplot(pg_mean,aes(x=group,y=weight))+geom_bar(stat = "identity",width = 0.5)
p15
p16 <- ggplot(pg_mean,aes(x=group,y=weight))+geom_bar(stat = "identity",width = 0.8)
p16#对比
cowplot::plot_grid(p15,p16,nrow = 1)
在geom_bar()中加上width=?,即柱子宽度
如何调整双变量情形下柱子之间的间隙
p17 <- ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat="identity",position=position_dodge(0.6),width = 0.5)+ggtitle("p17")
p17
如果在堆叠柱状图中不显示原有的数值而是显示比例,例如在cabbage_exp中显示每一天中c39品种和c52品种所占比例的情况该怎么处理
这里需要先计算出来c39在d16这天的比例,以此类推,然后将这个比例作为新的一列,需要用到plyr包里的ddply函数
简单说一下ddply()函数用法 ,个人理解:
ddply(data, variables, fun = NULL, ...)
data表示数据集
variables为分组字段
fun为需要向各组数据应用的函数例如:
> cabbage_expCultivar Date Weight sd n se 1 c39 d16 3.18 0.9566144 10 0.30250803 2 c39 d20 2.80 0.2788867 10 0.08819171 3 c39 d21 2.74 0.9834181 10 0.31098410 4 c52 d16 2.26 0.4452215 10 0.14079141 5 c52 d20 3.11 0.7908505 10 0.25008887 6 c52 d21 1.47 0.2110819 10 0.06674995ddply(cabbage_exp,"Date",#以Date为分类依据transform,#作用:为原数据框添加新的列,改变原变量列的值,还可通过赋值NULL删除列变量。percentage=Weight/sum(Weight)*100)#增加新列percentageresult: Cultivar Date Weight sd n se percentage 1 c39 d16 3.18 0.9566144 10 0.30250803 58.45588 2 c52 d16 2.26 0.4452215 10 0.14079141 41.54412 3 c39 d20 2.80 0.2788867 10 0.08819171 47.37733 4 c52 d20 3.11 0.7908505 10 0.25008887 52.62267 5 c39 d21 2.74 0.9834181 10 0.31098410 65.08314 6 c52 d21 1.47 0.2110819 10 0.06674995 34.91686ddply(cabbage_exp,"Date",#以Date为分类依据summarise,#summarise函数s=sum(Weight))#增加新列sresult:Date s 1 d16 5.44 2 d20 5.91 3 d21 4.21
ca <- ddply(cabbage_exp,"Date",transform,percentage=Weight/sum(Weight)*100)
p18 <- ggplot(ca,aes(x=Date,y=percentage,fill=Cultivar))+geom_bar(stat = "identity",width = 0.7)
p18
调个色:
p19 <- ggplot(ca,aes(x=Date,y=percentage,fill=Cultivar))+geom_bar(stat = "identity",width = 0.7,colour="black")+guides(fill=guide_legend(reverse = F))+#图例上下位置是否颠倒scale_fill_brewer(palette="Pastel1")#palette:调色板
p19
在柱上标上数字
p20 <- ggplot(cabbage_exp,aes(x=interaction(Date,Cultivar),y=Weight))+geom_bar(stat = "identity")+geom_text(aes(label=Weight),#将weight赋值给每一列vjust=1.2,#位置参数colour="white",#颜色size=3.5)#字体大小
p21 <- ggplot(cabbage_exp,aes(x=interaction(Date,Cultivar),y=Weight))+geom_bar(stat = "identity")+geom_text(aes(label=Weight),#将weight赋值给每一列vjust=-.2)#位置参数
p22 <- ggplot(cabbage_exp,aes(x=interaction(Date,Cultivar),y=Weight))+geom_bar(stat = "identity")+geom_text(aes(y=Weight+0.1,#文字高度比柱子高0.1 【推荐用此方法】label=Weight))
#interaction函数作用
interaction(c("A","B"),c("a","b"))
[1] A.a B.b
Levels: A.a B.a A.b B.b
在组合情况下加上标注:
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat = "identity",position = "dodge")+geom_text(aes(label=Weight),vjust=1.5,colour="white",position = position_dodge(0.9))
注意:这里在geom_text()中要加上position = position_dodge(0.9),不然显示的标注在同一条线上可以适当调整参数观察其区别
堆叠图中加上数字标注:
p23 <- ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat = "identity")+geom_text(aes(label=Weight))
p23
显然这样并不美观,我们可以对原始数据加以处理,在进行绘图
ca <- arrange(cabbage_exp,Cultivar,Date)#arrange(data.frame,主序,次序)
ca <- ddply(ca,"Date",transform,pos=cumsum(Weight))#cumsum累加
ca
> caCultivar Date Weight sd n se pos
1 c39 d16 3.18 0.9566144 10 0.30250803 3.18
2 c52 d16 2.26 0.4452215 10 0.14079141 5.44
3 c39 d20 2.80 0.2788867 10 0.08819171 2.80
4 c52 d20 3.11 0.7908505 10 0.25008887 5.91
5 c39 d21 2.74 0.9834181 10 0.31098410 2.74
6 c52 d21 1.47 0.2110819 10 0.06674995 4.21
p24 <- ggplot(ca,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat = "identity",position = position_stack(reverse = T))+geom_text(aes(y=pos,label=Weight),vjust=1.5)
p24
也可以加上单位:
p25 <- ggplot(ca,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(stat = "identity",position = position_stack(reverse = T))+geom_text(aes(y=pos,label=paste(Weight,"kg")),vjust=1.5)
p25
这里利用paste函数,将数值和“kg”连接起来
ggplot2柱状图进阶画法相关推荐
- ggplot2散点图进阶画法
本文主要介绍画散点图的以下几种类型: 目录 点数过多出现重叠现象 case 1 case 2 离散数据的回归拟合及置信区间问题 添加回归曲线 修改置信区间的置信度 隐藏置信区间 给数据按类别分别拟合 ...
- 跟着NC学作图 | 柱状图新画法 (环状柱状图)
本教程绘制的图形是来自NC期刊的图形,我不知道叫什么图形,但是仔细一看就是的属于"环状柱状图",那就是这样叫吧! 看着还算是比较新颖的,那就学一下吧!! 绘图 加载R包 libra ...
- ggplot2柱状图
柱状图 library(tidyverse) df3 <- tibble(obj = c('LONGGi', 'JINKO', 'TRINA', 'JASO', 'Canadian Solar' ...
- circos 中堆积柱状图的画法
欢迎关注微信公众号<生信修炼手册>! 在之前的文章,我们介绍了如何使用histograms来构建普通的柱状图,今天看下如何构建堆积柱状图.先来看一个堆积柱状图的例子 对应的数据如下: 和普 ...
- ggplot2——柱状图
目录: 初始图样 如何修改柱条的宽度 如何修改柱条的顺序 如何在柱条上添加文字 (更多关于图例.坐标系等内容请见:R.ggplot2.shiny 汇总) 初始图样: library(ggplot2) ...
- python堆积图的画法_Matplotlib: 堆积柱状图的画法
两层堆积import numpy as np import matplotlib.pyplot as plt y1 = np.array([1,2,3,4]) y2 = np.array([1,1,1 ...
- R语言ggplot2 柱状图(条形图)xy轴翻转,及排序
ggplot(data = rate,aes(x=reorder(地区,地区生产总值.)))+geom_bar(aes(y=地区生产总值.,fill=地区),stat = "identity ...
- 基于R的ggplot2使用指南整理(一)——柱状图画法(含代码)
可视化第一期:在R平台使用ggplot2 欢迎查询ggplot2使用指南 什么是ggplot2? 基本结构 图形类别geom_function 坐标系coord_function 分面facet_fu ...
- 索引 | 学堂原创推文汇总-v2
更新时间: 2021.12.13 截至目前,本号的原创推文已近百篇,并且又新增了一个专辑--实用技巧专辑(原办公软件技巧专辑).专辑之下又分若干系列,只有带专辑标签的推文才是最新版本的推文. 本篇是学 ...
- Python中matplotlib.pyplot工具包总结
matplotlib.pyplot工具包总结 1 基础绘图 1.1 基础绘图模块导入 1.2 空白图绘制 1.2.1 空白图绘制方法一 1.2.2 空白图绘制方法二 1.3 图形绘制线的修改 1.3. ...
最新文章
- 《游戏设计师修炼之道:数据驱动的游戏设计》一2.8小结
- 爬虫基本库的使用---urllib库
- 概要设计实例_尽可能通用的运维CMDB的设计与实践
- mybatis初始化过程
- cmd c语言 文件,DSP,如何编写CMD文件!(转)
- 使用Spring Data REST将Spring Data JPA存储库导出为REST服务
- c语言实现路由功能,前端路由的两种实现方式,内附详细代码
- NSIS UI 美化类插件分享
- pythondd_一些PYTHON :D:D:D
- Java多线程同步数据库,源码+原理+手写框架
- Spring Cloud Zuul--服务网关
- poj 1815(最小割、割集)
- 持续集成(CI)- 几种测试的区别(摘录)
- paip.提升安全性--360,WI,AWVS三款WEB程序安全检测软件使用总结
- ftp连不上linux虚拟机,cuteftp连不上Linux虚拟机的解决方案
- c语言接收rs232串口速率,基于C语言的RS232串行接口通信实现
- 复杂性思维第二版 三、小世界图
- 【网络实验】10G网络下的真实带宽——CPU负载与网卡TSO、GSO
- 五. python 字符串方法函数
- 快门速度,光圈,感光度