如何在R语言中将变量x生成的点添加至代码1生成的散点图并设置为红色
如何将变量x的红色点添加到现有散点图中?
没问题,我帮你调整代码,把代码2生成的红色点添加到代码1的散点图里。核心思路是先绘制原散点图,再用points()函数叠加红色的PV点,下面是完整的修改后代码:
library(dplyr) library(tidyr) library(lubridate) data <- structure( list(Id=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), date1 = c("2021-06-20","2021-06-20","2021-06-20","2021-06-20","2021-06-20", "2021-06-20","2021-06-20","2021-06-20","2021-06-20","2021-06-20","2021-06-20", "2021-06-20","2021-06-20","2021-06-20","2021-06-20","2021-06-20","2021-06-20", "2021-06-20","2021-06-20","2021-06-20","2021-06-20"), date2 = c("2021-07-01","2021-07-01","2021-07-01","2021-07-01","2021-04-02", "2021-04-02","2021-04-02","2021-04-02","2021-04-02","2021-04-02","2021-04-03", "2021-04-03","2021-04-03","2021-04-03","2021-04-03","2021-04-08","2021-04-08", "2021-04-09","2021-04-09","2021-04-10","2021-04-10"), Week= c("Thursday","Thursday","Thursday","Thursday","Friday","Friday","Friday","Friday", "Friday","Friday","Saturday","Saturday","Saturday","Saturday","Saturday","Thursday", "Thursday","Friday","Friday","Saturday","Saturday"), DTPE = c("Ho","Ho","Ho","Ho","","","","","","","","","","","","","","","","Ho","Ho"), D1 = c(8,1,9, 3,5,4,7,6,3,8,2,3,4,6,7,8,4,2,6,2,3), DR01 = c(4,1,4,3,3,4,3,6,3,7,2,3,4,6,7,8,4,2,6,7,3), DR02 = c(8,1,4,3,3,4,1,6,3,7,2,3,4,6,7,8,4,2,6,2,3), DR03 = c(7,5,4,3,3,4,1,5,3,3,2,3,4,6,7,8,4,2,6,4,3), DR04= c(4,5,6,7,3,2,7,4,2,1,2,3,4,6,7,8,4,2,6,4,3),DR05 = c(9,5,4,3,3,2,1,5,3,7,2,3,4,7,7,8,4,2,6,4,3), DR06 = c(5,4,3,3,6,2,1,9,3,7,2,3,4,7,7,8,4,2,6,4,3)), class = "data.frame", row.names = c(NA, -21L)) graph <- function(dt, dta = data) { dim_data<-dim(data) day<-c(seq.Date(from = as.Date(data$date2[1]), by = "days", length = dim_data[1] )) data_grouped <- data %>% mutate(across(starts_with("date"), as.Date)) %>% group_by(date2) %>% summarise(Id = first(Id), date1 = first(date1), Week = first(Week), DTPE = first(DTPE), D1 = sum(D1)) %>% select(Id,date1,date2,Week,DTPE,D1) # 修复原代码的小问题:将DTPE空值转为NA的操作需要赋值生效 data_grouped <- data_grouped %>% mutate(DTPE = na_if(DTPE, "")) df_OC<-subset(data_grouped, DTPE == "") ds_CO = df_OC %>% filter(weekdays(date2) %in% weekdays(as.Date(dt))) mean<-mean(ds_CO$D1) sd<-sd(ds_CO$D1) # 提取原散点图的数据,单独存储方便后续使用 plot_data <- dta %>% filter(date2 == ymd(dt)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) # 绘制原散点图 plot(plot_data$name, plot_data$val, xlab = "Days", ylab = "Number", xlim = c(0, 45), cex=1.5, cex.lab=1.5, cex.axis=1.5, cex.main=2, cex.sub=2, lwd=2.5, ylim = c((min(plot_data$val) %/% 10) * 15, (max(plot_data$val) %/% 10 + 1) * 100)) # 添加原有的水平线 abline(h=mean, col='blue') abline(h=(mean + sd), col='green',lty=2) abline(h=(mean - sd), col='orange',lty=2) # 生成代码2中变量x对应的点数据(仅筛选当前dt日期的行) x_data <- dta %>% filter(date2 == ymd(dt)) %>% # 计算DR03到DR06的PV值:D1减去对应DR列的值 mutate(across(starts_with("DR03"), ~ D1 - .x, .names = "{.col}_PV")) %>% select(DR03_PV:DR06_PV) %>% # 转成长格式,提取x轴的天数(3-6)和对应的PV值 pivot_longer(everything(), names_pattern = "DR(.+)_PV", values_to = "pv_val") %>% mutate(name = as.numeric(name)) # 叠加红色的PV点,用实心圆区分原散点 points(x_data$name, x_data$pv_val, col = "red", cex = 1.5, pch = 16) } # 调用函数测试 graph("2021-04-09", data)
关键修改说明:
- 修复了原代码中
data_grouped处理DTPE空值时未赋值的小问题,确保后续筛选逻辑正常。 - 将原散点图的数据单独存储为
plot_data,让代码更清晰,也避免重复计算。 - 在函数内部生成对应当前日期的PV点数据
x_data,确保只处理和当前散点图匹配的日期数据。 - 使用
points()函数叠加红色实心点,参数cex=1.5和原散点大小一致,pch=16让红色点更醒目,方便和原黑色散点区分。
运行修改后的代码,你就能看到原散点图上叠加了红色的PV点啦!
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

