如何在 ggplot 中制作循环的、类似甜甜圈的颜色图例?
Posted
技术标签:
【中文标题】如何在 ggplot 中制作循环的、类似甜甜圈的颜色图例?【英文标题】:How can I make a cyclic, donut-like color legend in ggplot? 【发布时间】:2020-08-26 12:13:22 【问题描述】:上下文
我有一些看起来像这样的数据:
val = 0:100
sample_data = data.frame(
t=val,
px=cos(2*pi*val/100),
py=sin(2*pi*val/100),
v_angle = (val*360/100 + 90) %% 360
)
我在这里描述圆周运动,我想绘制一个根据角度改变颜色的图形。
但是,由于方向是循环的,我想要一个使用类似甜甜圈的形状的图例,以便完美循环,这样0
与360
相同。/
现在,我的图表如下所示:
direction_labeller <- function(x)
ifelse(
x %% 45 == 0,
c('E','NE','N','NW','W','SW','S','SE')[1+as.integer(x/45)],
''
)
# from cetcolor::cet_pal(8, 'c2s')
colors=c("#2E22EA","#9E3DFB","#F86BE2","#FCCE7B","#C4E416","#4BBA0F","#447D87","#2C24E9")
ggplot(sample_data) +
geom_path(aes(x=px, y=py, color=v_angle)) +
scale_color_gradientn(
colors=colors,
breaks=seq(0,315,45),
label=direction_labeller,
limits=c(0,359)
)
我的最终目标是能够使用颜色来描述我拥有的其他数据的速度,因为在彼此非常接近的路径上方向可能不同。
或者,我只是根据围绕基本方向和基本方向的 45 度角对方向进行分箱,这就是最终结果
direction_categorize <- function(angles)
factor(
case_when(
is.na(angles) ~ as.character(NA),
between(angles,-22.5,22.5) ~ 'E',
between(angles,22.5,67.5) ~ 'NE',
between(angles,67.5,112.5) ~ 'N',
between(angles,112.5,157.5) ~ 'NW',
between(angles, 157.5, 202.5) ~ 'W',
between(angles, 202.5, 247.5) ~ 'SW',
between(angles, 247.5, 292.5) ~ 'S',
between(angles, 292.5, 337.5) ~ 'SE',
TRUE ~ 'E'
),
levels=c('N','NW','W','SW','S','SE','E','NE')
)
sample_data$direction = direction_categorize(sample_data$v_angle)
ggplot(sample_data) +
geom_path(aes(x=px, y=py, color=direction, group=1)) +
scale_color_manual(
values=colors
)
我遇到的主要问题是边界附近的摆动非常分散注意力,因为在颜色之间来回移动看起来像是一系列不连续性。
【问题讨论】:
【参考方案1】:所以,对我来说,最简单的方法是使用gridExtra
创建一个单独的甜甜圈图,即图例
library(tidyverse)
library(gridExtra)
val = 0:100
sample_data = data.frame(t=val, px=cos(2*pi*val/100), py=sin(2*pi*val/100), v_angle = (val*360/100 + 90) %% 360)
direction_labeller <- function(x)
ifelse(x %% 45 == 0, c('E','NE','N','NW','W','SW','S','SE')[1+(as.integer(x/45) %% 8)], '')
# from cetcolor::cet_pal(8, 'c2s')
my_colors=c("#2E22EA","#9E3DFB","#F86BE2","#FCCE7B","#C4E416","#4BBA0F","#447D87","#2C24E9")
(sample_plot1 = ggplot(sample_data) +
geom_path(aes(x=px, y=py, color=v_angle)) +
scale_color_gradientn(
colors=my_colors,
breaks=seq(0,315,45),
label=direction_labeller,
limits=c(0,359)
)
)
hues_df = data.frame(degree = 0:359) %>%
mutate(
label=direction_labeller(degree+90 %% 360),
colors = colorRampPalette(my_colors)(360)
)
(color_compass = ggplot(hues_df) +
geom_rect(
aes(ymin=3,ymax=4, xmin=degree-0.5,xmax=degree+0.5,color=colors,fill=colors)
) + coord_polar(direction=-1, start=0) +
scale_color_identity() +
scale_fill_identity() +
guides(fill=FALSE,color=FALSE) +
theme_void() +
ylim(c(1,4.5)) +
geom_text(
aes(x=degree,y=4.5,label=label)
)
)
grid.arrange(sample_plot1 + guides(color=FALSE), color_compass, ncol=2, widths = c(4,1))
上面的比例是可以调整的,但是上面的想法很简单。
【讨论】:
以上是关于如何在 ggplot 中制作循环的、类似甜甜圈的颜色图例?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用ggplot2可视化甜甜圈图(Donut chart)
情侣之间如何拍照?情侣拍照手势大全,不用露脸也可以分享甜甜的恋情