[R包分享] ggtextcircle绘制环状文本

2024-07-02 16:16:36 浏览数 (1)

欢迎关注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):将角度转换为度数,并调整为适合文本标签的角度。这是为了使文本标签正确地沿着圆弧排列。
代码语言:javascript复制
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 中实现圆形文本布局。

代码语言:javascript复制
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()

0 人点赞