R绘图:gggibbous,基于ggplot2的Moon charts
绘图往期回顾:
R绘图:ggeconodist,基于ggplot2的另类箱图
今天介绍一个画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)