向ggplot函数传入参数实现排序功能失效问题排查
问题原因及修复方案
你的代码排序功能失效是因为两处参数引用错误:
- 排序分支里的
reorder函数使用了未定义的var变量,应该替换为传入的xvar参数 - 排序依据直接写死了
score变量名,应该用传入的yvar参数,保证函数的通用性
修正后的完整代码
score <- c(25,34,28,52,24,45,35,29) status <- c("Poor", "Improved", "Excellent", "Poor","Poor", "Improved", "Excellent", "Poor") df <- data.frame(score, status) charts <- function(my_df, xvar, yvar, x_sort){ if(x_sort == "yes") ggplot(data = my_df, aes( x = reorder(get(xvar), -get(yvar)), y = get(yvar))) + geom_col() + # 新版本ggplot2推荐用geom_col替代geom_bar(stat='identity'),语义更清晰 labs(x = xvar, y = yvar) else ggplot(data = my_df, aes( x = get(xvar), y = get(yvar))) + geom_col() + labs(x = xvar, y = yvar) } # 测试调用 charts(df,"status","score","yes") # 现在会按score降序排列status类别 charts(df,"status","score","no") # 保持原始顺序绘图
补充说明
reorder(get(xvar), -get(yvar))通过y轴变量的负值作为权重,实现x轴类别的降序排序;若要升序,去掉负号即可geom_col()和geom_bar(stat='identity')功能完全一致,前者更适合展示已有数值的柱状图
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

