分享

了解绘制条形图和折线图的细节

 健明 2022-05-02 发布于广东

 考虑到公众号后台数不胜数的提问其实并不是生物学知识或者数据处理知识的困惑,仅仅是绘图小技巧以及数据转换的困难。所以我们一再强调系统性掌握编程知识的重要性,在这个打基础方面我让实习生“身先士卒”,起码每个人在每个编程语言上面都需要看至少五本书而且每本书都需要看五遍以上,并且详细的记录笔记。

接下来我们就连载其中一个佼佼者的系统性学习五本书的笔记:

下面是YT的分享

上一个笔记是:R基础知识及快速检阅你的数据

🦍第三章 条形图

条形图通常用来展示不同分类下(x轴)某个数值型变量的取值(y轴),比如4种商品的价格等等,但是并不适合展示一个连续时间的变动趋势,虽然偶尔也会应用。

对于条形图而言 ,有的时候我们展示的是数据集种变量的数值,有的时候展示的却是频数,但是他们的术语又相同,这一点及其容易造成混乱。

本章将以ggplot2为主进行学习啦~~


3.1 绘制基本条形图

Q:当你有一个包含两列的数据框,一列为x轴上的位置,一列为y轴上的对应高度,基于此如何绘制条形图?

A:

head(pg_mean)#plant growth数据
group weight
1 ctrl 5.032
2 trt1 4.661
3 trt2 5.526

ggplot(pg_mean,aes(x=group,y=weight))+geom_col()

# 是不是很简单啊,寥寥几句的代码即可 :

#时间是连续性变量,此时会在x轴上介于最小值和最大值之间所有可能的取值范围处绘制条形
ggplot(BOD,aes(x=Time,y=demand))+geom_col()
#使用factor函数将连续型变量转化为离散型变量
ggplot(BOD,aes(x=factor(Time),y=demand))+geom_col()

               

*默认情况下,颜色为深灰色且条形图没有边框线,可以通过fill调整条形图的填充色,使用colour参数为条形图添加边框线,注意是英式拼写colour。(输入美式也不影响运行)

ggplot(pg_mean,aes(x=group,y=weight))+

geom_col(fill='lightblue',colour='black')

3.2 绘制簇状条形图

Q:如何绘制基于某些分类变量的簇状条形图?

A:

cabbage_exp#带白菜的生长情况
Cultivar 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
#将分类变量映射到fill参数上,并运行geom_col(position = 'dodge')

#这里的fill参数用来指定填充色,并且必须使用dodge使两组数据在水平上错开排列,

# 这里映射的变量需要是分类变量

ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+

geom_col(position = 'dodge')

#这里我们吧Cultivar映射到fill,date映射到x

library(RColorBrewer)#导入调色包
ggplot(cabbage_exp,aes(x=Date,y = Weight,fill=Cultivar))+
geom_col(position = 'dodge',colour='black')+
scale_fill_brewer(palette = 'Pastel1')##全部数据
ce <- cabbage_exp[1:5,]
ggplot(ce,aes(x=Date,y = Weight,fill=Cultivar))+
geom_col(position = 'dodge',colour='black')+
scale_fill_brewer(palette = 'Pastel1')##去除第六行的数据,即c52的d21
#又缺失项时(没有值或者NA),结果会略去不绘,同时相近的条形会自动填充到相应位置

3.3 绘制频数条形图

Q:如果每行数据对应一个样本那么如何针对样本频数绘制条形图?

A:

diamonds#记载了54000颗钻石的价格等性质
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
4 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39
# ... with 53,930 more rows
ggplot(diamonds,aes(x=cut))+geom_bar()
#geom_bar()函数默认stat='bin'会自动计算变量对应的观测数

#如果x是一个连续性变量Carat(钻石的克拉数),那么,每一个值都会对应一个条形
ggplot(diamonds,aes(x=carat))+geom_bar()
#如果使用直方图,那么每一个条形表示了一定范围内的x
ggplot(diamonds,aes(x=carat))+geom_histogram()

3.4条形图着色

Q:如何将条形图中的条形设定为不同的颜色?

A:将合适的变量映射到填充色fill上即可

#使用uspopchange数据集,该数据集包含了美国人口2000-2010之间的变化
State Abb Region Change
1 Alabama AL South 7.5
2 Alaska AK West 13.3
3 Arizona AZ West 24.6
4 Arkansas AR South 9.1
5 California CA West 10.0
6 Colorado CO West 16.9
#我们选出人口增长最快的10个州进行绘图,根据地区位置对图形着色
ups <- uspopchange %>% arrange(desc(Change)) %>% slice(1:10)
ups
State Abb Region Change
1 Nevada NV West 35.1
2 Arizona AZ West 24.6
3 Utah UT West 23.8
4 Idaho ID West 21.1
5 Texas TX South 20.6
6 North Carolina NC South 18.5
7 Georgia GA South 18.3
8 Florida FL South 17.6
9 Colorado CO West 16.9
10 South Carolina SC South 15.3

ggplot(ups,aes(x=Abb,y=Change,fill=Region))+geom_col()

#条形图的默认图形基本比较丑,需要scale_fill_brewer()或者scale_fill_manual()重新设定颜色
#注意颜色的映射实在aes()中完成的,而颜色的设定实在aes()之外完成的
ggplot(ups,aes(x=reorder(Abb,Change),y=Change,fill=Region))+
#reorder函数将Abb的因子水平根据Change排序
geom_col(colour='black')+#设置边框
scale_fill_manual(values = c('#669933','#FFCC66'))+#设置yanse
xlab('State')

3.5对正负条形图分别着色

Q:如何根据条形对应的正负值分别对其着色?

A:

#climate数据为1800-2011之间全球气候的异常值
climate_sub <- climate %>% filter(Source=='Berkeley' & Year>=1900) %>% mutate(pos=Anomaly10y>=0)
#使用mutate根据已知列新增一列对Anomaly10y是否大于0进行判断
climate_sub
Source Year Anomaly1y Anomaly5y Anomaly10y Unc10y pos
1 Berkeley 1900 NA NA -0.171 0.108 FALSE
2 Berkeley 1901 NA NA -0.162 0.109 FALSE
3 Berkeley 1902 NA NA -0.177 0.108 FALSE
4 Berkeley 1903 NA NA -0.199 0.104 FALSE
5 Berkeley 1904 NA NA -0.223 0.105 FALSE
6 Berkeley 1905 NA NA -0.241 0.107 FALSE

#将pos映射到fill参数上,并且绘制条形图。设置position='identity'避免系统因对负值绘制堆积条形发出的警告
ggplot(climate_sub, aes(x=Year,y=Anomaly10y,fill=pos))+
geom_col(position = 'identity')
#然而,我们经常需要负值为蓝色,正值为红色,且图例显得比较多余
#通过scale_fill_manual()进行颜色调整,参数guide='none'删除图例,colour参数设定边框颜色,size设置宽度
ggplot(climate_sub, aes(x=Year,y=Anomaly10y,fill=pos))+
geom_col(position = 'identity',colour='black',size=0.25)+
scale_fill_manual(values=c('#CCEEFF','#FFDDDD'),guide='none')

3.6 调整条形宽度和条形间距

Q:如何调整条形图宽度和条形间距?

A:通过设定geom_bar()函数的width可以改变条形的宽度,其默认值为0.9,值越大越宽,最大宽度为1

ggplot(pg_mean,aes(x=group,y=weight))+geom_col()#默认
ggplot(pg_mean,aes(x=group,y=weight))+geom_col(width = 0.5)#窄点
ggplot(pg_mean,aes(x=group,y=weight))+geom_col(width = 1)#宽点

#簇状条形图默认条形间距为0,如果要增加组内间距,可以将width设置小一点,并使position_dodge()取值大于width
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(width=0.5,position = 'dodge')#当position='dodge'时使用的为0.9的默认值
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(width=0.5,position = position_dodge(0.7))
#width与dodge的默认值都为0.9,以下四条命令时等价的
geom_bar(position='dodge')
geom_bar(width=0.9,position=position_dodge())
geom_bar(position=position_dodge(0.9))
geom_bar(width=0.9,position=position_dodge(width=0.9))

*ggplot会保持图长度条形中心保持一致

3.7 绘制堆积条形图

Q:如何绘制堆积条形图?

A:使用geom_bar()函数,并映射一个变量给fill参数(注意和簇状条形图的区别,这里不能设置position='dodge')

cabbage_exp
Cultivar 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
#1.fill中有两个变量分别和weight对应。默认条件下条形的堆积顺序与图例顺序是一致的
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_col()
#2.可以通过guides()进行调整并指定图例对应需要的调整的图形属性
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_col()+
guides(fill=guide_legend(reverse = T))
#3.如果想要反转条形的堆积顺序,可以使用position_stack(reverse=T)来实现,同时需要反转图例顺序保持一致
#当然也可以通过调整数据框顺序实现上述操作,只是应更加谨慎
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(position=position_stack(reverse = T))+
guides(fill=guide_legend(reverse = T))
#4.为了获得更好的效果图,添加一个调色板以及黑色的边框线
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(colour='black')+
scale_fill_brewer(palette = 'Pastel1')

3.8 绘制百分比堆积条形图

Q:如何绘制可展示百分比的堆积条形图?

A:使用geom_col(position='fill')实现

#1.绘制百分比堆积图
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(position='fill')
#2.position='fill’只能将y调整在0和1之间
#若要显示为百分比需使用scale_y_continuous(labels=scales::percent)
#这里是使用了scales包中的percent函数,也可以先library(scales),然后运行scale_y_continuous(labels=percent)
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(position='fill')+
scale_y_continuous(labels = scales::percent)
#3.美化图片
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(colour='black',position='fill')+
scale_y_continuous(labels = scales::percent)+
scale_fill_brewer(palette = 'Pastel1')

#使用dplyr包中的group_by()函数和mutate()函数将每组对应数据标准化为100%
ce <- cabbage_exp %>% group_by(Date) %>% mutate(percent_weight=Weight/sum(Weight)*100)
#group_by根据Date分组,mutate函数通过计算得出新的一列
ce
# A tibble: 6 x 7
# Groups: Date [3]
Cultivar Date Weight sd n se percent_weight
<fct> <fct> <dbl> <dbl> <int> <dbl> <dbl>
1 c39 d16 3.18 0.957 10 0.303 58.5
2 c39 d20 2.8 0.279 10 0.0882 47.4
3 c39 d21 2.74 0.983 10 0.311 65.1
4 c52 d16 2.26 0.445 10 0.141 41.5
5 c52 d20 3.11 0.791 10 0.250 52.6
6 c52 d21 1.47 0.211 10 0.0667 34.9
ggplot(ce,aes(x=Date,y=percent_weight,fill=Cultivar))+geom_col()

*可以看出cabbage_exp和ce的数据格式并不相同,这是因为ce是一个tibble

3.9 添加数据标签

Q:如何给条形图添加数据标签?

A:在绘图命令中使用geom_text()函数即可添加数据标签,此时需要分别指定一个变量给x,y和标签本身。通过vjust(竖直调整数据标签位置)可以将标签调整到条形图顶端的上方或者下方

#1.基本条形图加标签--------------------------------------------------------------------
#标签在下面
ggplot(ce,aes(x=interaction(Date,Cultivar),y=Weight))+geom_col()+
geom_text(aes(label=Weight),vjust=1.5,colour='white')
#标签在上面
ggplot(ce,aes(x=interaction(Date,Cultivar),y=Weight))+geom_col()+
geom_text(aes(label=Weight),vjust=-0.2)
#使用geom_bar函数添加条形然后使用geom_text()计数
ggplot(mtcars,aes(x=factor(cyl)))+
geom_bar()+
geom_text(aes(label=..count..),stat='count',vjust=1.5,colour='white')#这里用count函数进行统计x值的行数,使用映射..count..令计算得到的计数作为标签
#调整数据标签的方法
#(1) 调整vjust,但是有可能使数据标签位于绘图区范围之外
#(2)增加ylim调整y轴范围,只是数值竖直调整的幅度取决于y轴范围
#增加y轴上限
ggplot(ce,aes(x=interaction(Date,Cultivar),y=Weight))+geom_col()+
geom_text(aes(label=Weight),vjust=-0.2)+
ylim(0,max(cabbage_exp$Weight)*1.05)
#设置标签的y轴坐标
ggplot(ce,aes(x=interaction(Date,Cultivar),y=Weight))+geom_col()+
geom_text(aes(y=Weight+0.1,label=Weight))

#2.簇状条形图------------------------------------------------------------------------------
#设置position=position_dodge()并给予一个参数来设定分类间距,由于簇状条形图的条形更窄,可设置size调整字号大小
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(position='dodge')+
geom_text(aes(label=Weight),colour='white',size=3,vjust=1.5,position=position_dodge(0.9))
#3.堆积条形图-----------------------------------------------------------------------------
#在向堆积条形图添加数据标签之前要先对对应的数据进行累计求和
#可以使用dyplr包的arrange函数完成操作,用rev()函数调整cultivar的顺序
ce <- cabbage_exp %>% arrange(Date,rev(Cultivar))
ce <- ce %>% group_by(Date) %>% mutate(label_y=cumsum(Weight))
ggplot(ce,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col()+
geom_text(aes(y=label_y,label=Weight),vjust=1.5,colour='white')
#计算y轴的位置,将数据标签置于条形中部
ce <- ce %>% group_by(Date) %>% mutate(label_y=cumsum(Weight)-0.5*Weight)
ggplot(ce,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col()+
geom_text( aes(y=label_y,label=Weight),colour='white')
#美化图形
#使用size控制标签字号,paste函数后面添加kg结尾,format()保留两位小数
ggplot(ce,aes(x=Date,y=Weight,fill=Cultivar))+
geom_col(colour='black')+
geom_text( aes(y=label_y,label=paste(format(Weight,nsmall=2),'kg')),size=4)+
scale_fill_brewer(palette = 'Pastel1')

3.10 绘制Cleveland点图

Q:如何绘制Cleveland点图?

A:Cleveland点图使条形图的替代方案,可以减少图形造成的视觉混乱并使图形更具可读性。其方法为直接运行geom_point()命令

#基本点图
tophit <- tophitters2001[1:25,]#2001年美国职业棒球大联盟(mlb)前144名击球手的击球率统计
id first last name year stint team lg g
1 walkela01 Larry Walker Larry Walker 2001 1 COL NL 142
2 suzukic01 Ichiro Suzuki Ichiro Suzuki 2001 1 SEA AL 157
3 giambja01 Jason Giambi Jason Giambi 2001 1 OAK AL 154
4 alomaro01 Roberto Alomar Roberto Alomar 2001 1 CLE AL 157
5 heltoto01 Todd Helton Todd Helton 2001 1 COL NL 159
6 aloumo01 Moises Alou Moises Alou 2001 1 HOU NL 136
7 berkmla01 Lance Berkman Lance Berkman 2001 1 HOU NL 156
8 boonebr01 Bret Boone Bret Boone 2001 1 SEA AL 158
ggplot(tophit,aes(x=avg,y=name))+geom_point()

#根据变量avg对变量name进行排序
tophit[,c('name','lg','avg')]
ggplot(tophit,aes(x=avg,y=reorder(name,avg)))+
geom_point(size=3)+
theme_bw()+
theme(
panel.grid.major.x = element_blank(),#删除垂直网络线
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_line(colour = 'grey60',linetype = 'dashed')#水平网格线修改为虚线
)
#同时我们也可以x,y轴互换,并将数据标签旋转60度
ggplot(tophit,aes(x=reorder(name,avg),y=avg))+
geom_point(size=3)+
theme_bw()+
theme(
panel.grid.major.x = element_line(colour = 'grey60',linetype = 'dashed'),
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank()
axis.text.x=element_text(angle=60,hjust=1)#hjust=1调整横轴距离
)

#提取出name变量,一次根据变量lg和avg对其进行排序
nameorder <- tophit$name[order(tophit$lg,tophit$avg)]
#将name转化为因子,因子水平与nameorder一致
tophit$name <- factor(tophit$name,levels = nameorder)
ggplot(tophit,aes(x=avg,y=name))+
geom_segment(aes(yend=name),xend=0,colour='grey50')+
geom_point(size=3,aes(colour=lg))+
scale_colour_brewer(palette = 'Set1',limits=c('NL','AL'))+
theme_bw()+
theme(
panel.grid.major.y = element_blank(),
legend.position = c(1,0.55),#图例放置在绘图区中
legend.justification = c(1,0.5)
)

ggplot(tophit,aes(x=avg,y=name))+
geom_segment(aes(yend=name),xend=0,colour='grey50')+
geom_point(size=3,aes(colour=lg))+
scale_colour_brewer(palette = 'Set1',limits=c('NL','AL'),guide=F)+
theme_bw()+
theme(panel.grid.major.y = element_blank())+
facet_grid(lg~.,scales = 'free_y',space = 'free_y')

🦧第四章 折线图

折线图通常对两个连续的变量之间相互依存的关系进行可视化,x轴对应自变量, y轴对应因变量。折线图主要针对的是连续型变量,当然也可以用于有序的离散变量


4.1 绘制折线图

Q:如何绘制基础折线图?

A:运行ggplot()函数和geom_line()函数,并指定变量映射到x和y

#基础画图
ggplot(BOD,aes(x=Time,y=demand))+
geom_line()
#这里的时间是连续型变量,如果要替换为离散型则需要设置为factor
#此时的x轴没有绘制相应的取值且此值只是一个可能的取值而已
BOD1=BOD
BOD1$Time <- factor(BOD1$Time)
ggplot(BOD1,aes(x=Time,y=demand,group=1))+
geom_line()

#改变y轴的取值范围
ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
ylim(0,max(BOD$demand))
ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
expand_limits(y=0)

4.2 向折线图添加数据标记

Q: 如何向折线图添加数据标记?

A:折线图数据表及在数据点密度较低或者采集没有特别规律的时候尤其有用。在代码中添加geom_point()可以实现

ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
ylim(0,max(BOD$demand))

#这里也以世界人口为例子进行画图,对y轴取对数可以看出具体的看出增长速度
ggplot(worldpop,aes(x=Year,y=Population))+
geom_line()+
geom_point()+
scale_y_log10()

4.3 绘制多重折线图

Q: 如何绘制多重折线图?

A:再将另一个变量投射到颜色colour或者线型linetype即可

tg#toothrgowth变化
supp dose length
1 OJ 0.5 13.23
2 OJ 1.0 22.70
3 OJ 2.0 26.06
4 VC 0.5 7.98
5 VC 1.0 16.77
6 VC 2.0 26.14

#将supp映射到颜色
ggplot(tg,aes(x=dose,y=length,colour=supp))+
geom_line()
#将supp映射到线型
ggplot(tg,aes(x=dose,y=length,linetype=supp))+
geom_line()
##如果x变量是因子,那么必须同时告诉ggplot用来分组的变量
#在本例中,也可以把dose算作因子型向量(0.5,1,2)
ggplot(tg,aes(x=factor(dose),y=length,group=supp))+
geom_line()#不可缺少group=supp否则会报错

#由于没有group=supp所以报错
ggplot(tg,aes(x=factor(dose),y=length,colour=supp))+
geom_line()
>geom_path: Each group consists of only one observation. Do you need to
adjust the group aesthetic?

#另一种情况是,折线变成锯齿状
ggplot(tg,aes(x=dose,y=length))+
geom_line()
#如果任意离散变量映射到colour或者linetype等属性,ggplot会自动分组
#如果想借助其他变量对数据进行分组,那么应该使用group
#使用group进行合理的分组可以避免出错

#不同的数据标记shape
ggplot(tg,aes(x=dose,y=length,shape=supp))+
geom_line()+
geom_point(size=4)
#不同的数据标记fill
ggplot(tg,aes(x=dose,y=length,fill=supp))+
geom_line()+
geom_point(size=4,shape=21)
#稍微把线区分开
ggplot(tg,aes(x=dose,y=length,shape=supp))+
geom_line(position = position_dodge(0.2))+#将连接线左右移动0.2
geom_point(position = position_dodge(0.2),size=4)#将点左右移动0.2

4.4 修改线条样式

Q: 如何修改线条样式?

A:通过设置linetype,width,colour等参数可以分别修改折线的线型,线宽,以及颜色。应将上述参数的值传给geom_line()函数,设置相关属性

#基础绘图
ggplot(BOD,aes(x=Time,y=demand))+
geom_line(linetype='dashed',size=1,colour='blue')
#变量映射到图形属性上会有不同的外观,为了使图形更加鲜艳可以使用scale_colour_brewer()或者scale_color_manual()改变
ggplot(tg,aes(x=dose,y=length,colour=supp))+
geom_line()+
scale_colour_brewer(palette = 'Set1')
#aes外部设定会导致一样的颜色等。操作过程中要指定变量
#设置分组变量
ggplot(tg,aes(x=dose,y=length,group=supp))+
geom_line(colour='darkgreen',size=1.5)
#supp被映射到颜色上所以自动作为分组变量
ggplot(tg,aes(x=dose,y=length,colour=supp))+
geom_line(linetype='dashed')+
geom_point(shape=22,size=3,fill='white')

4.5 修改数据标记样式

Q: 如何修改数据标记的形式?

A:在函数aes()外部设定函数geom_point()的参数size,shape,colour,fill等即可

ggplot(BOD,aes(x=Time,y=demand))+geom_line()+
geom_point(size=4,shape=22,colour='darkred',fill='pink')
#数据标记一般默认为实线圆圈,默认大小为2,默认颜色为黑色。填充色只适用于21~25具有边框线的点型
#fill一般设置为NA,如果设置为white可以得到一个空心圆
pd <- position_dodge(0.2)
ggplot(tg,aes(x=dose,y=length,fill=supp))+
geom_line(position = pd)+#线的位置错开
geom_point(shape=21,size=3,position=pd)+#点位置错开
scale_fill_manual(values = c('black','white'))

4.6绘制面积图

Q: 如何绘制面积图?

A:运行geom_area()函数绘制面积图

#sunspots数据集记载了1700-1988年之间的太阳黑子数
#设置数据框使得数据处理更加方便
sunspotyear <- data.frame(
Year=as.numeric(time(sunspot.year)),
Sunspots=as.numeric(sunspot.year))
# geom_area()基础绘图
ggplot(sunspotyear,aes(x=Year,y=Sunspots))+
geom_area()
#通过fill修改面积图的填充色。alpha可以设置面积图的透明度为1-alpha,colour面积图添加边框线
ggplot(sunspotyear,aes(x=Year,y=Sunspots))+
geom_area(colour='black',fill='blue',alpha=0.2)

4.7 绘制堆积面积图

Q: 如何绘制堆积面积图?

A:运行geom_area()函数绘制面积图,并映射一个因子型变量到fill即可

uspopage#美国1900-2002年的人口分布
Year AgeGroup Thousands
1 1900 <5 9181
2 1900 5-14 16966
3 1900 15-24 14951
4 1900 25-34 12161
5 1900 35-44 9273
6 1900 45-54 6437
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
geom_area()
#堆积面积图的基础数据经常使宽格式,但是ggplot要求的确实长格式(melt)
#美化堆积图
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup,order=dplyr::desc(AgeGroup)))+#降序排序
geom_area(colour=NA,alpha=.4)+#不加黑色边框
scale_fill_brewer(palette = 'Blues')+#颜色
geom_line(position='stack',size=0.2)#在这里加边框hh

4.8 绘制百分比堆积面积图

Q: 如何绘制一个所有条形高度为同一常数的堆积面积图?

A:运行geom_area(position='fill')

#基础绘图,运行geom_area(position='fill')可以将y轴范围按比例调整0~1
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
geom_area(position='fill',colour='black',size=.2, alpha=.4)+
scale_fill_brewer(palette = 'Blues')
#运行scale_y_continuous(labels=scales::percent)可以输出百分比标签
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
geom_area(position='fill',colour='black',size=.2, alpha=.4)+
scale_fill_brewer(palette = 'Blues')+
scale_y_continuous(labels=scales::percent)

4.9 为折线图添加置信区间

Q: 如何为折线图添加置信域?

A:运行geom_ribbon(),然后分别映射一个变量到ymin与ymax即可

#climate数据中的Anomaly10y表示了各年温度相对于1950-1980的平均水平偏差的10年移动平均
#变量Unc10y表示95%水平以下的置信区间,因此我们使用ymax=Anomaly10y+Unc10y以及ymin=Anomaly10y-Unc10y来表示置信区间
climate_mod <- climate %>% filter(Source=='Berkeley') %>%
select(Year,Anomaly10y,Unc10y)#筛选数据

ggplot(climate_mod,aes(x=Year,y=Anomaly10y))+
geom_ribbon(aes(ymin=Anomaly10y-Unc10y,
ymax=Anomaly10y+Unc10y),
alpha=0.2)+
geom_line()#这里我们先画阴影再画线,如果反转可能导致图不清晰

#也可以使用虚线解决这个问题
ggplot(climate_mod,aes(x=Year,y=Anomaly10y))+
geom_line(aes(y=Anomaly10y-Unc10y),colour='grey50',linetype='dotted')+
geom_line(aes(y=Anomaly10y+Unc10y),colour='grey50',linetype='dotted')+
geom_line()

若有收获,就点个赞吧

再怎么强调生物信息学数据分析学习过程的计算机基础知识的打磨都不为过,我把它粗略的分成基于R语言的统计可视化,以及基于Linux的NGS数据处理

把R的知识点路线图搞定,如下:

  • 了解常量和变量概念
  • 加减乘除等运算(计算器)
  • 多种数据类型(数值,字符,逻辑,因子)
  • 多种数据结构(向量,矩阵,数组,数据框,列表)
  • 文件读取和写出
  • 简单统计可视化
  • 无限量函数学习

写在文末

我在《生信技能树》,《生信菜鸟团》,《单细胞天地》的大量推文教程里面共享的代码都是复制粘贴即可使用的, 有任何疑问欢迎留言讨论,也可以发邮件给我,详细描述你遇到的困难的前因后果给我,我的邮箱地址是 jmzeng1314@163.com

如果你确实觉得我的教程对你的科研课题有帮助,让你茅塞顿开,或者说你的课题大量使用我的技能,烦请日后在发表自己的成果的时候,加上一个简短的致谢,如下所示:

We thank Dr.Jianming Zeng(University of Macau), and all the members of his bioinformatics team, biotrainee, for generously sharing their experience and codes.

十年后我环游世界各地的高校以及科研院所(当然包括中国大陆)的时候,如果有这样的情谊,我会优先见你。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多