欢迎关注R语言数据分析指南
❝本节来介绍一个案例使用「gggibbous」包绘制月亮散点图,下面小编就通过一个案例来进行展示数据为随意构建无实际意义仅作图形展示用,添加了详细的注释希望各位观众老爷能够喜 ❞
关注下方公众号下回更新不迷路
加载R包
代码语言:javascript复制library(data.table)
library(tidyverse)
library(ggforce)
library(ggtext)
library(ggnewscale)
library(paletteer)
library(packcircles)
library(gggibbous)
导入数据
代码语言:javascript复制detectors <- fread("detectors.csv")
数据清洗
代码语言:javascript复制detectors$native = ifelse(detectors$native == "Yes", TRUE, FALSE)
# 对数据进行聚合,按'detector'、'kind'、和'.pred_class'列组合,并计算每个组合的计数
df = detectors[, by = .(detector, kind, `.pred_class`, native), .N]
# 对数据再次聚合,按'detector'、'kind'、和'.pred_class'列组合,并计算每个组合的频率和总计数
df = df[, by = .(detector, kind, `.pred_class`), c("Freq", "N2") := list(N / sum(N), sum(N))]
df$kind = df$kind |> factor(levels = c("Human", "AI"))
df$.pred_class = df$.pred_class |> factor(levels = c("AI", "Human"))
max_value = max(df$N2) # 计算'df'数据框中'N2'列的最大值
# 根据'kind'和'.pred_class'列创建新的'class'列,用于描述组合类型
df$class = paste0(df$kind, " - ", df$.pred_class)
df = df |> split(df$class) # 根据'class'列将'df'数据框分割成多个子数据框
# 对每个子数据框进行操作
packing <- lapply(df, function(x) {
# 按'detector'列对子数据框进行排序
x = x[order(detector)]
# 从子数据框中提取'detector'和'N2'列,并保留唯一的行
radius = x[, c("detector", "N2"), with = FALSE] |> unique()
# 计算用于圆形布局的值,并将结果存储到'out'数据框中
out = circleProgressiveLayout( (radius$N2 / max_value) / 20 )
out = setDT(out) # 将'out'数据框转换为数据表格式
index = match(x$detector, radius$detector) # 通过'detector'列匹配'x'数据框中的位置索引
x$x0 = out[index]$x x$kind |> as.numeric() # 计算x数据框中每个元素的横坐标,并存储在'x0'列中
x$y0 = out[index]$y x$`.pred_class` |> as.numeric() # 计算x数据框中每个元素的纵坐标,并存储在'y0'列中
x$r = out[index]$radius # 将x数据框中每个元素的半径信息存储在'r'列中
return(x)
})
packing <- rbindlist(packing) # 数据合并
数据可视化
代码语言:javascript复制ggplot()
# 添加散点图图层,其中数据来自packing数据框中具有缺失'native'列的行
geom_point(
data = packing[which(is.na(native))],
aes(x = x0, y = y0, size = r), fill = "#00A087",
color = "white", shape = 21, stroke = .25) # 设置点的颜色、形状、填充等属性
# 添加自定义的"moon"(月亮)图层,其中数据来自packing数据框中具有非缺失'native'列的行
geom_moon(data = packing[which(!is.na(native))],
aes(x0, y0, ratio = Freq, right = native, fill = native, size = r),
color = "white", stroke = .25) # 设置"moon"图层的颜色、填充等属性
scale_size_continuous(range = c(5, 15)) # 设置点大小的连续缩放范围
new_scale("size") # 创建一个新的点大小比例尺
# 设置新点大小比例尺的连续缩放范围
scale_size_continuous(range = c(.75, 3))
# 添加垂直虚线,x轴交叉点为1.5
geom_vline(xintercept = 1.5, linetype = "dashed", linewidth = .3)
# 添加水平虚线,y轴交叉点为1.5
geom_hline(yintercept = 1.5, linetype = "dashed", linewidth = .3)
# 设置x轴的刻度位置、标签和文本样式
scale_x_continuous(breaks = c(1, 2), labels = c("Human", "AI"), position = "top")
# 设置y轴的刻度位置、标签和文本样式
scale_y_continuous(breaks = c(1, 2), labels = c("AI", "Human"))
# 设置填充颜色的手动映射,并使用特定的调色板
scale_fill_manual(values = paletteer_d("ggsci::nrc_npg"),
guide = guide_legend(title.position = "top",
title.theme = element_text(face = "bold", size = 10),
nrow = 2)) # 设置图例的标题位置和样式
labs(x=NULL, y=NULL) # 设置x轴和y轴的标题为空
theme_minimal()
theme(panel.grid = element_blank(), # 隐藏网格线
axis.text.x.top = element_text(size = 10, margin = margin(b = 5), color = "black"), # 设置x轴顶部文本样式
axis.text.y = element_text(size = 10, margin = margin(r = 5), color = "black"), # 设置y轴文本样式
plot.background = element_rect(fill = "#f5f5f5", color = NA), # 设置图形背景颜色
plot.margin = margin(10, 2, 2, 2) # 设置图形的边距
)