前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >了解绘制条形图和折线图的细节

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

作者头像
生信技能树
发布2022-06-08 20:31:51
发布2022-06-08 20:31:51
7.6K00
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

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

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

下面是YT的分享

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

🦍第三章 条形图

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

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

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


3.1 绘制基本条形图

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

A:

代码语言:javascript
代码运行次数:0
运行
复制
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()# 是不是很简单啊,寥寥几句的代码即可 :
代码语言:javascript
代码运行次数:0
运行
复制
#时间是连续性变量,此时会在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:

代码语言:javascript
代码运行次数:0
运行
复制
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
代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
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'会自动计算变量对应的观测数
代码语言:javascript
代码运行次数:0
运行
复制
#如果x是一个连续性变量Carat(钻石的克拉数),那么,每一个值都会对应一个条形
ggplot(diamonds,aes(x=carat))+geom_bar()
#如果使用直方图,那么每一个条形表示了一定范围内的x
ggplot(diamonds,aes(x=carat))+geom_histogram()

3.4条形图着色

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

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

代码语言:javascript
代码运行次数:0
运行
复制
#使用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()
代码语言:javascript
代码运行次数:0
运行
复制
#条形图的默认图形基本比较丑,需要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:

代码语言:javascript
代码运行次数:0
运行
复制
#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')
代码语言:javascript
代码运行次数:0
运行
复制
#然而,我们经常需要负值为蓝色,正值为红色,且图例显得比较多余
#通过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

代码语言:javascript
代码运行次数:0
运行
复制
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)#宽点
代码语言:javascript
代码运行次数:0
运行
复制
#簇状条形图默认条形间距为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')

代码语言:javascript
代码运行次数:0
运行
复制
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')实现

代码语言:javascript
代码运行次数:0
运行
复制
#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')
代码语言:javascript
代码运行次数:0
运行
复制
#使用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(竖直调整数据标签位置)可以将标签调整到条形图顶端的上方或者下方

代码语言:javascript
代码运行次数:0
运行
复制
#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()命令

代码语言:javascript
代码运行次数:0
运行
复制
#基本点图
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()
代码语言:javascript
代码运行次数:0
运行
复制
#根据变量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调整横轴距离
   )
代码语言:javascript
代码运行次数:0
运行
复制
#提取出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)
    )
代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
#基础画图
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()可以实现

代码语言:javascript
代码运行次数:0
运行
复制
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即可

代码语言:javascript
代码运行次数:0
运行
复制
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否则会报错
代码语言:javascript
代码运行次数:0
运行
复制
#由于没有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进行合理的分组可以避免出错
代码语言:javascript
代码运行次数:0
运行
复制
#不同的数据标记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()函数,设置相关属性

代码语言:javascript
代码运行次数:0
运行
复制
#基础绘图
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等即可

代码语言:javascript
代码运行次数:0
运行
复制
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()函数绘制面积图

代码语言:javascript
代码运行次数:0
运行
复制
#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即可

代码语言:javascript
代码运行次数:0
运行
复制
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')

代码语言:javascript
代码运行次数:0
运行
复制
#基础绘图,运行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即可

代码语言:javascript
代码运行次数:0
运行
复制
#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的知识点路线图搞定,如下:

  • 了解常量和变量概念
  • 加减乘除等运算(计算器)
  • 多种数据类型(数值,字符,逻辑,因子)
  • 多种数据结构(向量,矩阵,数组,数据框,列表)
  • 文件读取和写出
  • 简单统计可视化
  • 无限量函数学习
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🦍第三章 条形图
    • 3.1 绘制基本条形图
    • 3.2 绘制簇状条形图
    • 3.3 绘制频数条形图
    • 3.4条形图着色
    • 3.5对正负条形图分别着色
    • 3.6 调整条形宽度和条形间距
    • 3.7 绘制堆积条形图
    • 3.8 绘制百分比堆积条形图
    • 3.9 添加数据标签
    • 3.10 绘制Cleveland点图
  • 🦧第四章 折线图
    • 4.1 绘制折线图
    • 4.2 向折线图添加数据标记
    • 4.3 绘制多重折线图
    • 4.4 修改线条样式
    • 4.5 修改数据标记样式
    • 4.6绘制面积图
    • 4.7 绘制堆积面积图
    • 4.8 绘制百分比堆积面积图
    • 4.9 为折线图添加置信区间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档