ggplot2学习(二)

作者: 韧心222 | 来源:发表于2022-02-17 16:35 被阅读0次

    ggplot2基础(2)——坐标轴

    ggplot2基础(1)
    ggplot2基础(2)——坐标轴
    ggplot2基础(3)——注释
    ggplot2基础(4)——主题
    ggplot2基础(5)——配色与图例

    众所周知,使用ggplot画出图片并不难,难的是对细节的把握,即当需要对某些细节进行调整时,往往需要花费大量的精力,因此接下来的几篇文章,我会结合自己的学习,介绍一些对图片细节的调整

    参考《R语言实战》、《R数据可视化手册》、《R语言可视化———— ggplot 坐标系》《R|ggplot2(三)|coord 系列函数坐标轴转换》

    ggplot2对于坐标轴的操作主要有以下几个函数:

    • scale_x_continuous
    • scale_y_continuous
    • scale_x_discrete
    • scale_y_discrete
    • scale_x_log10
    • scale_y_log10
    • coord_flip
    • ylim
    • xlim
    • ylabs
    • xlabs
    • labs
    • expand_limits
    • coord_fixed

    此外还有坐标系的选择等一系列函数:

    • 极坐标 coord_polar
    • 对数坐标
    • 笛卡尔坐标系 coord_cartesian
    • 变换笛卡尔坐标系 coord_trans

    1 scale_x_continuous、scale_y_continuous

    scale_x_continous/scale_y_continous函数的定义如下:

    scale_x_continuous(
        name = , #坐标轴标签
        breaks = , #定义刻度线
        minor_breaks = ,
        labels = , #刻度标签
        limits = , # 设置值域范围
        expand = c(0.05,0), 
        #坐标轴延伸,确保图形元素不覆盖坐标
        oob = censor,#识别越过边界的点
        na.value = NA_real_,
        trans = 'identity', #数据变换
        position = 'bottom', #left/right/top
        sec.axis = #定义第二坐标轴
    )
    

    通过这个函数,可以实现以下功能:

    1.1 设置坐标轴的值域范围 —— limits

    通过指定limits参数,可是设置坐标轴的显示范围,在不进行limits参数设置时,其图像为:

    library(ggplot2)
    
    ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot()
    
    image.png

    如果指定了limits参数,则可以看到图片的y轴范围发生了明显的变化:

    ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_y_continuous(limits=c(0, 10))
    
    image.png

    当使用scale_x_continuousscale_y_continuous函数进行坐标轴范围设置的时候,需要注意几个问题:

    • xlimylim两个函数实际上是scale_x_continuousscale_y_continuous函数的简化写法
    • 如果设置的范围小于实际的数据范围,则会对数据进行一定的剪除(系统会给出相应的警告),如果要避免数据剪除的问题,则应使用coord_cartesian函数,具体的代码如下:
    # install.packages("cowplot")
    library(cowplot)
    p0 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot()
    
    p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_y_continuous(limits=c(5, 6.5))
    
    p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        coord_cartesian(ylim=c(5, 6.5))
    
    plot_grid(p0, p1, p2, labels = LETTERS[1:3])
    

    警告信息提示有13行的数据没有显示:

    Warning message:
    "Removed 13 rows containing non-finite values (stat_boxplot)."
    
    image.png

    1.2 设置刻度线——breaks&labels

    要想对图中的刻度线进行设置,需要调整breaks参数和labels,例如:

    library(cowplot)
    
    p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8))
    
    p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8), labels=c("label1", "label2", "label3", "label4", "label5", "label6"))
    
    p3 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_y_continuous(NULL)
    
    plot_grid(p1, p2, p3, labels = LETTERS[1:3])
    
    image.png

    1.3 设置坐标轴标签——names参数与labs函数

    设置坐标轴的标签比较简单,只需要设置names参数即可,此外与limits参数类似,labs系列函数(包括labsxlabsylabs)都是对scale_x_continuousscale_y_continuous函数的简化写法,如果不需要设置坐标轴标签,则需要将name参数指定为NULL。当然也可以将其设置为"",其区别在于是否使用空字符串进行占位显示。

    1.4 坐标变换的三种写法

    此处的坐标变换主要指的是指数变换、对数变换等,以便于将数据显示的更为美观。要想实现坐标变换,至少有三种方式,此处我们结合scale_x_continuousscale_y_continuous来做介绍。

    1.4.1 基于trans参数

    trans可使用的参数包括"log2""log10""sqrt"等,如果结合scale包,则可以实现更多变换

    trans可使用的参数列表:"asn", "atanh", "boxcox",
    "date", "exp", "hms",
    "identity", "log", "log10",
    "log1p", "log2", "logit",
    "modulus", "probability", "probit",
    "pseudo_log", "reciprocal", "reverse",
    "sqrt" "time"

    library(MASS)
    
    p1 <- ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
        geom_text(size=3)
    
    p2 <- ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
        geom_text(size=3) +
        scale_x_continuous(trans="log10", breaks=10^(-1:5)) +
        scale_y_continuous(trans="log10")
    
    plot_grid(p1, p2, labels = LETTERS[1:2], nrow=2)
    
    image.png

    1.4.2 基于scale_x_log10scale_y_log10等函数

    相对而言,这种写法最为死板。其具体代码为:

    ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
        geom_text(size=3) +
        scale_x_log10(breaks=10^(-1:5)) +
        scale_y_log10()
    
    image.png

    1.4.3 基于coord_trans函数

    coord_trans函数的定义为:

    coord_trans(
      x = "identity",
      y = "identity",
      xlim = NULL,
      ylim = NULL,
      limx = "DEPRECATED",
      limy = "DEPRECATED",
      clip = "on",
      expand = TRUE
    )
    

    可以看到coord_trans函数的参数与我们之前介绍的非常类似,常规的变换需要在x和y处进行设置,其内容可以参考1.4.1部分的内容。

    ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
        geom_text(size=3) +
        coord_trans("log10", "log10")
    

    从上图中可以看到,尽管coord_trans与scale_x_log10函数的效果是一样的,但是还是有一些细微的差别,scale系列函数是先将数据取对数,再用转换后的数据进行处理(比如拟合),而coord_trans函数则是先进行处理,然后再进行绘图,下图给出了一个明显的例子。可以看出图A中是先进行了变换,然后才进行的拟合操作,因此绘制出的图像是一条直线;而图B中是先进行了拟合,然后才绘图,所以得到的是一条曲线。

    d <- subset(diamonds, carat > 0.5)
    
    p1 <- ggplot(d, aes(carat, price)) +
      geom_point() +
      geom_smooth(method = "lm") +
      scale_x_log10() +
      scale_y_log10()
    
    p2 <- ggplot(d, aes(carat, price)) +
      geom_point() +
      geom_smooth(method = "lm") +
      coord_trans(x = "log10", y = "log10")
    
    plot_grid(p1, p2, labels = LETTERS[1:2], nrow = 2)
    
    image.png

    2 scale_x_discrete、scale_y_discrete

    离散型的scale_x与scale_y与连续型的非常相似,此处就不做过多的介绍了,这里只介绍一点点小小的差别。

    要想调整离散型坐标的顺序,需要指定limits参数,即:

    p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_x_discrete(limits=c("trt1", "ctrl", "trt2")) + coord_fixed(ratio = 1)
    
    p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
        geom_boxplot() +
        scale_x_discrete(limits=rev(levels(PlantGrowth$group)))+ coord_fixed(ratio = 1)
    
    plot_grid(p1, p2, labels = LETTERS[1:2], nrow = 2) 
    
    image.png

    3 coord_fixed

    coord_fixed函数的定义为:

    coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, expand = TRUE, clip = "on")
    

    该函数主要用于调整纵横坐标的比例,默认为1:1,如果需要调整则可直接指定,例如:

    ggplot(mtcars, aes(wt, drat)) + 
        geom_point()
    
    image.png
    ggplot(mtcars, aes(wt, drat)) + 
        geom_point() +
        coord_fixed(ratio=1/2)
    
    image.png

    4 极坐标

    本质上而言,ggplot2中的极坐标,是将图片的某一个轴映射为角度信息,因此极坐标的函数定义为:

    coord_polar(theta = "x", start = 0, direction = 1, clip = "on")
    

    其中,theta表示的是转换为角度的坐标轴,默认为x轴,例如在绘制饼图的时候,可以使用如下代码:

    p1 <- ggplot(mtcars, aes(x = factor(1), fill = factor(cyl))) +
      geom_bar()
    
    p2 <- p1 + 
        coord_polar(theta="y")
    
    plot_grid(p1, p2, nrow = 1)
    
    image.png

    相关文章

      网友评论

        本文标题:ggplot2学习(二)

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