圈圈圈圈图!
关注公众号,发送R语言或Python,获取学习资料!
圈圈图(或者叫网络图?)前面介绍过很多次了,详情请见:
今天再来学习下圈圈图的画法,其实就是用ggraph
包,没什么特别的,看到这个图形千万不要觉得太高大上,不过就是换了一个layout
而已!
但是不得不说,这个大图嵌小图的表现方式真的很震撼,圈圈再多点看得人密集恐惧症都犯了!
画这个图的数据来源找不到了,我是在一个大佬的Github[1]找的,但是具体数据来源以及数据说明并没有找到。根据图片推测应该是老外每天、每小时发多少推这种数据。
既然是用ggraph
画图,那就先要把数据转换成合适的格式。看到这个图你千万不要害怕,因为数据格式和之前推文里介绍的网络图的格式一模一样!毕竟都是一个包画的。
加载R包和数据
用到的R包很多,没安装的记得先安装!
library(tidyverse)
library(here)
library(ggraph)
library(igraph)
library(patchwork)
library(lubridate)
library(wesanderson)
加载数据,这个原始数据有两张csv文件,purrr
包可以直接读取并合并!
tweets_w1w2 <- list.files(path = here("2021", "data"), full.names = TRUE) %>%
map_df(~read_csv(.)) %>%
mutate(hour = hour(created_at))
数据处理
接下来就是数据处理,主要是变成一个from、to的格式,然后使用函数转化为ggraph
需要的格式!
tweet_tree0 <- data.frame(from = "day", to = 0:23)
tweet_tree1 <- tweets_w1w2 %>%
filter(day == 13) %>%
filter(is_retweet) %>%
summarise(from = hour, to = retweet_status_id)
tweet_tree2 <- tweets_w1w2 %>%
filter(day == 13) %>%
filter(is_retweet) %>%
summarise(from = retweet_status_id, to = status_id)
# 合并成一个
edges <- rbind(tweet_tree0, tweet_tree1, tweet_tree2)
# 转换格式
mygraph <- graph_from_data_frame(edges)
画图
接下来就是画图,画图就很简单了。
# 先自定义几个颜色和标签
pal <- wes_palette("Zissou1")
depth_lbl <- c("day", "hour", "tweet", "retweets")
# 画图,前两行代码是主要的,其余的都是修饰图形
ggraph(mygraph, layout = 'circlepack') + # 这个circlepack就是专门画这种图形的
geom_node_circle(aes(fill = factor(depth)), color = "grey30", size = 0.15) +
scale_fill_manual(values = pal, labels = depth_lbl) +
labs(fill = NULL, title = "Day 13") +
coord_fixed() +
theme_void(base_family = "Fira Sans") +
theme(plot.title = element_text(hjust = 0.5))
然后图就出来了,就是这么简单!
难的还是数据处理整理的过程,以及对一份数据如何选择合适的图标展示的问题!这个需要大家多多学习才行。
参考资料
Github: https://github.com/gkaramanis/30DayChartChallenge
以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发!
欢迎在评论区留言或直接添加我的微信!
End
欢迎关注公众号:医学和生信笔记
“医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!
往期回顾
R语言和医学统计学(合辑)
超详细的R语言热图之complexheatmap系列6
R语言画好看的聚类树
使用R语言美化PCA图