ggplot2优雅绘制旭日图(代码解析)

科技   2024-10-26 22:51   陕西  

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

最近有读者询问旭日图如何绘制,本节分享一个绘制旭日图的案例,该案例为geomtextpath包官网介绍文档内包含。geomtextpath包主要用于添加各类曲线文本等功非常的强大。本次通过该案例来解释一下旭日图的绘制过程,希望对读者有所启发,详细内容请参考geomtextpath包官方文档。

geomtextpath官方文档

https://github.com/AllanCameron/geomtextpath

结果图

旭日图类似与饼图,但是二者在内容展示上还是有着区别,旭日图两层之间是存在联系的,若数据有多个层级可添加更多层。左侧为直角坐标系版,右侧则为论文中常用的极坐标版,因此只要绘制出直角坐标系后直接使用coord_polar()函数该图即可完成。

绘制难点

旭日图的绘制难点大概在于数据格式的构建,若分组较少则可以手动进行数据构建。若想进一下解放双手那就需要深入理解数据,最终通过代码来实现。geomtextpath包给的参考案例过于高度自定义化,不具有一定的通用性,但是此案例对于理解旭日图的绘制过程则很有用,下面来解析一番。

加载R包

install.packages("geomtextpath")
library(geomtextpath)
library(tidyverse)

构建数据

df <- data.frame(x1 = c(seq(010/6 * pi, pi/3),
                       seq(010/6 * pi, 2*pi/3)),
                y1 = c(rep(26), rep(-13)),
                x2 = c(seq(010/6 * pi, pi/3)  + pi/3,
                       seq(010/6 * pi, 2*pi/3) + 2*pi/3),
                y2 = c(rep(46), rep(23)),
                group = letters[c(1:6, (1:3) * 2)],
                alpha = c(rep(16), rep(0.43)))
        x1 y1       x2 y2 group alpha
1 0.000000  2 1.047198  4     a   1.0
2 1.047198  2 2.094395  4     b   1.0
3 2.094395  2 3.141593  4     c   1.0
4 3.141593  2 4.188790  4     d   1.0
5 4.188790  2 5.235988  4     e   1.0
6 5.235988  2 6.283185  4     f   1.0
7 0.000000 -1 2.094395  2     b   0.4
8 2.094395 -1 4.188790  2     d   0.4
9 4.188790 -1 6.283185  2     f   0.4
df %>% ggplot(aes(x1, y1)) +
  geom_rect(aes(xmin = x1, xmax = x2, ymin = y1, ymax = y2, fill = group,
                alpha = alpha),
            color = "white", linewidth = 2)

结合df数据及上图则可以看到X轴(0~2.09)为一组,(2.09~4.18)为一组,对应Y轴为(-1~2);而第二层的数据Y轴则为(2~4),X轴则与第一层一致每一分组的位置信息在前一组的基础上累加而成。最终通过geom_rect()将其绘制成方块。这一思路为绘制旭日图的关键,由此想法则可以联系到R中的cumsum()函数,该函数正好可以实现此类需求,读者可以基于此思路尝试一番操作。

plot <- df %>% ggplot(aes(x1, y1)) +
  geom_rect(aes(xmin = x1, xmax = x2, ymin = y1, ymax = y2, fill = group,
                alpha = alpha),
            color = "white", linewidth = 2) +
  geom_textpath(data = data.frame(x1 = seq(0, 2 * pi, length = 300),
                                  y1 = rep(0.5, 300),
                                  label = rep(c("stats""effects""polar"), each = 100)),
                aes(label = label), linetype = 0, size = 8,
                upright = TRUE) +
  geom_textpath(data = data.frame(x1 = seq(0, 2 * pi, length = 300),
                                  y1 = rep(3, 300),
                                  label = rep(c("density""smooth""unique""organic",
                                                "easy to use""automatic"), 
                                              each = 50)),
                aes(label = label), linetype = 0, size = 4.6, color = "white",
                upright = TRUE) +
  scale_y_continuous(limits = c(-5, 4)) +
  scale_x_continuous(limits = c(0, 2*pi)) +
  scale_fill_manual(values = c("deepskyblue3""deepskyblue4",
                               "green3""green4","tomato""tomato2")) +
  scale_alpha_identity() +
  theme_void() +
  theme(legend.position = "none"
plot + coord_polar() # 极坐标化

关注下方公众号下回更新不迷路

本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档(2024版),购买将赠送2023年的绘图文档内容。目前此文档(2023+2024)已经更新上传200案例文档,每个案例都附有相应的数据和代码,并配有对应的注释文档,方便大家学习和参考。

2024更新的绘图内容将同时包含数据+代码+注释文档+文档清单,2023无目录仅有数据文件夹,小编只分享案例文档,不额外回答问题,无答疑服务,零基础不推荐买。

案例特点

所选案例图均属于个性化分析图表完全适用于论文发表,内容异常丰富两年累计发布案例图200+,2024年6月起提供html版注释文档更加直观易学。文档累计上千人次购买拥有良好的社群交流体验。R代码结构清晰易懂,为防止中文乱码提供单独的注释文档

R代码结构清晰易懂,为防止中文乱码2024年6月起提供单独html注释文档

群友精彩评论

淘宝店铺

2024年已更新案例图展示


R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
 最新文章