ggplot2添加scale_y_continuous后图表消失问题求助
问题原因
你代码里的核心问题是把y轴的数值字段val用reorder()转换成了有序因子,这导致y轴的类型从连续型变成了离散型。而scale_y_continuous()是用来调整连续型y轴的,两者类型不兼容,所以图表无法显示。
另外,你用reorder(val, as.factor(year))的方式也没法实现「同一年份内柱子按升序排列」的需求——reorder()是根据第二个参数的均值来给第一个参数排序,这里每个year对应两个val值,排序逻辑不符合你的预期。
解决方法
要实现「同一年份内柱子按val升序排列」,同时让scale_y_continuous()正常工作,需要把y轴还原为数值型的val,并通过调整柱子的排序逻辑来实现需求。
方法1:直接在ggplot中指定排序规则
在aes()里添加order = val,让同一年份内的柱子按val的大小升序排列:
# Example data df <- data.frame(type = c("cat1", "cat1", "cat2", "cat2"), year = c(1,2,1,2), val = c(100,70,60,100)) library(ggplot2) ggplot(df, aes(x = as.factor(year), y = val, fill = type, order = val)) + geom_bar(stat = "identity", position=position_dodge(0.7), width = 0.6) + scale_y_continuous( expand = expansion(mult = c(0.03, 0.11)), breaks = seq(0, 100, by = 10), limits = c(0, max(df$val, na.rm = TRUE) + 10) )
方法2:先预处理数据(更严谨)
用dplyr结合forcats,按year分组后给type按val升序排序,再绘图:
library(ggplot2) library(dplyr) library(forcats) # 预处理数据:按年份分组,给type按val升序排序 df_sorted <- df %>% group_by(year) %>% mutate(type = fct_reorder(type, val)) %>% ungroup() # 绘图 ggplot(df_sorted, aes(x = as.factor(year), y = val, fill = type)) + geom_bar(stat = "identity", position=position_dodge(0.7), width = 0.6) + scale_y_continuous( expand = expansion(mult = c(0.03, 0.11)), breaks = seq(0, 100, by = 10), limits = c(0, max(df$val, na.rm = TRUE) + 10) )
两种方法都能实现你的需求:X轴为年份,同一年份内柱子按val升序排列,同时scale_y_continuous()可以正常调整Y轴刻度和范围。
内容的提问来源于stack exchange,提问作者Leksa99
相关产品推荐
相关产品推荐

