科研绘图系列:R语言圆形柱状图(circular barplot)

文摘   2024-07-10 09:54   广东  

专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:

百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码

介绍

圆形柱状图(circular barplot),又称为雷达图或蜘蛛网图(Spider Chart),是一种用来展示多变量数据的图表。这种图表使用一个圆形的网格,将数据变量分布在一个或多个从中心点向外延伸的轴上,每个轴代表一个变量,数据点在轴上的位置表示该变量的值。然后,将这些点连接起来,形成一个闭合的多边形或折线。

特点

  • 多变量展示:能够同时展示多个变量的数据。

  • 相对比较:可以直观地比较不同变量之间的相对大小。

  • 中心基准*:所有变量的数据都以图表的中心为基准点。

适合情况

  • 多维数据比较:当需要比较多个对象在多个维度上的表现时,例如不同产品的多个性能指标。

  • 特征展示:展示一个对象的多个特征或属性,如运动员的各项体能指标。

  • 趋势分析:观察某一变量或多个变量随时间变化的趋势。

注意事项

  • 避免过度拥挤:如果变量太多,图表可能会变得复杂难以解读。

  • 标准化数据:为了确保比较的公平性,通常需要将数据标准化到同一尺度。

  • 适当的标签:每个轴应该清晰地标记所代表的变量,以便于理解图表。

加载R包

knitr::opts_chunk$set(message = FALSE, warning = FALSE)

library(tidyverse)
library(stringr)

rm(list = ls())
options(stringsAsFactors = F)
options(future.globals.maxSize = 10000 * 1024^2)

导入数据

hike_data <- readr::read_rds("./inputdata/40-hike_data.rds")

head(hike_data)
namelocationlengthgainhighpoint
Lake Hills GreenbeltPuget Sound and Islands -- Seattle-Tacoma Area2.3 miles, roundtrip50330.0
Snow LakeSnoqualmie Region -- Snoqualmie Pass7.2 miles, roundtrip18004400.0
Skookum FlatsMount Rainier Area -- Chinook Pass - Hwy 4107.8 miles, roundtrip3002550.0
Teneriffe FallsSnoqualmie Region -- North Bend Area5.6 miles, roundtrip15852370.0
Twin FallsSnoqualmie Region -- North Bend Area2.6 miles, roundtrip5001000.0
Chenuis FallsMount Rainier Area -- NW - Carbon River/Mowich8.0 miles, roundtrip5002200.0

数据预处理

  • 提取regionlength_num

  • 汇总统计数据用于画柱状图

hike_data$region <- as.factor(word(hike_data$location, 1, sep = " -- "))
hike_data$length_num <- as.numeric(sapply(strsplit(hike_data$length, " "), "[[", 1))

plotdata <- hike_data %>%
dplyr::group_by(region) %>%
dplyr::summarise(
sum_length = sum(length_num),
mean_gain = mean(as.numeric(gain)),
n = dplyr::n()
) %>%
dplyr::mutate(mean_gain = round(mean_gain, digits = 0))

head(plotdata)
regionsum_lengthmean_gainn
Central Cascades2130.852260226
Central Washington453.3081480
Eastern Washington1333.641591143
Issaquah Alps383.1197377
Mount Rainier Area1601.801874196
North Cascades3346.532500301

画图

  • 基础的雷达图,以下是代码解释:

  1. ggplot(plotdata):初始化ggplot图表,plotdata是用于绘图的数据框架(data frame)。

  2. geom_hline(...):添加水平参考线。

  • data = data.frame(y = c(0:3) * 1000):指定参考线的数据,这里创建了一个数据框,y字段包含从0到3000的值,每个值乘以1000。

  • aes(yintercept = y):使用美学映射指定参考线的位置,这里使用y字段作为y轴截距。

  • color = "lightgrey":设置参考线的颜色为浅灰色。

  • geom_col(...):添加柱状图层,展示不同类别的数据。

    • aes(x = reorder(str_wrap(region, 5), sum_length), y = sum_length, fill = n):使用美学映射定义柱状图的位置、高度和颜色填充。

    • str_wrap(region, 5):将region字段的字符串每5个字符换行。

    • reorder(...):根据sum_length字段的值重新排序x轴的类别。

    • position = "dodge2":设置柱状图避免重叠,dodge2允许在两个维度上错开。

    • show.legend = TRUE:显示图例。

    • alpha = .9:设置柱状图的透明度。

  • geom_point(...):在每个柱状图的顶部添加点。

    • aes(x = ..., y = mean_gain):设置点的位置,mean_gain字段代表点在y轴上的位置。

    • size = 3:设置点的大小。

    • color = "gray12":设置点的颜色。

  • geom_segment(...):添加线段,从柱状图顶部延伸到参考线。

    • aes(x = ..., y = 0, xend = ..., yend = 3000):设置线段的起始和结束位置,这里线段从y=0延伸到y=3000。

    • linetype = "dashed":设置线段的类型为虚线。

    • color = "gray12":设置线段的颜色。

  • coord_polar():将图表的坐标系统转换为极坐标,从而创建一个圆形的柱状图。

  • pl <- ggplot(plotdata) +
    geom_hline(data = data.frame(y = c(0:3) * 1000),
    aes(yintercept = y), color = "lightgrey") +
    geom_col(aes(x = reorder(str_wrap(region, 5), sum_length),
    y = sum_length, fill = n),
    position = "dodge2", show.legend = TRUE, alpha = .9) +
    geom_point(aes(x = reorder(str_wrap(region, 5), sum_length),
    y = mean_gain), size = 3, color = "gray12") +
    geom_segment(aes(x = reorder(str_wrap(region, 5), sum_length), y = 0,
    xend = reorder(str_wrap(region, 5), sum_length), yend = 3000),
    linetype = "dashed", color = "gray12") +
    coord_polar()

    pl

    结果:不同区域远足的路程,可以看到North Cascades拥有最高的数值。

    • 增加annotations and legend,以下是代码的解释:

    1. annotate(...):向图表添加文本注释。

    • x = 11, y = 1300:指定文本注释的位置。

    • label = "Mean Elevation Gain\n[FASL]":设置要显示的文本,\n表示换行。

    • geom = "text":指定注释类型为文本。

    • angle = -67.5:文本旋转的角度。

    • color = "gray12":文本颜色。

    • size = 2.5:文本大小。

  • scale_y_continuous(...):调整y轴的尺度。

    • limits = c(-1500, 3500):设置y轴的显示范围。

    • expand = c(0, 0):设置坐标轴的扩展空间,这里为0表示不扩展。

    • breaks = c(0, 1000, 2000, 3000):设置y轴刻度显示的值。

  • scale_fill_gradientn(...):设置颜色填充的渐变。colors = c("#6C5B7B", "#C06C84", "#F67280", "#F8B195"):定义渐变颜色。

  • guides(...):自定义图例的显示方式。

    • fill = guide_colorsteps(...):设置填充颜色图例的样式。

    • barwidthbarheight:设置颜色条的宽度和高度。

    • title.positiontitle.hjust:设置图例标题的位置。

  • theme(...):设置图表的主题样式。

    • axis.title = element_blank():隐藏坐标轴标题。

    • axis.ticks = element_blank():隐藏坐标轴的刻度标记。

    • axis.text.y = element_blank():隐藏y轴的文本标签。

    • axis.text.x = element_text(...):设置x轴文本标签的颜色和大小。

    • legend.position = "bottom":设置图例显示在图表底部。

    pl2 <- pl +
    annotate(x = 11, y = 1300,
    label = "Mean Elevation Gain\n[FASL]", geom = "text",
    angle = -67.5, color = "gray12",
    size = 2.5) +
    annotate(x = 11, y = 3150,
    label = "Cummulative Length [FT]", geom = "text",
    angle = 23, color = "gray12",
    size = 2.5) +
    annotate(x = 11.7, y = 1100,
    label = "1000", geom = "text",
    color = "gray12") +
    annotate(x = 11.7, y = 2100,
    label = "2000", geom = "text",
    color = "gray12") +
    annotate(x = 11.7, y = 3100,
    label = "3000", geom = "text",
    color = "gray12") +
    scale_y_continuous(limits = c(-1500, 3500), expand = c(0, 0),
    breaks = c(0, 1000, 2000, 3000)) +
    scale_fill_gradientn("Amount of Tracks",
    colors = c( "#6C5B7B","#C06C84","#F67280","#F8B195")) +
    guides(fill = guide_colorsteps(barwidth = 15, barheight = .5,
    title.position = "top", title.hjust = .5)) +
    theme(
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    axis.text.y = element_blank(),
    axis.text.x = element_text(color = "gray12", size = 12),
    legend.position = "bottom")

    pl2

    • 终图

    pl <- pl + 
    labs(
    title = "\nHiking Locations in Washington",
    subtitle = paste(
    "\nThis Visualisation shows the cummulative length of tracks,",
    "the amount of tracks and the mean gain in elevation per location.\n",
    "If you are an experienced hiker, you might want to go",
    "to the North Cascades since there are a lot of tracks,",
    "higher elevations and total length to overcome.",
    sep = "\n"),
    caption = "\n\nData Visualisation by Tobias Stalder\ntobias-stalder.netlify.app\nSource: TidyX Crew (Ellis Hughes, Patrick Ward)\nLink to Data: github.com/rfordatascience/tidytuesday/blob/master/data/2020/2020-11-24/readme.md") +
    theme(
    text = element_text(color = "gray12"),
    plot.title = element_text(face = "bold", size = 25, hjust = 0.05),
    plot.subtitle = element_text(size = 14, hjust = 0.05),
    plot.caption = element_text(size = 10, hjust = .5),
    panel.background = element_rect(fill = "white", color = "white"),
    panel.grid = element_blank(),
    panel.grid.major.x = element_blank())

    pl

    # ggsave("plot.png", pl, width = 9, height = 12.6)

    参考

    • https://r-graph-gallery.com/web-circular-barplot-with-R-and-ggplot2.html

    生信学习者
    生信教程分享,专注数据分析和科研绘图方向欢迎大家关注,也可一起探讨生信问题