10.2 形状和线形
10.2.1 问题
你想在图形中使用不同的形状和线条。
10.2.2 方案
在输出位图时,对符号 15-18 的渲染可能不具抗锯齿性,即无论这些图形的绘制是否来自同一个平台,这些符号都有可能会被拉伸变形,出现像素点,或者无法居中。符号 19 和 21-25 在填充部分外周会有边框线,在大部分情况下这种边线在渲染时其边缘都是平滑的。另外,要使符号 21-25 显示实心填充,需要指定与边线颜色 (col
) 一致的填充 (bg
) 颜色,否则这些符号将会是空心的。
10.2.2.1 标准图形
通过 pch
选项来设置符号形状, 并且通过 lty
和 lwd
来设定线条的类型和粗细。线条的类型可以通过名字或数字来指定。
set.seed(331)
# 绘制一些点线
# 设定绘画范围
par(mar=c(3,3,2,2))
plot(NA, xlim=c(1,4), ylim=c(0,1))
# 绘制实心圆和实线
points(1:4, runif(4), type="b", pch=19)
# 添加空心方框和粗虚线
points(1:4, runif(4), type="b", pch=0, lty=2, lwd=3)
points(1:4, runif(4), type="b", pch=23, # 菱形符号
lty="dotted", cex=2, # 点状线, 符号形状放大一倍
col="#000099", bg="#FF6666") # 线条蓝色,符号形状红色填充
10.2.2.2 ggplot2
在调用 ggplot2 的情况下,可以对图中的符号形状和线条类型进行全局的部署(比方说你想让所有数据点都是方形,所有的线条都为虚线),或者通过一个变量来调整它们。
# 示例数据
df <- read.table(header=T, text='
cond xval yval
A 1 2.0
A 2 2.5
B 1 3.0
B 2 2.0
')
library(ggplot2)
# 使用标准的线条和符号形状作图
# 用 group = cond 表示点线之间的对应关系
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line() +
geom_point()
# 设置全局的符号形状和线条类型
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line(linetype="dashed", # 虚线
size = 1.5) + # 加粗
geom_point(shape = 0, # 空心方块
size = 4) # 放大形状
# 通过变量 cond 调整符号图形和线类型
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line(aes(linetype=cond), # cond 决定线条类型
size = 1.5) + # 线条加粗
geom_point(aes(shape=cond), # cond 决定形状
size = 4) # 放大形状
# 在上述的基础上同时改变所使用的线条和形状
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line(aes(linetype=cond), # cond 决定线条类型
size = 1.5) + # 线条加粗
geom_point(aes(shape=cond), # cond 决定形状
size = 4) + # 放大形状
scale_shape_manual(values=c(6,5)) + # 更改形状
scale_linetype_manual(values=c("dotdash", "dotted")) # 更改线条类型
一般来说 ggplot2 使用的是实心形状。如果你想要空心的形状又不想手动地对每个形状进行定义,可以设定 scale_shape(solid=FALSE)
。注意,这个时候形状空心部分中的线条是可见的。为了避免这种情况,你可以使用符号形状 21-25 并且指定白色填充。
# 空心形状
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line(aes(linetype=cond), # cond 决定线条类型
size = 1.5) + # 线条加粗
geom_point(aes(shape=cond), # cond 决定符号形状
size = 4) + # 放大形状
scale_shape(solid=FALSE)
# 白色填充形状
ggplot(df, aes(x=xval, y=yval, group = cond)) +
geom_line(aes(linetype=cond), # cond 决定线条类型
size = 1.5) + # 线条加粗
geom_point(aes(shape=cond), # cond 决定符号形状
fill = "white", # 白色填充
size = 4) + # 放大形状
scale_shape_manual(values=c(21,24)) # 形状:实心圆和三角形
10.2.2.3 附录
以下代码会生成本章节开头所示的图表。
par(mar = c(0, 0, 0, 0))
# 设定绘图区域
plot(NA, xlim = c(0, 1), ylim = c(6.5, -0.5), xaxt = "n",
yaxt = "n", xlab = NA, ylab = NA)
# 画线条
for (i in 0:6) {
points(c(0.25, 1), c(i, i), lty = i, lwd = 2, type = "l")
}
# 添加标签
text(0, 0, "0. 'blank'", adj = c(0, 0.5))
text(0, 1, "1. 'solid'", adj = c(0, 0.5))
text(0, 2, "2. 'dashed'", adj = c(0, 0.5))
text(0, 3, "3. 'dotted'", adj = c(0, 0.5))
text(0, 4, "4. 'dotdash'", adj = c(0, 0.5))
text(0, 5, "5. 'longdash'", adj = c(0, 0.5))
text(0, 6, "6. 'twodash'", adj = c(0, 0.5))