ggplot2学习笔记系列之利用ggplot2绘制误差棒及显著性标记

YanTao

绘制带有误差棒的条形图

library(ggplot2)
# 创建数据集
df <- data.frame(treatment = factor(c(1, 1, 1, 2, 2, 2, 3, 3, 3)), 
                 response = c(2, 5, 4, 6, 9, 7, 3, 5, 8), 
                 group = factor(c(1, 2, 3, 1, 2, 3, 1, 2, 3)), 
                 se = c(0.4, 0.2, 0.4, 0.5, 0.3, 0.2, 0.4, 0.6, 0.7))
head(df) #查看数据集

##   treatment response group  se
## 1    1         2       1    0.4
## 2    1         5       2    0.2
## 3    1         4       3    0.4
## 4    2         6       1    0.5
## 5    2         9       2    0.3
## 6    2         7       3    0.2
# 使用geom_errorbar()绘制带有误差棒的条形图
# 这里一定要注意position要与`geom_bar()`保持一致,由于系统默认dodge是0.9,
# 因此geom_errorbar()里面position需要设置0.9,width设置误差棒的大小
ggplot(data = df, aes(x = treatment, y = response, fill = group)) + 
geom_bar(stat = "identity", position = "dodge") + 
geom_errorbar(aes(ymax = response + se, ymin = response -  se), 
position = position_dodge(0.9), width = 0.15) + 
scale_fill_brewer(palette = "Set1")

绘制带有显著性标记的条形图

label <- c("", "*", "**", "", "**", "*", "", "", "*") #这里随便设置的显著性,还有abcdef等显著性标记符号,原理一样,这里不再重复。
# 添加显著性标记跟上次讲的添加数据标签是一样的,这里我们假设1是对照
ggplot(data = df, aes(x = treatment, y = response, fill = group)) + 
geom_bar(stat = "identity", position = "dodge") + 
geom_errorbar(aes(ymax = response + se, ymin = response -  se), 
position = position_dodge(0.9), width = 0.15) + 
geom_text(aes(y = response +  1.5 * se, label = label, group = group), 
position = position_dodge(0.9), size = 5, fontface = "bold") + 
scale_fill_brewer(palette = "Set1") #这里的label就是刚才设置的,group是数据集中的,fontface设置字体。

绘制两条形图中间带有星号的统计图

#创建一个简单的数据集
Control <- c(2.0,2.5,2.2,2.4,2.1)
Treatment <- c(3.0,3.3,3.1,3.2,3.2)
mean <- c(mean(Control), mean(Treatment))
sd <- c(sd(Control), sd(Treatment))
df1 <- data.frame(V=c("Control", "Treatment"), mean=mean, sd=sd)
df1$V <- factor(df1$V, levels=c("Control", "Treatment"))
#利用geom_segment()绘制图形
ggplot(data=df1, aes(x=V, y=mean, fill=V))+ 
geom_bar(stat = "identity",position = position_dodge(0.9),color="black")+ 
geom_errorbar(aes(ymax=mean+sd, ymin=mean-sd), width=0.05)+ 
geom_segment(aes(x=1, y=2.5, xend=1, yend=3.8))+#绘制control端的竖线 
geom_segment(aes(x=2, y=3.3, xend=2, yend=3.8))+#绘制treatment端竖线 
geom_segment(aes(x=1, y=3.8, xend=1.45, yend=3.8))+ 
geom_segment(aes(x=1.55, y=3.8, xend=2, yend=3.8))+#绘制两段横线 
annotate("text", x=1.5, y=3.8, label="〇", size=5)#annotate函数也可以添加标签

为图形添加标题

图形标题有图标题、坐标轴标题、图例标题等

p <- ggplot(data = df, aes(x = treatment, y = response, fill = group)) + 
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(aes(ymax = response + se, ymin = response -  se),
position = position_dodge(0.9), width = 0.15) + 
scale_fill_brewer(palette = "Set1")# 利用ggtitle()添加图标题,还有labs()也可以添加标题,最后会提一下。(有一个问题就是ggtitle()添加的标题总是左对齐)
p + ggtitle("利用ggtitle()添加图标题")
# 利用xlab()\ylab()添加/修改坐标轴标题
p + ggtitle("利用ggtitle()添加图标题") + 
xlab("不同处理") + 
ylab("response") #标题的参数修改在theme里,theme是一个很大的函数,几乎可以定义一切,下次有时间会讲解


最后再讲解一下如何将多副图至于一个页面 利用包gridExtragrid.arrange()函数实现

# 将四幅图放置于一个页面中
p <- ggplot(data = df, aes(x = treatment, y = response, fill = group)) + 
geom_bar(stat = "identity", position = "dodge") + 
geom_errorbar(aes(ymax = response + se, ymin = response -  se), 
position = position_dodge(0.9), width = 0.15) + 
scale_fill_brewer(palette = "Set1")
p1 <- p + ggtitle("利用ggtitle()添加图标题")
p2 <- p + ggtitle("利用ggtitle()添加图标题") + xlab("不同处理") + ylab("response")
p3 <- ggplot(data = df, aes(x = treatment, y = response, fill = group)) + 
geom_bar(stat = "identity", position = "dodge") + 
geom_errorbar(aes(ymax = response + se, ymin = response -  se), 
position = position_dodge(0.9), width = 0.15) + 
geom_text(aes(y = response +  1.5 * se, label = label, group = group), 
position = position_dodge(0.9), size = 5, fontface = "bold") + 
scale_fill_brewer(palette = "Set1")
library(gridExtra) #没有安装此包先用install.packages('gridExtra')安装
grid.arrange(p, p1, p2, p3)

上次有人问坐标轴旋转的实现,坐标轴旋转有时是很有用的,下面是我看过的一个例子,用来介绍一下。

#先加载他的数据
url.world_ports <- url("http://sharpsightlabs.com/wp-content/datasets/world_ports.RData")
load(url.world_ports)
knitr::kable(df.world_ports[1:5,])#该数据是关于世界上各个港口的数据汇总
library(dplyr) #用于数据操作,与ggplot2一样是R语言必学包#现在绘制条形图(%>%上次说过是管道操作,用于连接各个代码,十分有用)
df.world_ports%>%filter(year==2014)%>% #筛选2014年的数据 
ggplot(aes(x=reorder(port_label, desc(volume)), y=volume))+ 
geom_bar(stat = "identity", fill="darkred")+ 
labs(title="Busiest container ports in the world")+ 
labs(subtitle = '2014, in order of shipping volume')+ #添加副标题 
labs(x = "Port", y = "Shipping\nVolume")+ 
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .4))#调整x轴标签,angle=90表示标签旋转90度,从图中可以看出
#现在旋转坐标轴,并筛选排名小于25的港口,并且添加数据标签
df.world_ports %>% filter(year==2014, rank<=25) %>% #筛选2014年并且rank小于等于25的数据 
ggplot(aes(x=reorder(port, volume), y=volume))+ 
geom_bar(stat = "identity", fill="darkred")+ 
labs(title="Busiest container ports in the world")+ 
labs(subtitle = '2014, in order of shipping volume')+  
labs(x = "Port", y = "Shipping\nVolume")+ 
geom_text(aes(label=volume), hjust=1.2, color="white")+ 
coord_flip()#旋转坐标轴

两图相比,明显第二幅图好,一是可以添加数据标签,二是不用歪着脖子看。
本来打算讲讲图例的但是发现内容太多了,就不讲了,下次吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容