R语言_ggplot2绘图

ggplot2语法

  1. 入门级绘图模版

  2. 属性设置

  3. 分面

  4. 几何对象

  5. 统计变换

  6. 位置调整

  7. 坐标系

以上是各种参数,需要的时候用一下就可以。

1.入门级绘图模板


ggplot(data = <DATA>)+

<GEOM_FUNCTION>(mapping =aes(<MAPPINGS>))


< >:里面的内容是模版,使用时需要替换掉。

<GEOM_FUNCTION>:为画图函数,可以使用不同类型的函数图如:点图 geom_point,箱线图geom_boxplot等。

<MAPPINGS>:画图的参数如横、纵坐标,图形映射等属性。

ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length))
##iris替换<DATA>,geom_point替换<GEOM_FUNCTION>,<MAPPINGS>为映射:x,y为横纵坐标。

入门级绘图模版只需要:作图数据、横纵坐标(只需要填到相应位置)

ggplot的语法特殊性:用+连接,一般放在行末,换行代码有缩进;

不允许加引号,不用$,失去tab键补全的权利。

好处是代码易读,缺点是没有办法自动补齐。

2.属性设置(颜色、大小、透明度、点形状、线型等)

2.1手动设置

需要设置为有意义的值,把所有的点设置为同一颜色,直接指定是哪个颜色

属性 参数
颜色 color(red或是blue等)
大小 size(1到5mm)
形状 shape(有一套数字与之对应)
透明度 alpha(零点几或是百分之几)
填充颜 fill(有时候用不到)

自行设置有一定的要求:

手动设置需要设为有意义的值

颜色:字符串,blue,red等

大小:单位mm(一般为1到5),写的时候不要单位。

形状:数字编号表示,有25种形状,如shape=1。

ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length), 
             color = "blue")
##注意属性的位置为color = "blue",属性前的东西当模版用。这个位置可以加shape=1等。

ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), 
             size = 5,     # 点的大小5mm
             alpha = 0.5,  # 透明度 50%
             shape = 8)  # 点的形状

前面的属性设置和数据没有关系,如Sepal和Petal全部的点设置为蓝色。

设置一个与数据有关系的属性。

2.2 映射:按照数据框的某一列来定义图的某个属性
属性 参数
x轴 x
y轴 y
颜色 color
大小 size
形状 shape
透明度 alpha
填充颜色 fill
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))
##color = Species,点的颜色不是全蓝,根据品种的颜色来分配不同的颜色,与数据是完全挂钩的。

根据数据框上Species这一列不同取值来分配颜色,颜色的种类与这一列的取值有关,用默认的就可以。

映射vs手动设置:color = Species与 color = "blue"的区别:

(1)所从属的函数不同,映射的color = Species是aes里的参数,是列名;color = "blue"是手动设置的geom_point的参数,是具体的颜色。

(2)映射的点颜色,根据数据框的某一列,列有多少种取值,对应多少种颜色,与数据挂钩;手动设置只有一种颜色。

  • 映射:根据数据的某一列的值分配颜色。

  • 手动设置:把图形设置为一个或是n个颜色,与数据无关。

2.3 Q1 能不能自行指定映射的具体颜色?

不要默认的颜色,有些杂志有指定的颜色分配:

ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species))+
  scale_color_manual(values = c("blue","grey","red"))
##要求映射 color = Species);还有指定颜色scale_color_manual(values = c("blue","grey","red"),table列,看看有几个不同的取值,之后指定几种颜色。
##现成的语法,不允许乱改动。
##设定scale_color_manual(values = c("blue","grey","red")之前一定要有(指定)映射color = Species,
##除了scale_color_manual之外还有shape,scale_shape_manual,前提是要先指定映射shape=

映射:领导思维,只说按照某列分配颜色,不必须说具体是哪几种颜色。

自行指定映射的具体颜色(maual),values,不能少。

来自生信技能树小洁老师的课件图

在谷歌里输入十六进制颜色代码,就可以找到对应的颜色编码。还有配色的R包,会提供一系列的颜色。

2.4 Q2 区分color和fill两个属性

在大部分情况下是用不到的,只是在一部分情况下用到。

区分color和fill两个属性:实心和空心形状。

只用color的情况

Q2-1 空心形状和实心形状都用color设置颜色:shape=

library(ggplot2)
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
              shape = 17)#17号,实心的例子
             
ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 2) #2号,空心的例子
##两者用color来表示局就可以。单色图形,统一用color来表示,不用fill
  • fill:双色的情况,25个数字表示25种形状,21到24就是双色的例子,有边框又有内部填充颜色的形状才设置两个参数:color和fill。color是管边框的,fill是管内心的。
  • color为设置边框颜色,fill为填充图形颜色设置,color和fill是单独存在的,得看图形设置,两者有时候一起用,映射的对象是列名,color=列名,fill=列名。

Q2-2 既有边框又有内心的,才需要color和fill两个参数

ggplot(data = iris)+
  geom_point(mapping = aes(x = Sepal.Length,
                           y = Petal.Length,
                           color = Species),
             shape = 24,
             fill = "black") #24号,双色的例子

3. 分面

分面:根据一种属性,切换为几张子图,如iris的Species列有3种取值,把每种取值分为一张子图。

(拼图:把Species的3个品种分别画成点图,然后拼到一起。首先把iris切分为3个数据:a1,a2,a3,其次需要用相同的代码对3个数据画图,最后把这三张图拼到一起。拆数据,分别画图,拼图)

分面只需要仅仅一句代码,分面根据数据框的某一列来把图分成若干张子图,Species有3个品种,就分为3张,如果有100个品种就不要分面。

3.1 单分面: facet_wrap(~ Species) ,分面的列Species。
ggplot(data = iris) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_wrap(~ Species) 
##facet_wrap(~ Species),分面的依据是Species
3.2 双分面: facet_grid(Group ~ Species)

iris里没有Group这一列,可以加上,iris$Group=,但是比较麻烦,iris是一个公共的内置数据,这次对iris修改,下次使用iris时不一样,修改内置数据是一个非常坏的习惯。

dat = iris
##把iris的内容传递给dat,赋值给dat,之后对dat这个数据进行修改,不会同步到iris。
dat$Group = sample(letters[1:5],150,replace = T)
##dat$Group=,新增Group这一列;?sample的反馈:sample为随机取样的函数,letters[1:5],取前5个小写字母,内置数据不仅包括数据框还有向量,字母也是内置向量。150为取样的总体,replace = F为默认参数,不可放回,会报错,所以要设置replace = T,意思是可放回。

ggplot(data = dat) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_grid(Group ~ Species) 

满足分面的列首先得有重复值


以下是自己的思考与尝试:

分面依据的列,该列里面的数据类型是不是字符型?数值型可以吗?

可以的,自己探索,不知道有没有意义

dat = iris
dat$Group = sample(1:5,150,replace = T)
##sample(1:5,150,replace = T)处,1:3,纵分面更少
ggplot(data = dat) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_grid(Group ~ Species) 
  
dat = iris
dat$Group = sample(1:3,150,replace = T)
ggplot(data = dat) + 
  geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + 
  facet_grid(Group ~ Species) 

横线内是自己的尝试,可能没有意义,出于好奇。


4.几何对象

什么是几何对象?

指的是一个以geom开头的函数,能画出来的所有图形。所有的点(或是方块)看成一个整体,也称为几何对象,也称为图层。

<GEOM_FUNCTION>在入门级是被画点图geom_point()函数取代

来自生信技能树小洁老师的课件图

以上图区别是geom_后的参数不一样,把geom_point()函数换了,要注意输入数据,是不是x和y就可以了,如多边形,不是只要x和y就可以的。画什么样的几何图直接到网上搜对应的函数,不需要把每个函数都背诵下来。

局部设置和全局设置

几何对象可以叠:如线图和点图的叠加

4.1 局部设置
ggplot(data = iris) + 
  geom_smooth(mapping = aes(x = Sepal.Length, 
                          y = Petal.Length))+
  geom_point(mapping = aes(x = Sepal.Length, 
                           y = Petal.Length))
4.2 全局设置(简化代码)
ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
  geom_smooth()+
  geom_point()

局部设置和全局设置的代码不一样,但是出的图是一样的。

4.3 代码区别:
  • 第一个区别:

局部设置的代码里mapping写了两次,全局设置的mapping写在被当做模版处,

用ggplot画任何一张图,开头永远都是ggplot,后面可以用+连接若干个geom_函数,开头一定是ggplot,mapping放的位置不一样,效果是一样的,全局设置可以起简化作用。

现在有color,只想给点加上颜色,不想给曲线加颜色,在点图函数里加上映射:aes()。

两个或是多个画图函数一起画图,单独想给某个图形设置颜色,在该图形的函数里加映射aes(color=或是fill=)。

ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+
  geom_smooth()+
  geom_point(mapping = aes(color=Species))
##Species不能使用自动补齐
  • 第二个区别:映射

局部设置:仅对当前图层有效

全局设置:对所有图层有效

图层:geom_xxx()画出的单个几何对象。

练习题及代码:

### 1.尝试写出下图的代码
#数据是iris,x轴是Species,y轴是Sepal.Width,图是箱线图
ggplot(data = iris)+
  geom_boxplot(mapping = aes(x=Species,
                             y=Sepal.Width))
ggplot(data = iris)+
  geom_boxplot(mapping = aes(x=Species,
                             y=Sepal.Width,
                             fill=Species))
                             #color=Species
##fill=Species或是color=Species对比一下。color默认的颜色是黑色


### 2. 尝试在此图上叠加点图,
# 能发现什么问题?
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
             geom_boxplot()+
             geom_point()
##每个品种本来是有50个点,但是从图片上没有50个,因为点之间发生重合

5.统计变换

直方图:代码里只有指定x,没有指定y。

View(diamonds)
##diamonds为内置数据,5万多行,每一行记录一颗钻石的信息。
table(diamonds$cut)
##cut为切割质量,有5个等级,用直方图统计每个等级有多少颗钻石
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

ggplot(data = diamonds) + 
  stat_count(mapping = aes(x = cut))
##以上两句代码画出来的图是一样的。不同在于代码geom_bar,把这一列画一个直方图;stat_count()为统计变换函数,它和这些几何对象有一定的对应关系,在这里的意思是,把这一列统计并且画图展示。一个是画图,一个是展示数据。
##代码里只有指定x,没有指定y,cut里面有5个取值,每个取值重复若干次,作为纵坐标,是计算得来,自动计算。

统计变换使用场景

5.1 不统计,数据直接做图

有时候拿到的直方图不是原始数据,而是统计好的,两列的数据:每个等级以及出现的次数,使用表中数据直接作图,不统计。

fre = as.data.frame(table(diamonds$cut))
fre

ggplot(data = fre) +
  geom_bar(mapping = aes(x = Var1, y = Freq), stat = "identity")
##stat = "identity",意思是画只给的x和y,给啥画啥,不要统计。

使用场景2:不统计count,统计prop(比例)

有时候不需要统计数,而是统计比例:

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
##prop不是这个数据的某一列,所以写成这样..prop..为纵坐标,group = 1,把所有5万颗钻石当做一个整体,当作一个分组,如果不加group = 1,会把每个等级当作一组,各自占自己的100%。自己试了把group = 1去掉,没有比例,画出来为5根等长的柱形图。不习惯的是这个写法..prop..,大神就是大神,习惯就好。

6.位置调整

6.1 抖动的点图

有些数据很接近,画点图的时候,这些点会重叠,有两种方法

geom_point()加参数position,geom_jitter()函数是不要把横坐标限制严,在一个范围以内都属于该横坐标,范围宽一点,重合的点,横纵坐标错一下位,就不会发生重叠。

ggplot(data = mpg,mapping = aes(x = class, 
                                y = hwy)) + 
  geom_boxplot()+
  geom_point()

ggplot(data = mpg,mapping = aes(x = class, 
                                y = hwy)) + 
  geom_boxplot()+
  geom_jitter()

补充dotplot,点不重合,也不奔放

ggplot(data = mpg,mapping = aes(x = class, 
                                y = hwy)) + 
  geom_boxplot()+
  geom_dotplot(binaxis = "y",binwidth = .5,stackdir = "center")
6.2 堆叠直方图

直方图不是只能展示一个变量,可以展示两个变量,如数据集diamonds的两列:cut和clarity

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill=clarity))
##因为横纵坐标被占掉,对于clarity只能用颜色来表示
6.3 并列直方图
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

并列直方图与堆叠直方图之间就是多了一个参数:position = "dodge",堆叠直方图展示总体数字以及各自的比例,并列直方图展示每个切割质量的clarity具体数值。


7.坐标系

已经画好一张图,不想牵一发而动全身,即不想改很多东西,而是想把坐标系转一转,横纵坐标的对调

7.1 翻转坐标系coord_flip()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot() +
  coord_flip()
7.2 极坐标系coord_polar()

在直方图的基础上,用柱子表示数字换成用伞形的面积表示数字

bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    width = 1
  ) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)
bar
bar + coord_flip()
bar + coord_polar()

8.ggplot图片背景的设置:

ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
             geom_boxplot()+
             geom_point()

原图:

与背景相关的函数:theme_可能有9个

8.1 去灰色背景:加上 theme_bw()
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
  geom_boxplot()+
  geom_point()+
  theme_bw()
8.2 横纵坐标的框框消失:theme_classic()
ggplot(data = iris,mapping = aes(x=Species,y=Sepal.Width,fill=Species))+
  geom_boxplot()+
  geom_point()+
  theme_classic()

9.完整绘图模板

ggplot(data = <DATA>)+

<GEOM_FUNCTION>(mapping =aes(<MAPPINGS>)),到这里为初级绘图模版

stat=<STAT >,统计变换,不常用

position=<POSITION>,位置关系,不常用

)+

<COORDINATE_FUNCTION> + 坐标系的变换

<FACET_FUNCTION>分面

实战经验R语言--ggplot2(基础不牢,地动山摇)

说明

以上内容是听生信技能树小洁老师的R语言线上课,根据自己的理解记录下来,小洁老师授课非常细心,对不同水平的同学都照顾到,并且补充很多技巧以及注意事项。设计的练习题,对知识的掌握和理解有辅助作用。

更多学习资料:

官网链接:

https://ggplot2.tidyverse.org/

《R Graphics Cookbook, 2nd edition》

https://r-graphics.org/

《R for Data Science》

https://r4ds.had.co.nz/

《ggplot2: Elegant Graphics for Data Analysis》

https://ggplot2-book.org/

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

推荐阅读更多精彩内容