❝本节来介绍一个简单的R包:ggtextcircle,主要用来制作环状文本,代码及数据均来自作者官网文档,更多详细内容请参考官方文档。
❝https://github.com/nrennie/ggtextcircle
devtools::install_github("nrennie/ggtextcircle")
# unlink(tempdir(), recursive = TRUE) 清除临时文件与缓存
library(tidyverse)
library(ggtextcircle)
该包主要有两个函数组成,下面来解析一下
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))
)
}
这个函数的主要目的是生成每个文本标签在圆上的坐标和角度,以便它们可以围绕圆形排列。它使用以下步骤完成
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)
)
)
❝使用 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 图层,这个对象计算文本标签的位置和角度,使它们形成一个圆形。
births <- read_csv("births.csv")
deaths <- read_csv("deaths.csv")
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()