我正在尝试为geom_density_ridge
ggplot 添加手段。我一直在解决一个非常相似的问题(为 geom_density_ridges 添加平均值)。我可以为我的山脊生成手段,但它们放错了位置。我很确定这是因为我重新排序了我的分组因子以使各个山脊按我想要的顺序排列,但是生成平均值的代码使用原始顺序。我已经尝试了几种方法来重新排序手段,但我运气不佳。
背景 几十万行的原始数据集包括以下
- SiteNames - 具有 12 个级别的因子
- value - 温度数据范围从 -20 到 40 的数字
- 高度 - 具有 12 个可能值的数字,这些值对于 SiteNames 中的每个因子级别都是唯一的(例如 Arboretum Meadow 始终为 2200 )
为了得到从最低到最高绘制站点的图,我在 ggplot 语句中按 -altitude 对 SiteNames 重新排序。
我尝试将高度添加到 density_lines 小标题,但我缺乏 R 专业知识。如何从数字创建一个因子并将其传递给小标题?
代码
#Add means to ridgeline plot
#generate density_ride plot
Fig1 <- ggplot(tempsVertSortedAltitude,
aes(x=value,y=reorder(SiteNames, -altitude), fill=..x..))+
geom_density_ridges_gradient(rel_min_height = 0.01)+scale_x_continuous(expand = c(0.01, 0)) +
scale_y_discrete(expand = c(0.01, 0)) +
scale_fill_viridis(name = "Temp. [°C]", option = "C") +
labs(title = 'Hourly Mean Temperatures at SEGA Sites') +
theme_ridges(font_size = 13, grid = TRUE) + theme(axis.title.y = element_blank())
# create mean lines
density_lines <-
tempsVertSortedAltitude %>%
**fct_reorder(SiteNames, -altitude) %>%** # code added to reorder SiteNames levels (lowest to highest)
group_by(SiteNames) %>%
summarise(x_mean = mean(value, na.rm = TRUE ), alt = -altitude) %>%
mutate(group = as.integer(SiteNames)) %>%
left_join(ggplot_build(Fig1) %>% purrr::pluck("data", 1),
on = "group") %>%
group_by(group) %>%
summarise(x_mean = first(x_mean),
density = approx(x, density, first(x_mean))$y,
scale = first(scale),
iscale = first(iscale), alt = alt)
# add segments and plot
Fig1 +
geom_segment(aes(x = x_mean,
y = group,
xend = x_mean,
yend = group + density * scale * iscale),
data = density_lines)