如何为ggplot绘制的共享单车租赁密度曲线按weathersit分组自定义命名
实现方法
你可以通过两步完成需求:先修改天气等级字段的因子标签替换为自定义名称,再计算每个分组密度曲线的峰值坐标完成邻近标注,完整代码如下:
library(ggplot2) library(dplyr) library(hrbrthemes) # 可选:如果标注重叠可加载ggrepel自动调整位置 # library(ggrepel) # 第一步:重命名天气等级分类 Bikes_Washington <- Bikes_Washington %>% mutate(weathersit = factor(weathersit, # 这里levels按原数据天气等级从好到差排序,可根据你的实际数据调整顺序 levels = c(1,2,3,4), labels = c("Bad", "Very_Bad", "God_Awful", "I_Wont_Even_Bother"))) # 第二步:计算每个天气分组的密度峰值坐标,用于标注定位 label_pos <- Bikes_Washington %>% group_by(weathersit) %>% summarise( # 取密度最大的横坐标 peak_x = density(cnt)$x[which.max(density(cnt)$y)], # 取密度峰值的纵坐标 peak_y = max(density(cnt)$y) ) # 绘图 ggplot(Bikes_Washington, aes(x=cnt, group=weathersit, fill = weathersit)) + geom_density(color = "darkblue", alpha=0.2) + # 添加曲线旁标注,vjust控制文字在峰值上方的偏移量,可自行调整 geom_text(data = label_pos, aes(x = peak_x, y = peak_y, label = weathersit), vjust = -0.8, size = 3.5, color = "darkblue") + # 若标注重叠可把上面的geom_text替换为下面的geom_text_repel # geom_text_repel(data = label_pos, aes(x = peak_x, y = peak_y, label = weathersit), # size = 3.5, color = "darkblue") + # 不需要图例可取消下面一行的注释 # theme(legend.position = "none") + labs(x = "单车租赁量", y = "密度") + theme_ipsum()
可调参数说明
- 若你的原数据中
weathersit的数值对应严重程度和默认顺序不同,调整factor中levels的顺序和labels的对应关系即可,保证自定义名称和天气等级匹配 - 可调整
geom_text的vjust、hjust参数修改文字和峰值的相对位置,也可直接指定坐标把文字放在你需要的蓝色圆圈位置
内容的提问来源于stack exchange,提问作者SaltySenator
相关产品推荐
相关产品推荐

