ggforce优雅的绘制线圈棒棒糖图

2023-08-18 13:45:21 浏览数 (2)

欢迎关注R语言数据分析指南

❝本节来介绍如何使用「ggforce」包来自定义画线圈来绘制棒棒糖图,下面小编就通过一个案例来进行展示数据为随意构建无实际意义仅作图形展示用,希望各位观众老爷能够喜欢。 ❞

加载R包

代码语言:javascript复制
library(tidyverse)
library(janitor)
library(ggtext)
library(ggforce)
library(ggfx)
library(colorspace)

导入数据

代码语言:javascript复制
yarn <- read_csv("data.csv")

构建调色板

代码语言:javascript复制
pal <- tribble(~r, ~g, ~b,198, 114, 67,
  220, 166, 146,180, 185, 163,129, 160, 149,30, 166, 179) %>% 
  mutate(pal = rgb(r, g, b, maxColorValue = 255)) %>% 
  pull(pal)

pal <- colorRampPalette(pal)(8)

数据清洗

代码语言:javascript复制
df_base <- yarn %>% 
  group_by(yarn_company_name) %>%  # 按 yarn_company_name 分组
  summarise(rating = mean(rating_average, na.rm = TRUE),n = n()) %>%  # 计算平均评分和数量
  arrange(desc(n)) %>%  # 按数量降序排列
  head(8) %>%  # 选择前 8 条数据
  ungroup() %>%  # 取消分组
  mutate(p = n/sum(n),x0 = 1:n())  # 计算百分比和 x 坐标

df_yarn <- map_dfr(1:nrow(df_base), ~{
  tibble(
    x = 3*df_base$p[.x]*sin(seq(0, 2*pi, length = 200))   df_base$x0[.x],  # 计算 x 坐标
    y = 3*df_base$p[.x]*cos(seq(0, 2*pi, length = 200))   df_base$rating[.x] - 3*df_base$p[.x],  # 计算 y 坐标
    id = runif(200),yarn_company_name = df_base$yarn_company_name[.x]  # 生成随机 id 和 yarn_company_name
    )}) %>% 
  mutate(y = -y) %>%  # 反转 y 坐标
  arrange(yarn_company_name, id)  # 按 yarn_company_name 和 id 排序

数据可视化

代码语言:javascript复制
df_yarn %>% 
  ggplot(aes(x, y))  
  geom_rect(aes(xmin=0.5,xmax=8.5,ymin=-1.2,ymax = -1),fill = lighten("#d4a373", 0.2))    # 绘制矩形背景
  with_blur(geom_segment(aes(x = x0, xend = x0, y = -1, yend = -rating 0.2,
                             colour = yarn_company_name), df_base, size = 0.6),sigma = 3)    # 绘制模糊线段
  with_blur(geom_bspline0(aes(colour = yarn_company_name),size=0.6),sigma=3)    # 绘制模糊曲线
  geom_text(aes(x0, -rating-0.2, label = paste0(yarn_company_name, "nnn",round(rating, 1), "|", n)),
            df_base,size =4, colour = "black", lineheight = 0.3)    # 绘制文本标签
  coord_cartesian(clip = "off")    # 设置坐标系
  scale_colour_manual(values = pal,breaks = df_base$yarn_company_name)    # 设置颜色
  scale_x_continuous(breaks = 1:8,labels = df_base$yarn_company_name)    # 设置 x 轴刻度
  ylim(-5, -1)    # 设置 y 轴范围
  theme_void()    # 设置空白主题
  theme(
    text = element_text(size =4, colour = "grey20"),
    legend.position = "none",
    plot.background = element_rect(fill ="white", colour = "grey20"),
    plot.margin = margin(t=20,b=0,l=20,r=20))  # 设置主题样式

0 人点赞