首先导入需要的包:

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柱状图进阶画法相关推荐

  1. ggplot2散点图进阶画法

    本文主要介绍画散点图的以下几种类型: 目录 点数过多出现重叠现象 case 1 case 2 离散数据的回归拟合及置信区间问题 添加回归曲线 修改置信区间的置信度 隐藏置信区间 给数据按类别分别拟合 ...

  2. 跟着NC学作图 | 柱状图新画法 (环状柱状图)

    本教程绘制的图形是来自NC期刊的图形,我不知道叫什么图形,但是仔细一看就是的属于"环状柱状图",那就是这样叫吧! 看着还算是比较新颖的,那就学一下吧!! 绘图 加载R包 libra ...

  3. ggplot2柱状图

    柱状图 library(tidyverse) df3 <- tibble(obj = c('LONGGi', 'JINKO', 'TRINA', 'JASO', 'Canadian Solar' ...

  4. circos 中堆积柱状图的画法

    欢迎关注微信公众号<生信修炼手册>! 在之前的文章,我们介绍了如何使用histograms来构建普通的柱状图,今天看下如何构建堆积柱状图.先来看一个堆积柱状图的例子 对应的数据如下: 和普 ...

  5. ggplot2——柱状图

    目录: 初始图样 如何修改柱条的宽度 如何修改柱条的顺序 如何在柱条上添加文字 (更多关于图例.坐标系等内容请见:R.ggplot2.shiny 汇总) 初始图样: library(ggplot2) ...

  6. python堆积图的画法_Matplotlib: 堆积柱状图的画法

    两层堆积import numpy as np import matplotlib.pyplot as plt y1 = np.array([1,2,3,4]) y2 = np.array([1,1,1 ...

  7. R语言ggplot2 柱状图(条形图)xy轴翻转,及排序

    ggplot(data = rate,aes(x=reorder(地区,地区生产总值.)))+geom_bar(aes(y=地区生产总值.,fill=地区),stat = "identity ...

  8. 基于R的ggplot2使用指南整理(一)——柱状图画法(含代码)

    可视化第一期:在R平台使用ggplot2 欢迎查询ggplot2使用指南 什么是ggplot2? 基本结构 图形类别geom_function 坐标系coord_function 分面facet_fu ...

  9. 索引 | 学堂原创推文汇总-v2

    更新时间: 2021.12.13 截至目前,本号的原创推文已近百篇,并且又新增了一个专辑--实用技巧专辑(原办公软件技巧专辑).专辑之下又分若干系列,只有带专辑标签的推文才是最新版本的推文. 本篇是学 ...

  10. Python中matplotlib.pyplot工具包总结

    matplotlib.pyplot工具包总结 1 基础绘图 1.1 基础绘图模块导入 1.2 空白图绘制 1.2.1 空白图绘制方法一 1.2.2 空白图绘制方法二 1.3 图形绘制线的修改 1.3. ...

最新文章

  1. 《游戏设计师修炼之道:数据驱动的游戏设计》一2.8小结
  2. 爬虫基本库的使用---urllib库
  3. 概要设计实例_尽可能通用的运维CMDB的设计与实践
  4. mybatis初始化过程
  5. cmd c语言 文件,DSP,如何编写CMD文件!(转)
  6. 使用Spring Data REST将Spring Data JPA存储库导出为REST服务
  7. c语言实现路由功能,前端路由的两种实现方式,内附详细代码
  8. NSIS UI 美化类插件分享
  9. pythondd_一些PYTHON :D:D:D
  10. Java多线程同步数据库,源码+原理+手写框架
  11. Spring Cloud Zuul--服务网关
  12. poj 1815(最小割、割集)
  13. 持续集成(CI)- 几种测试的区别(摘录)
  14. paip.提升安全性--360,WI,AWVS三款WEB程序安全检测软件使用总结
  15. ftp连不上linux虚拟机,cuteftp连不上Linux虚拟机的解决方案
  16. c语言接收rs232串口速率,基于C语言的RS232串行接口通信实现
  17. 复杂性思维第二版 三、小世界图
  18. 【网络实验】10G网络下的真实带宽——CPU负载与网卡TSO、GSO
  19. 五. python 字符串方法函数
  20. 快门速度,光圈,感光度

热门文章

  1. Oracle数据库服务重启方法
  2. linux安装mailx发邮件
  3. 像“钢铁侠”埃隆·马斯克那样,成为超速学习者
  4. ios课堂派怎么提交附件_iOS怎么在课堂派上传文件?
  5. 初中女生数学不好能学计算机,初中女生必看:学好数学的方法及窍门
  6. 地对地导弹地对地导弹
  7. window启动activemq失败
  8. 零信任之从IAM概述到应用实现
  9. numpy部份函数或命令用法(不定时更新)
  10. python中abbab什么意思_ABtest与Python代码-Go语言中文社区