欢迎关注R语言数据分析指南公众号
❝本节来介绍一个简单的R包:ggtextcircle,主要用来制作环状文本,代码及数据均来自作者官网文档,更多详细内容请参考官方文档。
官方文档
❝https://github.com/nrennie/ggtextcircle
安装R包
代码语言:javascript复制devtools::install_github("nrennie/ggtextcircle")
# unlink(tempdir(), recursive = TRUE) 清除临时文件与缓存
library(tidyverse)
library(ggtextcircle)
该包主要有两个函数组成,下面来解析一下
代码语言:javascript复制compute_panel_textcircle <- function(
data,
scales,
r = 3,
x0 = 0,
y0 = 0,
start = 45,
end = -45) {
dplyr::mutate(
data,
theta = seq(((pi * start) / 180), pi * (2 ((end) / 180)),
length.out = nrow(data)
),
x = x0 r * cos(.data$theta),
y = y0 r * sin(.data$theta),
angle = 180 360 * (.data$theta / (2 * pi))
)
}
参数解释
- data: 输入的数据框,通常包含需要注释的文本标签。
- scales: 这个参数通常由 ggplot2 内部处理,在这里并没有具体使用。
- r: 圆的半径,默认为 3。这是文本标签围绕的圆的大小。
- x0: 圆心的 x 坐标,默认为 0。
- y0: 圆心的 y 坐标,默认为 0。
- start: 起始角度,默认为 45 度。表示第一个文本标签的起始位置。
- end: 结束角度,默认为 -45 度。表示最后一个文本标签的位置。
函数功能:
这个函数的主要目的是生成每个文本标签在圆上的坐标和角度,以便它们可以围绕圆形排列。它使用以下步骤完成
- 1.计算角度 (theta):使用 seq 函数生成一系列等间隔的角度,从起始角度 start 到结束角度 end。这些角度是以弧度表示的,因为三角函数(cos 和 sin)接受弧度作为参数。
- 2.计算 x 和 y 坐标:使用极坐标公式将角度转换为笛卡尔坐标: • x = x0 r * cos(theta):根据角度和半径计算每个标签的 x 坐标。 • y = y0 r * sin(theta):根据角度和半径计算每个标签的 y 坐标。
- 3.计算角度 (angle):将角度转换为度数,并调整为适合文本标签的角度。这是为了使文本标签正确地沿着圆弧排列。
StatTextcircle <- ggplot2::ggproto(
`_class` = "StatTextcircle",
`_inherit` = ggplot2::Stat,
required_aes = c("label"),
compute_panel = compute_panel_textcircle,
default_aes = ggplot2::aes(
x = ggplot2::after_stat(x),
y = ggplot2::after_stat(y)
)
)
代码语言:javascript复制❝使用 ggproto 定义了一个新的 ggplot2 统计对象 StatTextcircle。这个对象继承自 ggplot2 的 Stat 类,并定义了一些自定义的行为和属性,用于在 ggplot2 中实现圆形文本布局。
stat_textcircle <- function(geom = ggplot2::GeomText,
mapping = NULL,
data = NULL,
position = "identity",
na.rm = FALSE,
hjust = 1,
show.legend = NA,
inherit.aes = TRUE, ...) {
ggplot2::layer(
stat = StatTextcircle,
geom = geom,
data = data,
mapping = mapping,
position = position,
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(na.rm = na.rm, hjust = hjust, ...)
)
}
geom_textcircle <- stat_textcircle
❝stat_textcircle 函数是一个自定义的统计变换函数,用于计算文本注释在圆形布局中的位置。它使用一个自定义的统计对象 (StatTextcircle) 来创建一个新的 ggplot2 图层,这个对象计算文本标签的位置和角度,使它们形成一个圆形。
关键部分:
- 1.geom:指定用于显示数据的几何对象。默认情况下设置为 ggplot2::GeomText,这意味着文本注释。
- 2.mapping:通过 aes() 或 aes_() 创建的美学映射。这个参数描述了数据中的变量如何映射到视觉属性。
- 3.data:要显示的数据。
- 4.position:指定图层中几何对象的位置调整方式。默认值为 "identity",即不进行位置调整。
- 5.na.rm:逻辑值,是否移除缺失值。默认值为 FALSE。
- 6.hjust:文本水平对齐方式,默认值为 1。
- 7.show.legend:逻辑值,是否在图例中显示这个图层,默认值为 NA。
- 8.inherit.aes:逻辑值,是否继承全局美学映射,默认值为 TRUE。
- 9.…:其他传递给层的参数。
实际案例
代码语言:javascript复制births <- read_csv("births.csv")
deaths <- read_csv("deaths.csv")
代码语言:javascript复制ggplot()
geom_textcircle(
data = dplyr::filter(births, year_birth >= 1900),
mapping = aes(label = person),
colour = "#35978f",
r = 6,
size = 2.5
)
geom_textcircle(
data = dplyr::filter(deaths, year_death >= 1900),
mapping = aes(label = person),
colour = "#bf812d",
r = 3,
size = 2.5
)
scale_x_continuous(limits = c(-8, 8))
scale_y_continuous(limits = c(-8, 8))
coord_fixed()
theme_void()