Circular lollipop | 哇咔咔!!!环形棒棒糖图好吃又好玩!~

news2025/1/10 5:51:51

1写在前面

今天不想废话了,直接看图吧。👇

alt

复现代码step by step,自己看吧。🤪

2用到的包

rm(list = ls())
library(tidyverse)
library(ggtext)
library(patchwork)

3示例数据

df_pw <- read.csv("./passwords.csv",row.names = 1)

DT::datatable(df_pw)
alt

4整理数据

4.1 统一时间单位

由于时间单位不统一,这里我们转化一下,把单位都统一起来,都转成seconds。🥳

df_pw_time <- 
df_pw %>%
mutate(
time = case_when(
time_unit == "seconds" ~ value,
time_unit == "minutes" ~ value * 60,
time_unit == "hours" ~ value * 60 * 60,
time_unit == "days" ~ value * 60 * 24,
time_unit == "weeks" ~ value * 60 * 24 * 7,
time_unit == "months" ~ value * 60 * 24 * 30,
time_unit == "years" ~ value * 60 * 24 * 365,
TRUE ~ NA_real_
)
)

4.2 增加画图空间

接下来,将固定值1000添加到所有时间,为圆圈内的标签留下所需的额外空间。

plus <- 1000
df_pw_plot <-
df_pw_time %>%
mutate(time = time + plus) %>%
add_row(rank = 501, time = 1)

4.3 提取难以破解的密码

创建一个data frame,包含为确实难以破解的密码放置标签所需的所有信息。🥰

后面会用到的。🤒

labels <-
df_pw_plot %>%
filter(value > 90) %>%
mutate(label = glue::glue("<b>{password}</b><br><span style='font-size:18pt'>Rank: {rank}</span>")) %>%
add_column(
x = c(33, 332, 401, 492),
y = c(75000000, 90000000, 45000000, 48498112)
)

5开始绘图

5.1 基础绘图

p <- ggplot(df_pw_plot, aes(rank, time, color = category)) +
# 垂直线
geom_segment(
aes(x = rank, xend = rank, y = 0, yend = time),
size = 1.2
) +
# 放置文本处
geom_rect(
aes(xmin = 1, xmax = 501, ymin = 0, ymax = plus),
fill = "grey97", color = "grey97"
) +

# 圈内线,分别为1天,1周,1月,1年。
geom_hline(aes(yintercept = (1 * 24 * 60 + plus)), color = "grey88") +
geom_hline(aes(yintercept = (7 * 24 * 60 + plus)), color = "grey85") +
geom_hline(aes(yintercept = (30 * 24 * 60 + plus)), color = "grey82") +
geom_hline(aes(yintercept = (365 * 24 * 60 + plus)), color = "grey79") +

# 为每条线终点添加棒棒糖头!~
geom_point(aes(size = time)) +

# log10 scale
scale_y_log10(expand = c(0, 0)) +

# Prism color
rcartocolor::scale_color_carto_d(palette = "Prism", guide = "none") +

# dots大小范围
scale_size(
range = c(1, 8),
limits = c(plus, max(df_pw_plot$time)),
guide = "none"
) +

# 坐标转成圆圈
coord_polar()

p
alt

5.2 添加文本注释

p <- p + 
# 用`geom_richtext()`添加之前准备好的label
geom_richtext(
data = labels,
aes(x = x, y = y, label = label, color = category),
lineheight = 0.8,
size = 8,
label.color = NA
) +
# 用`geom_text()`添加普通文本,放置在圈圈的中心
geom_text(
x = 500, y = 1.2,
label = "********\nCracking\nYour Favorite\nPassword",
size = 20,
lineheight = 0.87,
color = "grey60"
) +
geom_text(
x = 250, y = 0.25,
label = "********",
size = 20,
lineheight = 0.87,
color = "grey60"
) +
geom_text(
x = 250, y = 1.1,
label = "Time it takes to crack the 500 most\ncommon passwords by online guessing.\nSorted by rank and colored by category.",
size = 7,
lineheight = 0.87,
color = "grey73"
) +
geom_text(
x = 250, y = 1.95,
label = "Time is displayed on a logarithmic scale\nwith the rings representing one day,\none week, one month, and one year\n(from inner to outer ring).",
size = 6,
lineheight = 0.87,
color = "grey73"
)

p
alt

6分面视图

6.1 数据整理

首先,我们要为一些category添加换行符,适合内圈的大小。😏

facet_data <- 
df_pw_plot %>%
add_row(rank = 501, time = 1, category = unique(df_pw_plot$category)) %>%
# This is where we add line breaks
mutate(
cat_label = case_when(
category == "cool-macho" ~ "cool-\nmacho",
category == "nerdy-pop" ~ "nerdy-\npop",
category == "password-related" ~ "password-\nrelated",
category == "rebellious-rude" ~ "rebel-\nlious-\nrude",
category == "simple-alphanumeric" ~ "simple-\nalpha-\nnumeric",
TRUE ~ category
)
) %>%
filter(!is.na(category))

6.2 开始绘图

facet <- ggplot(facet_data, aes(rank, time, color = category)) +
geom_segment(
aes(x = rank, xend = rank, y = 0, yend = time),
size = 0.6
) +
geom_rect(
aes(xmin = 1, xmax = 501, ymin = 0, ymax = plus),
fill = "grey97", color = "grey97"
) +
geom_hline(aes(yintercept = (1 * 24 * 60 + plus)), color = "grey82", size = 0.2) +
geom_hline(aes(yintercept = (7 * 24 * 60 + plus)), color = "grey79", size = 0.2) +
geom_hline(aes(yintercept = (30 * 24 * 60 + plus)), color = "grey76", size = 0.2) +
geom_hline(aes(yintercept = (365 * 24 * 60 + plus)), color = "grey73", size = 0.2) +
geom_point(aes(size = time)) +

# 添加每个圈内的laebl
geom_text(
aes(label = cat_label, color = category),
x = 500, y = 0,
size = 8,
lineheight = 0.87
) +
# 分面并分为2行
facet_wrap(~ category, nrow = 2) +
coord_polar() +
scale_y_log10(expand = c(0, 0)) +
rcartocolor::scale_color_carto_d(palette = "Prism", guide = "none") +
scale_size(
range = c(0.5, 7),
limits = c(plus, max(df_pw_plot$time)),
guide = "none"
) +
theme(
strip.text = element_blank(),
)

facet
alt

7最终绘图

p <- p + 
theme_void() +
theme(
plot.margin = margin(-50, -180, -70, -180, "lines"),
)

facet <- facet +
theme_void() +
theme(
panel.spacing = unit(-8, "lines"),
plot.margin = margin(-40, 50, 10, 50)
) +
# caption的主题
theme(
plot.caption = element_text(
size = 20,
color = "grey60",
hjust = 0.5,
margin = margin(-50, 10, 30, 10)
)
) +
# 添加caption
labs(caption = "")


# 拼图
p_final <- (p + facet) +
plot_layout(
ncol = 1,
heights = c(1, 0.28)
)

p_final
alt

alt
最后祝大家早日不卷!~

点个在看吧各位~ ✐.ɴɪᴄᴇ ᴅᴀʏ 〰

📍 往期精彩

📍 🤩 LASSO | 不来看看怎么美化你的LASSO结果吗!?
📍 🤣 chatPDF | 别再自己读文献了!让chatGPT来帮你读吧!~
📍 🤩 WGCNA | 值得你深入学习的生信分析方法!~
📍 🤩 ComplexHeatmap | 颜狗写的高颜值热图代码!
📍 🤥 ComplexHeatmap | 你的热图注释还挤在一起看不清吗!?
📍 🤨 Google | 谷歌翻译崩了我们怎么办!?(附完美解决方案)
📍 🤩 scRNA-seq | 吐血整理的单细胞入门教程
📍 🤣 NetworkD3 | 让我们一起画个动态的桑基图吧~
📍 🤩 RColorBrewer | 再多的配色也能轻松搞定!~
📍 🧐 rms | 批量完成你的线性回归
📍 🤩 CMplot | 完美复刻Nature上的曼哈顿图
📍 🤠 Network | 高颜值动态网络可视化工具
📍 🤗 boxjitter | 完美复刻Nature上的高颜值统计图
📍 🤫 linkET | 完美解决ggcor安装失败方案(附教程)
📍 ......

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析 Io 处理

文件流&#xff1a; 在Java 中&#xff0c;文件流负责操作文件&#xff0c;包括读取和写入&#xff1b; FileInputStream // 文件的字节输入流&#xff1b; FileOutputStream // 文件的字节输出流&#xff1b; FileReader // 文件的字符输入流&#xff1b; FileWriter // 文…

Python基于百度智能云平台股票资讯情感分析

Python基于百度智能云平台股票资讯情感分析 全部代码和数据地址如下&#xff1a;Python基于百度智能云平台股票资讯情感分析 本文章详细内容如下&#xff1a; 文章目录 Python基于百度智能云平台股票资讯情感分析导入相应的包1.引入库2.设置账户秘钥3.导入数据4.数据合并5.百度…

10年测试老鸟总结,性能测试-性能内存瓶颈分析(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试-内存瓶颈…

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码 1 题目 《节能与新能源汽车技术路线图 2.0》提出至 2035 年&#xff0c;新能源汽车市场占比超过 50%&#xff0c;燃料电池汽车保有量达到 100 万辆&#xff0c;节能汽车…

windows11 安装cuda和cudnn深度学习开发环境

首先先要确认自己的显卡最高能支持到cuda的版本&#xff0c;一般是不限制版本号的。 然后在官网地址下载&#xff1a; cuDNN的官网下载地址&#xff1a;cuDNN Archive | NVIDIA Developer CUDA 的下载地址&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 有一点需要注…

Jetpack:DataBinding

目录 一、DataBinding简介 设置 Data Binding 数据绑定表达式 双向绑定 二、例子 MainActivity &#xff1a; Food: activity_main: build.gradle: 运行结果&#xff1a; 三、总结 一、DataBinding简介 DataBinding 是一种用于在安卓应用中实现简洁、高效的数据绑定的…

SpringMVC中的@RequestMapping注解的详细介绍过程~

RequestMapping注解的功能&#xff1a; 从注解名称上我们可以看出&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系&#xff0c;SpringMVC接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制方法来处理这个…

备战秋招 | 笔试强训7

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A. 函数体含有循环语句 B. 函数体含有递归语句 C. 函数代码少、频繁调用 D. 函数代码多&#xff0c;不常调用 2、在 C 语言中&a…

数据结构(王道)——队列的应用

对树的层次遍历&#xff1a; 图的广度优先遍历 队列在操作系统的应用

composer的劈坑

现在是php8盛行的天下&#xff0c;安装php8我就不多说了&#xff0c;宝塔、小出面板一大堆&#xff0c;一键安装。真心说方便。&#xff08;好吧&#xff0c;不打广告了&#xff09;&#xff0c;以下是针对 linux 系统 1、安装composer 安装composer之前&#xff0c;需要要先在…

基于SpringBoot+vue的在线BLOG网设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

CAN转ETHERCAT网关can协议和canfd协议

大家好&#xff0c;今天要跟大家分享一款自主研发的通讯网关&#xff0c;YC-ECT-CAN。这款产品能够将各种CAN总线和ETHERCAT网络连接起来&#xff0c;实现高效的数据传输和通信。那么&#xff0c;这款通讯网关具体有哪些功能和特点呢&#xff1f;接下来&#xff0c;我们就一起来…

【关于C++中----特殊类设计和单例模式】

文章目录 一、设计一个类&#xff0c;不能被拷贝1.1C98的实现方法及其弊端1.2 C11的实现方法 二、设计一个类&#xff0c;只能在堆上创建对象三、设计一个类&#xff0c;只能在栈上创建对象四、设计一个类&#xff0c;不能被继承五、设计一个类&#xff0c;只能创建一个对象(单…

【Java】理解java传参总是采用值传递/按值调用

参考《Java核心技术卷Ⅰ》 按值调用 Java所有的方法传参都是按值调用&#xff0c;方法得到的是所有参数值的一个拷贝。 方法参数的类型 方法参数共有两种类型 基本数据类型&#xff08;数字、布尔值&#xff09;对象引用 一个内部方法不可能基本数据类型&#xff0c;但能通…

Qt6 Qt Quick UI Prototype学习QML第一篇

Qt6 Qt Quick UI原型学习QML第一篇 开始创建项目Qt Quick UI原型简介.qmlproject文件举例Window平台小例子运行效果QML语法 了解语法 开始创建项目 创建一个具有QML入口点的Qt Quick 2 UI项目。要使用它&#xff0c;您需要设置一个QML运行时环境&#xff0c;例如gmlscene。 仅当…

学C的第二十六天【指针的进阶(二)】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十五天【指针的进阶&#xff08;一&#xff09;】_高高的胖子的博客-CSDN博客 6 . 函数指针数组 &#xff08;1&#xff09;. 含义&#xff1a; 函数指针数组 是一个数组&a…

CSDN 周赛 63 期

CSDN 周赛 63 期 参赛体验63期周赛题目题目名称:小玉家的电费题目名称:收件邮箱题目名称:饿龙咆哮-逃离城堡题目名称:寻找宝藏山小结参赛体验 这次是最近难得的四个编程题的比赛了,可惜出了一个骗分题。 然后,今天早上进入考试,还好几次,连进都进不去 嗯,最后是开着…

开源代码分享(7)—考虑电动汽车可调度潜力的充电站两阶段市场投标策略(附matlab代码)

[1]詹祥澎,杨军,韩思宁等.考虑电动汽车可调度潜力的充电站两阶段市场投标策略[J].电力系统自动化,2021,45(10):86-96. 摘要&#xff1a;在电力市场环境下,充电站优化投标策略能降低电力成本&#xff0c;甚至通过售电获取收益。文中考 虑了电动汽车成为柔性储荷资源的潜力&#…

android 下载源码 一路踩坑

python 从 2.0 升级到3.0 从官网下载 pyhon3.0 安装器,然后更改配置 # Setting PATH for Python 3.8# The original version is saved in .bash_profile.pysaveexport PATH"/Library/Frameworks/Python.framework/Versions/3.11/bin:$PATH"alias python"/Libr…

h5真机调试之ios和Android和vconsole

目录 1&#xff1a;h5真机调试之Android01&#xff1a;安卓端 小米11开启开发者模式02&#xff1a;Android edge 2&#xff1a;h5真机调试之ios1&#xff1a;iOS Safari 3&#xff1a;真机链接本地项目 之 Android &#xff08; 重点 &#xff09;3-1 vconsole的安装与使用 (…