如何在geom_density_ridges2()中去除NA水平并保留x轴刻度
问题:去除geom_density_ridges2图中的NA水平并保留x轴刻度
背景
为了让x轴显示0、1、2这些原本缺失的刻度值,我尝试用complete(value = seq(0, max(value), 1))为数据框的value列补充缺失值行,但生成的图中出现了NA的y轴水平(如下左图),期望得到没有NA水平且保留x轴0-9完整刻度的图(如下右图):


解决方案
问题根源在于complete函数未按item分组补全数据,导致生成了没有对应item的行(即item为NA的行)。只需修改complete的参数,按item分组来补全每个item对应的所有value值即可:
将complete(value = seq(0, max(value), 1))改为complete(item, value = seq(0, max(value), 1))
修改后的完整代码
library(dplyr) library(tidyr) library(ggplot2) library(ggridges) df %>% # 按item分组补全每个item对应的所有value值 complete(item, value = seq(0, max(value), 1)) %>% ggplot(aes(x = value, y = item, group = item)) + geom_density_ridges2(aes(fill = item), stat = "binline", binwidth = 1, scale = 0.95) + geom_text( stat = "bin", aes( y = group + 0.95*stat(count/max(count)), label = ifelse(stat(count) > 0, stat(count), "") ), vjust = -0.5, size = 3, color = "black", binwidth = 1 ) + scale_x_continuous( breaks = 0:9, name = "Answer (higher = better)" ) + scale_y_discrete( expand = expansion(add = 2) ) + scale_fill_viridis_d() + labs( title = "Example", y = NULL ) + theme_ridges(grid = FALSE) + theme( axis.title.x = element_text(hjust = 0.5), axis.title.y = element_text(hjust = 0.5), legend.position = "none", plot.title.position = "plot", plot.title = element_text(face="bold") )
数据
df <- structure(list(id = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29), item = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"), class = "factor"), value = c(8, 9, 4, 5, 8, 9, 7, 9, 8, 8, 7, 6, 9, 8, 9, 9, 9, 9, 8, 9, 9, 9, 8, 9, 8, 8, 7, 8, 8, 8, 7, 9, 8, 9, 8, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 7, 9, 9, 8, 9, 8, 9, 7, 9, 7, 7, 7, 8)), row.names = c(NA, -58L), class = c("tbl_df", "tbl", "data.frame"))
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

