美文网首页基本图形绘制R ggplotR plot
R 数据可视化 —— ggplot 标度(二)

R 数据可视化 —— ggplot 标度(二)

作者: 名本无名 | 来源:发表于2021-03-30 15:47 被阅读0次

    3. 设置值范围

    除了设置坐标轴的范围,我们也可以设置图形中必须包含某个或某些值。

    可以使用 expand_limits() 函数,该函数接受一个命名列表,名称必须为图形属性

    示例

    对于下面这张散点图

    p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
    
    > mtcars %>% distinct(mpg) %>% summarise(min=min(.), max=max(.))
       min  max
    1 10.4 33.9
    > mtcars %>% distinct(wt) %>% summarise(min=min(.), max=max(.))
        min   max
    1 1.513 5.424
    

    从上面的结果中,我们可以计算出:X 轴(mpg)和 Y 轴(wt)的数据范围

    下面,让我们用 expand_limits 来调整数据范围

    p1 <- p + expand_limits(x = 0)
    
    p2 <- p + expand_limits(y = c(1, 9))
    
    p3 <- p + expand_limits(x = 0, y = 0)
    
    plot_grid(p1, p2, p3, labels = c('A', 'B', 'C'), nrow = 1)
    

    在图 A 中,我们设置 X 轴数据要包含 0,尽管并没有对应的值,但是 X 坐标轴还是会从 0 开始。

    类似的,图 B 设置了 Y 轴需要包含 19,超过了数据的范围,相当于扩大了 Y 轴的范围

    我们还可以对颜色进行设置

    p1 <- ggplot(mtcars, aes(mpg, wt)) +
      geom_point(aes(colour = cyl)) +
      expand_limits(colour = seq(2, 10, by = 2))
    
    p2 <- ggplot(mtcars, aes(mpg, wt)) +
      geom_point(aes(colour = factor(cyl))) +
      expand_limits(colour = factor(seq(2, 10, by = 2)))
    
    plot_grid(p1, p2, labels = c('A', 'B'))
    

    A 图设置了渐变色,B 图是离散配色。

    > mtcars %>% distinct(cyl)
                      cyl
    Mazda RX4           6
    Datsun 710          4
    Hornet Sportabout   8
    

    我们可以看到,其实颜色的值只有三个 468,但是我们设置了 5 个不同的颜色层级。

    B 图可以明显看出,210 的颜色并没有显示,因为不存在相应的数据

    4. 设置间隔

    可以使用 expansion() 函数设置数据与轴之间的间隔,该函数主要搭配 scale_(x|y)_continuousscale_(x|y)_discrete 使用。

    # 推荐使用
    expansion(mult = 0, add = 0)
    
    # 已被弃用
    expand_scale(mult = 0, add = 0)
    

    该函数包含两个参数:

    • mult: 百分比间距,接受一个向量,如果向量长度为 1,则上下间距的间隔是一样的,如果长度为 2,则 mult[1] 为下间距,mult[2] 为上间距
    • add: 常数值单位间距,类似 mult

    示例

    p1 <- ggplot(mtcars) +
      geom_bar(aes(x = factor(cyl)))
    
    p2 <- ggplot(mtcars) +
      geom_bar(aes(x = factor(cyl))) +
      scale_y_continuous(expand = expansion(mult = c(0, .1)))
    
    p3 <- ggplot(subset(diamonds, carat > 2), aes(cut, clarity)) +
      geom_jitter() +
      scale_x_discrete(expand = expansion(add = 2))
    
    p4 <- ggplot(subset(diamonds, carat > 2), aes(cut, price)) +
      geom_jitter() +
      scale_x_discrete(expand = expansion(add = .6)) +
      scale_y_continuous(expand = expansion(mult = .05))
    
    plot_grid(p1, p2, p3, p4, labels = LETTERS[1:4],
              nrow = 2)
    

    其中,D 图所设置的间距是默认值

    5. 设置透明度

    alpha 透明度并不是非常有用,但它可以方便地从视觉上降低不太重要的观察结果的权重

    设置透明度的函数包括:

    scale_alpha(..., range = c(0.1, 1))
    
    scale_alpha_continuous(..., range = c(0.1, 1))
    
    scale_alpha_binned(..., range = c(0.1, 1))
    
    scale_alpha_discrete(...)
    
    scale_alpha_ordinal(..., range = c(0.1, 1))
    

    其中 scale_alphascale_alpha_continuous 的别名,因为这个函数是最常用的。

    其中 range 参数的值为透明度的范围,必须在 0-1 之间。

    其他参数分别被 continuous_scale(), binned_scale, 和 discrete_scale() 解析

    示例

    首先在 aes 中设置透明度,如

    p <- ggplot(mpg, aes(displ, hwy)) +
      geom_point(aes(alpha = year))
    

    然后使用标度函数来修改透明度范围

    p1 <- p + scale_alpha("cylinders")
    
    p2 <- p + scale_alpha(range = c(0.4, 0.8))
    
    plot_grid(p1, p2, labels = LETTERS[1:2],
              nrow = 1)
    

    在图 A 中,我们传递了一个字符串,相当于设置了 name 参数的值,更改了图例的名称

    自定义透明度

    p <- ggplot(mpg, aes(displ, hwy)) +
      geom_point(aes(alpha = factor(year)))
    
    p + scale_alpha_manual(values = c(0.1, 0.2))
    

    6. 设置线条类型

    线条的类型可以使用 0-6 之间的整数来指定,分别代表

    0 = blank         1 = solid
    2 = dashed        3 = dotted
    4 = dotdash       5 = longdash
    6 = twodash
    

    绘制所有的线条类型

    df_lines <- tibble(
      linetype = factor(0:6)
    )
    
    ggplot(df_lines) +
      geom_hline(aes(linetype = linetype, yintercept = 0), size = 2) +
      scale_linetype_discrete() +
      facet_grid(linetype ~ .) +
      theme_void(20)
    

    线条类型不支持连续型数据,因为无法将连续型数据映射到线型。但是可以使用 scale_linetype_binned(),由于线型没有固定的顺序,也不推荐这样使用

    示例

    对于数据

    > economics_long
    # A tibble: 2,870 x 4
       date       variable value  value01
       <date>     <chr>    <dbl>    <dbl>
     1 1967-07-01 pce       507. 0       
     2 1967-08-01 pce       510. 0.000265
     3 1967-09-01 pce       516. 0.000762
     4 1967-10-01 pce       512. 0.000471
     5 1967-11-01 pce       517. 0.000916
     6 1967-12-01 pce       525. 0.00157 
     7 1968-01-01 pce       531. 0.00207 
     8 1968-02-01 pce       534. 0.00230 
     9 1968-03-01 pce       544. 0.00322 
    10 1968-04-01 pce       544  0.00319 
    # … with 2,860 more rows
    

    我们根据 variable 变量进行分组,绘制折线图

    base <- ggplot(economics_long, aes(date, value01))
    base + geom_line(aes(group = variable))
    

    注意:我们是通过设置 group = variable 来设置分组的,但是组与组之间没有区分度。

    为图片添加线型和颜色

    base + geom_line(aes(linetype = variable, colour=variable))
    

    这样,每组之间的趋势就很明显了。

    自定义线条映射

    df <- economics_long %>% filter(variable %in% c("pop", "pce", "uempmed")) 
    
    lt <- c("pop"=1, "pce"=3, "uempmed"=5)
    
    ggplot(df, mapping = aes(date, value01)) +
      geom_line(aes(linetype = variable, colour=variable)) +
      scale_linetype_manual(values = lt)
    

    7. 设置形状

    scale_shape() 函数可以将离散变量映射为 6 个不同的形状。

    如果你有超过 6 个类别,你将会得到一个警告信息,并且第 7 个或更后面的类别将不会在图片中显示

    形状与线型一样,不支持连续型数据,也不推荐使用 scale_shape_binned 函数来设置

    scale_shape(..., solid = TRUE)
    
    scale_shape_binned(..., solid = TRUE)
    

    其中 solid 参数控制形状是不是实心的

    下面的代码展示了所有的形状

    df_shapes <- data.frame(shape = 0:25)
    
    ggplot(df_shapes, aes(0, 0, shape = shape)) +
      geom_point(aes(shape = shape), size = 5, fill = 'red') +
      scale_shape_identity() +
      facet_wrap(~shape) +
      theme_void()
    

    取值范围为 0-25,共 26 个整数值分别代表了相应的形状。

    注意:红色的形状是可以设置填充色(fill)的,其他形状只能设置轮廓颜色(colour)。

    示例

    dsmall <- diamonds[sample(nrow(diamonds), 100), ]
    
    d <- ggplot(dsmall, aes(carat, price)) + geom_point(aes(shape = cut))
    
    p2 <- d + scale_shape(solid = FALSE)
    
    p3 <- d + scale_shape(name = "Cut of diamond")
    
    levels(dsmall$cut) <- c("Fair", "Good", "Very Good", "Premium", "Ideal")
    p4 <- ggplot(dsmall, aes(price, carat)) + geom_point(aes(shape = cut))
    
    plot_grid(d, p2, p3, p4, labels = LETTERS[1:4])
    

    注意:在绘制图 D 时,会输出警告信息,提示不建议对排序的变量设置形状

    自定义形状映射

    shape_map <- c("Fair"=13, "Good"=20, "Very Good"=15, "Premium"=2, "Ideal"=11)
    
    d + scale_shape(solid = FALSE) +
      scale_shape_manual(values = shape_map)
    

    8. 设置大小

    一般只有点图和文本需要设置大小。而我们通常是将数据映射到点的面积,而不是映射到半径。

    标度函数如下

    scale_size(..., range = c(1, 6))
    
    scale_radius(..., range = c(1, 6))
    
    scale_size_binned(..., range = c(1, 6))
    
    scale_size_area(..., max_size = 6)
    
    scale_size_binned_area(..., max_size = 6)
    

    如果需要将值为 0 的点映射为 0,需要使用 scale_size_area 函数

    示例

    例如,下面这张散点图

    p <- ggplot(mpg, aes(displ, hwy, size = hwy)) +
      geom_point()
    
    # 设置图例标题
    p1 <- p + scale_size("Highway mpg")
    
    # 设置点的大小范围
    p2 <- p + scale_size(range = c(0, 10))
    
    # 允许将 0 值映射为面积为 0 的点(不绘制)
    p3 <- p + scale_size_area()
    
    # 方便从看出图例中看出分箱
    p4 <- p + scale_size_binned()
    
    # This is most useful when size is a count
    p5 <- ggplot(mpg, aes(class, cyl)) +
      geom_count() +
      scale_size_area()
    
    # 将数据映射为半径,不推荐
    p6 <- p + scale_radius()
    
    plot_grid(p1, p2, p3, p4, p5, p6,
              labels = LETTERS[1:6], nrow = 3)
    

    自定义数据大小,我们根据 cyl 的值倒序设置点的大小

    ggplot(mpg, aes(displ, hwy, size = factor(cyl))) +
      geom_point() +
      scale_size_manual(
        name="cyl",
        values = c(
        "4" = 5,
        "5" = 4,
        "6" = 3,
        "8" = 2
      ))
    

    相关文章

      网友评论

        本文标题:R 数据可视化 —— ggplot 标度(二)

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