R ggplot2自动计算ylim取值报object 'sales' not found错误如何解决
报错原因
ylim() 函数的参数无法直接访问ggplot2映射的数据集列,你在管道运算后生成的sales列仅在aes()的求值环境中可被直接调用,ylim()属于图层全局参数,默认从全局环境查找sales对象,因此触发找不到对象的报错。
解决方法
有两种常用的实现方案:
方案1:提前将统计后的数据存为变量,再计算ylim取值
把管道处理后的结果先赋值给中间变量,之后直接调用变量的sales列计算范围即可,修改后代码如下:
library(tidyverse) plot_data <- data.frame(category=rep(letters[1:5],10), amount=rep(rnorm(5),10)) # 先处理数据存为中间变量 processed_data <- plot_data %>% group_by(category) %>% summarise(sales=sum(amount)) %>% arrange(-sales) %>% mutate(category=fct_inorder(category)) # 绘图时直接调用processed_data的sales列计算范围 ggplot(processed_data, aes(x=category,y=sales))+ geom_bar(stat='identity')+ ylim(min(processed_data$sales)*1.1, max(processed_data$sales)*1.1)
方案2:使用scale_y_continuous()通过函数动态计算范围
如果不想创建中间变量,可以用scale_y_continuous()的limits参数传入匿名函数,函数会自动接收当前y轴的数值向量作为输入,直接计算范围即可,修改后代码如下:
library(tidyverse) plot_data <- data.frame(category=rep(letters[1:5],10), amount=rep(rnorm(5),10)) plot_data %>% group_by(category) %>% summarise(sales=sum(amount)) %>% arrange(-sales) %>% mutate(category=fct_inorder(category))%>% ggplot(aes(x=category,y=sales))+ geom_bar(stat='identity')+ # 传入匿名函数动态计算范围,x就是当前y轴的所有取值 scale_y_continuous(limits = function(x) c(min(x)*1.1, max(x)*1.1))
注意:如果
sales全部为正数且需要y轴下限为0,可以自行调整公式,比如把min(x)*1.1替换为0即可。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

