10.2 形状和线形

10.2.1 问题

你想在图形中使用不同的形状和线条。

10.2.2 方案

在输出位图时,对符号 15-18 的渲染可能不具抗锯齿性,即无论这些图形的绘制是否来自同一个平台,这些符号都有可能会被拉伸变形,出现像素点,或者无法居中。符号 19 和 21-25 在填充部分外周会有边框线,在大部分情况下这种边线在渲染时其边缘都是平滑的。另外,要使符号 21-25 显示实心填充,需要指定与边线颜色 (col) 一致的填充 (bg) 颜色,否则这些符号将会是空心的。

10.2.2.1 标准图形

通过 pch 选项来设置符号形状, 并且通过 ltylwd 来设定线条的类型和粗细。线条的类型可以通过名字或数字来指定。

  1. set.seed(331)
  2. # 绘制一些点线
  3. # 设定绘画范围
  4. par(mar=c(3,3,2,2))
  5. plot(NA, xlim=c(1,4), ylim=c(0,1))
  6. # 绘制实心圆和实线
  7. points(1:4, runif(4), type="b", pch=19)
  8. # 添加空心方框和粗虚线
  9. points(1:4, runif(4), type="b", pch=0, lty=2, lwd=3)
  10. points(1:4, runif(4), type="b", pch=23, # 菱形符号
  11. lty="dotted", cex=2, # 点状线, 符号形状放大一倍
  12. col="#000099", bg="#FF6666") # 线条蓝色,符号形状红色填充

10.2 形状和线形 - 图1

10.2.2.2 ggplot2

在调用 ggplot2 的情况下,可以对图中的符号形状和线条类型进行全局的部署(比方说你想让所有数据点都是方形,所有的线条都为虚线),或者通过一个变量来调整它们。

  1. # 示例数据
  2. df <- read.table(header=T, text='
  3. cond xval yval
  4. A 1 2.0
  5. A 2 2.5
  6. B 1 3.0
  7. B 2 2.0
  8. ')
  9. library(ggplot2)
  10. # 使用标准的线条和符号形状作图
  11. # 用 group = cond 表示点线之间的对应关系
  12. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  13. geom_line() +
  14. geom_point()

10.2 形状和线形 - 图2

  1. # 设置全局的符号形状和线条类型
  2. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  3. geom_line(linetype="dashed", # 虚线
  4. size = 1.5) + # 加粗
  5. geom_point(shape = 0, # 空心方块
  6. size = 4) # 放大形状

10.2 形状和线形 - 图3

  1. # 通过变量 cond 调整符号图形和线类型
  2. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  3. geom_line(aes(linetype=cond), # cond 决定线条类型
  4. size = 1.5) + # 线条加粗
  5. geom_point(aes(shape=cond), # cond 决定形状
  6. size = 4) # 放大形状

10.2 形状和线形 - 图4

  1. # 在上述的基础上同时改变所使用的线条和形状
  2. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  3. geom_line(aes(linetype=cond), # cond 决定线条类型
  4. size = 1.5) + # 线条加粗
  5. geom_point(aes(shape=cond), # cond 决定形状
  6. size = 4) + # 放大形状
  7. scale_shape_manual(values=c(6,5)) + # 更改形状
  8. scale_linetype_manual(values=c("dotdash", "dotted")) # 更改线条类型

10.2 形状和线形 - 图5

一般来说 ggplot2 使用的是实心形状。如果你想要空心的形状又不想手动地对每个形状进行定义,可以设定 scale_shape(solid=FALSE)。注意,这个时候形状空心部分中的线条是可见的。为了避免这种情况,你可以使用符号形状 21-25 并且指定白色填充。

  1. # 空心形状
  2. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  3. geom_line(aes(linetype=cond), # cond 决定线条类型
  4. size = 1.5) + # 线条加粗
  5. geom_point(aes(shape=cond), # cond 决定符号形状
  6. size = 4) + # 放大形状
  7. scale_shape(solid=FALSE)

10.2 形状和线形 - 图6

  1. # 白色填充形状
  2. ggplot(df, aes(x=xval, y=yval, group = cond)) +
  3. geom_line(aes(linetype=cond), # cond 决定线条类型
  4. size = 1.5) + # 线条加粗
  5. geom_point(aes(shape=cond), # cond 决定符号形状
  6. fill = "white", # 白色填充
  7. size = 4) + # 放大形状
  8. scale_shape_manual(values=c(21,24)) # 形状:实心圆和三角形

10.2 形状和线形 - 图7

10.2.2.3 附录

以下代码会生成本章节开头所示的图表。

  1. par(mar = c(0, 0, 0, 0))
  2. # 设定绘图区域
  3. plot(NA, xlim = c(0, 1), ylim = c(6.5, -0.5), xaxt = "n",
  4. yaxt = "n", xlab = NA, ylab = NA)
  5. # 画线条
  6. for (i in 0:6) {
  7. points(c(0.25, 1), c(i, i), lty = i, lwd = 2, type = "l")
  8. }
  9. # 添加标签
  10. text(0, 0, "0. 'blank'", adj = c(0, 0.5))
  11. text(0, 1, "1. 'solid'", adj = c(0, 0.5))
  12. text(0, 2, "2. 'dashed'", adj = c(0, 0.5))
  13. text(0, 3, "3. 'dotted'", adj = c(0, 0.5))
  14. text(0, 4, "4. 'dotdash'", adj = c(0, 0.5))
  15. text(0, 5, "5. 'longdash'", adj = c(0, 0.5))
  16. text(0, 6, "6. 'twodash'", adj = c(0, 0.5))

10.2 形状和线形 - 图8