美文网首页R语言的学习
R语言_ggplot2绘图

R语言_ggplot2绘图

作者: Ashu | 来源:发表于2022-05-23 22:01 被阅读0次

    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/

    相关文章

      网友评论

        本文标题:R语言_ggplot2绘图

        本文链接:https://www.haomeiwen.com/subject/hqddprtx.html