R绘图:gggibbous,基于ggplot2的Moon charts

绘图往期回顾:

ggplot2绘图学习 两个连续性变量

ggplot2绘图学习:单变量+绘图背景

R绘图:ggeconodist,基于ggplot2的另类箱图

R语言学习系列之“多变的热图”

蚂蚁金服在线可视化引擎 G2

R绘图:无与伦比的华丽风行(桑基图)

R绘图:相关性分析与作图(单基因相关性)

R绘图:相关性分析与作图R绘图

ggsci: 高大上的论文配色,一文解决配色问题

R绘图 ggpubr: 为学术而生

TCGA数据分析系列之火山图

R绘图 雷达图-单基因泛癌差异表达的另类展现形式

今天介绍一个画Moon charts的R包

Moon charts 和 pie charts的区别:pie charts将圆划分为多个部分,这些部分的弧长(以及面积)表示整个圆的比例。类似地,Moon charts把一个圆分成几个部分,这些部分代表了一个整体的比例,但是在Moon charts中,这些区域被画成月牙形或圆形的凸出部分,就像月相一样。

使用Moon charts而不是饼图的动机主要是一种审美选择。还要注意的是,由于Moon charts的部分是从圆的一个或另一个侧面扫过的,所以它们通常只适用于描绘一个或两个组。

而gggibbous包就是专为Moon charts设计的。gggibbous扩展了ggplot2数据可视化包,为R中的Moon charts提供支持。与R中的coord_polar()支持的饼图不同,gggibbous中的Moon charts不需要任何特殊的坐标系。它们的绘制与ggplot2中的点最为相似:它们的位置由x和y坐标定义,其大小独立于坐标系定义,因此它们始终保持圆形。

首先是安装包

install.packages("gggibbous")

构建一个数据框

a=data.frame(x = 1:5, y = 1, size = 2^(0:4))

画图

ggplot(a, aes(x, y, size = size)) + geom_moon() + geom_point(y = 2) + lims(x = c(0.5, 5.5), y = c(0.5, 2.5)) + scale_size(range = c(5, 10))

上面一行是geom_point画出的点,下面一行是geom_moon画出的月牙

ratio 和right参数的使用

ratio控制要绘制的月亮的比例。它应该在0(一个实际上什么也没有画出来的“新月”)和1(一个“满月”,即一个圆)之间。

ggplot(data.frame(x = 1:5, y = 0, ratio = 0:4 * 0.25), aes(x = x, y = y)) + geom_moon(aes(ratio = ratio), size = 20, fill = "black") + geom_text(aes(y = y + 1, label = ratio)) + lims(x = c(0.5, 5.5), y = c(-1, 1.4)) + theme_void()

right接受一个布尔值,该值控制月亮是从右边还是左边填满的。

制作两种颜色的“完整”月亮的一种方法是使用right=TRUE表示一种颜色,right=FALSE表示另一种颜色,并使用互补比率。

tidymoons <- data.frame( x = rep(1:3, 6), y = rep(rep(3:1, each = 3), 2), ratio = c(1:9 / 10, 9:1 / 10), right = rep(c(TRUE, FALSE), each = 9))
ggplot(tidymoons) + geom_moon(aes(x, y, ratio = ratio, right = right, fill = right)) + lims(x = c(0.5, 3.5), y = c(0.5, 3.5))

Legend设置的函数

我们可以发现上图的legend并不完美,该包提供三个函数来设置legend

draw_key_moon:默认

draw_key_moon_left:从左边画出一个新月,它是与draw_key_moon中凸出的月亮互补的

ggplot(tidymoons, aes(x, y, ratio = ratio, right = right, size = 2^x)) + geom_moon(data = subset(tidymoons, right), fill = "violetred") + geom_moon( data = subset(tidymoons, !right), fill = "turquoise3", key_glyph = draw_key_moon_left ) + lims(x = c(0.5, 3.5), y = c(0.5, 3.5)) + scale_size("size", range = c(5, 10), breaks = 2^(1:3))

draw_key_full_moon:画一个圆。

ggplot(tidymoons) + geom_moon( aes(x, y, ratio = ratio, right = right, fill = right, size = 2^x), key_glyph = draw_key_full_moon ) + lims(x = c(0.5, 3.5), y = c(0.5, 3.5)) + scale_size("size", range = c(5, 10), breaks = 2^(1:3)) + scale_fill_manual(values = c("firebrick1", "dodgerblue2")) + theme(legend.box = "horizontal")

应用示例:

展示下表的数据,5画成满月,1画成空心

构建数据

rest_names <- c( "Anscombe's Luncheonette", "Chai Squared", "Tukey's Honest Southern Diner", "Bagels ANOVA", "Spearmint Row")restaurants <- data.frame( Restaurant = factor(rest_names, levels = rest_names), Food = c(5, 3, 4, 4, 1), Decor = c(2, 5, 3, 1, 5), Service = c(4, 2, 3, 3, 5), Price = c(4, 5, 2, 5, 2))

将数据转换为长数据后再画图

ggplot(tidyrest, aes(0, 0)) + geom_moon(aes(ratio = (Score - 1) / 4), fill = "black") + geom_moon(aes(ratio = 1 - (Score - 1) / 4), right = FALSE) + facet_grid(Restaurant ~ Category, switch = "y") + theme_minimal() + theme( panel.grid = element_blank(), strip.text.y = element_text(angle = 180, hjust = 1), axis.text = element_blank(), axis.title = element_blank() )
(0)

相关推荐