如何在ggplot2分面网格中依据纬度对location因子排序?
解决ggplot2分面按站点纬度排序的问题
问题的核心在于:ggplot2的分面顺序是由因子的水平顺序决定的,仅仅对数据框排序不会改变因子水平的默认顺序,所以绘图还是会按site01到site08的原始排列展示。我们需要重新指定location因子的水平顺序,让它对应每个站点的纬度值排序。
下面是具体的解决步骤:
1. 重新排序location因子的水平
你可以用dplyr配合forcats包的fct_reorder函数(或者基础R方法),根据每个站点的纬度值调整location的水平顺序。比如想要按纬度从低到高排序,代码如下:
方法一:用forcats包(更简洁)
# 没安装的话先装包 # install.packages(c("dplyr", "forcats")) library(dplyr) library(forcats) # 按latitude升序排序location因子,.desc=TRUE可改成降序 df <- df %>% mutate(location = fct_reorder(location, latitude, .desc = FALSE))
方法二:基础R实现
# 先提取每个站点的纬度并排序,得到新的location顺序 sorted_locations <- df %>% select(location, latitude) %>% distinct() %>% arrange(latitude) %>% pull(location) # 更新location因子的水平顺序 df$location <- factor(df$location, levels = sorted_locations)
2. 用修改后的数据集绘图
现在再运行你原来的ggplot代码,分面的location就会按照纬度排序展示了:
library(scales) library(ggplot2) sp <- ggplot(df, aes(x=year, y=value, col=coralType)) + geom_point(stat="identity") + facet_grid(location ~ coralType) + theme( strip.text.x = element_text(size=8), strip.text.y = element_text(size=8, face="bold", angle = 0), strip.background = element_rect(colour="red", fill="#CCCCFF") ) + scale_x_continuous(name="Year", breaks=c(2010, 2013, 2016)) + scale_y_continuous(name="Bleaching Percentage", breaks=seq(0,1,0.5), labels=percent)+ geom_smooth(method="lm") sp
为什么原来的排序没用?
当location是因子时,它的水平顺序在创建时就已确定(默认是字母顺序:site01到site08)。对整个数据框排序只会改变行的展示顺序,但不会修改因子本身的水平优先级,所以ggplot分面时依然会遵循因子的原始水平顺序。
内容的提问来源于stack exchange,提问作者Saksham Nagpal
相关产品推荐
相关产品推荐

