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

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
  ))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

名本无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值