R语言数据行选择与plot绘图ylim参数自动调整技术咨询
R代码自动化调整解决方案
问题1:自动获取数据筛选的上限天数
直接用nrow(datas)代替硬编码的12即可,该函数会自动返回datas数据集的总行数,也就是你需要的最大天数,后续DR列数量变动时无需手动修改。
修改代码如下:
# 替换原 datas<-datas[dif:12,] datas<-datas[dif:nrow(datas), ]
如果更贴合天数语义,也可以用max(datas$Days)代替nrow(datas),效果完全一致。
问题2:自动适配绘图ylim上限并预留留白
基于Numbers列的最大值按比例预留顶部空间即可,通常预留20%的留白美观度较高,搭配ceiling()函数取整后数值更规整,无需手动指定固定值。
修改代码如下:
# 替换原 plot(Numbers ~ Days, ylim=c(0,40), data = datas) plot(Numbers ~ Days, ylim=c(0, ceiling(max(datas$Numbers, na.rm = TRUE) * 1.2)), data = datas)
如果需要调整留白比例,修改乘法系数即可,比如需要预留15%留白就改为*1.15。
修改后完整可运行代码
library(dplyr) library(lubridate) library(tidyverse) df1 <- structure( list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28", "2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"), Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"), DR01 = c(34,31,34,33,33,34,33,36), DR02= c(32,21,16,17,13,12,17,14),DR03= c(39,15,14,13,13,12,11,15), DR04 = c(35,32,13,13,16,12,11,19),DR05 = c(35,14,15,13,16,12,11,19), DR06 = c(32,14,13,13,15,16,17,18),DR07 = c(32,35,34,34,39,34,37,38), DR08 = c(0,0,0,11,12,0,0,0),DR09 = c(0,0,12,11,0,0,0,12),DR010 = c(0,0,0,0,0,0,0,0),DR011 = c(0,0,12,0,0,0,0,0), DR012 = c(0,14,0,0,0,0,0,0)), class = "data.frame", row.names = c(NA, -8L)) #Generate graph dmda<-"2021-07-01" datas<-df1 %>% filter(date2 == ymd(dmda)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) colnames(datas)<-c("Days","Numbers") dif <- as.Date(dmda) - as.Date(df1$date1[1]) + 1 # 修改1:自动取最大行数代替硬编码12 datas<-datas[dif:nrow(datas),] # 修改2:自动计算ylim上限,预留20%留白 plot(Numbers ~ Days, ylim=c(0, ceiling(max(datas$Numbers, na.rm = TRUE) * 1.2)), data = datas) model <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 47,b2 = 0), data = datas) new.data <- data.frame(Days = with(datas, seq(min(Days),max(Days),len = 45))) lines(new.data$Days,predict(model,newdata = new.data))
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

