如何在ggplot中按集群最早日期对Y轴集群进行排序?
按集群最早日期排序Y轴的解决方案
问题描述
现有分组数据框,使用ggplot绘制散点图时,Y轴的cluster排序不符合需求,希望Y轴的cluster按各自集群的最早日期排序(例如Cluster_07最早日期最早,放在Y轴最底部;Cluster_50排在uid_21之前)。
当前绘图代码:
ggplot(subset_so, aes(reorder(date,factor(cluster)), reorder(factor(cluster),date))) + geom_line(aes(group=cluster), color='black') + geom_point(size=3) + ylab("cluster") + xlab("date") + theme_light() + theme( legend.position = "bottom", legend.key=element_rect(fill='gray96'), legend.title =element_text(size=10), text=element_text(size=12), axis.title.x = element_text(vjust = 0, size = 11), axis.title.y = element_text(vjust = 2, size = 11), axis.text.x = element_text(angle = 90, hjust = 1, size = 9), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())
解决方法
核心思路是先计算每个cluster对应的最早日期,再用这个日期值重新排序cluster因子。
步骤1:计算每个cluster的最早日期
用dplyr分组聚合生成每个cluster的最小日期,再合并回原数据框:
library(dplyr) # 计算每个cluster的最早日期 cluster_min_dates <- subset_so %>% group_by(cluster) %>% summarise(min_date = min(date)) %>% ungroup() # 将最小日期合并到原数据框 subset_so <- subset_so %>% left_join(cluster_min_dates, by = "cluster")
步骤2:用最早日期排序Y轴的cluster
修改ggplot的aes参数,将Y轴的cluster按min_date排序:
ggplot(subset_so, aes(x = date, y = reorder(cluster, min_date))) + geom_line(aes(group=cluster), color='black') + geom_point(size=3) + ylab("cluster") + xlab("date") + theme_light() + theme( legend.position = "bottom", legend.key=element_rect(fill='gray96'), legend.title =element_text(size=10), text=element_text(size=12), axis.title.x = element_text(vjust = 0, size = 11), axis.title.y = element_text(vjust = 2, size = 11), axis.text.x = element_text(angle = 90, hjust = 1, size = 9), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())
补充:反转排序(最早日期的cluster在Y轴顶部)
如果需要让最早日期的cluster显示在Y轴顶部,只需在reorder中对min_date取负:
y = reorder(cluster, -min_date)
内容的提问来源于stack exchange,提问作者Prakki Rama
相关产品推荐
相关产品推荐

