ggplot中用min()和max()设置xlim、ylim失效问题排查
为什么用min()/max()设置ggplot轴范围会报错?
嘿,我来帮你揪出这个问题的根源!你代码里的问题出在**xlim()/ylim()的作用域**上——你直接在里面写min(mpg)的时候,R根本不知道mpg是哪儿来的!
问题原因
你用管道%>%把处理好的mtcars子集传给了ggplot(),但xlim()、ylim()这类轴范围设置函数并不属于管道的数据上下文。简单说:
ggplot()知道你传的是哪个数据框,能识别aes()里的mpg、disp是列名;- 但
xlim()是在全局环境里查找mpg这个变量的,而你根本没在全局定义过它,所以会抛出“找不到对象'mpg'”的错误。
解决方案
这里给你三种可行的写法,按需选择:
方法1:用coord_cartesian()(推荐,不丢失数据)
coord_cartesian()可以通过.引用管道前的数据集,而且它只是调整显示范围,不会过滤掉超出范围的数据点(这是和xlim()的核心区别):
mtcars %>% select(mpg, cyl, disp, wt) %>% filter(complete.cases(disp)) %>% ggplot() + geom_point(aes(x=mpg, y=disp, colour=cyl), size=3) + coord_cartesian(xlim = range(.$mpg, na.rm=TRUE), ylim = range(.$disp, na.rm=TRUE)) + scale_colour_gradient(low="red", high="green", name = "cyl")
方法2:先把数据存为变量
把处理好的数据存成一个变量,之后直接用变量名引用列,逻辑更直观:
# 先处理数据并保存 clean_data <- mtcars %>% select(mpg, cyl, disp, wt) %>% filter(complete.cases(disp)) # 再绘图 ggplot(clean_data) + geom_point(aes(x=mpg, y=disp, colour=cyl), size=3) + xlim(min(clean_data$mpg, na.rm=TRUE), max(clean_data$mpg, na.rm=TRUE)) + ylim(min(clean_data$disp, na.rm=TRUE), max(clean_data$disp, na.rm=TRUE)) + scale_colour_gradient(low="red", high="green", name = "cyl")
方法3:用scale_x_continuous()/scale_y_continuous()
这类刻度函数的limits参数同样支持用.引用管道数据,还能顺便设置刻度标签、断点等其他参数:
mtcars %>% select(mpg, cyl, disp, wt) %>% filter(complete.cases(disp)) %>% ggplot() + geom_point(aes(x=mpg, y=disp, colour=cyl), size=3) + scale_x_continuous(limits = range(.$mpg, na.rm=TRUE)) + scale_y_continuous(limits = range(.$disp, na.rm=TRUE)) + scale_colour_gradient(low="red", high="green", name = "cyl")
内容的提问来源于stack exchange,提问作者val
相关产品推荐
相关产品推荐

