在R中从多数据框自动生成绘图的问题求助
批量生成ggplot绘图时无法正确调用数据框的解决方案
问题描述
作为R语言新手,我拥有四个数据框df_wspr_40、df_wspr_60、df_wspr_80、df_wspr_160,希望为它们生成相同样式的绘图。另有存储这些数据框名称数字部分的列表band:
> band [[1]] [1] 40 [[2]] [1] 60 [[3]] [1] 80 [[4]] [1] 160
尝试用for循环批量生成绘图,但无法让ggplot正确调用对应的数据框,原代码如下:
for (x in band) { current.df = paste("df_wspr_", x, sep="") plot.subtitle = paste(x,"m Band from ",first_row," to ",last_row, sep = "") pl_dis_wspr <- ggplot(data=current.df, aes(y=avg_distance,x=date_120_min_interval)) + geom_bar(stat="identity", width = 0.5, position = position_dodge (0.8)) + geom_smooth(aes(group = 1), linewidth = 1, method = "loess", se = TRUE) + labs(x="Date & Time", y = "Distance Km", title = "120 minute Average Distance", subtitle = plot.subtitle) + theme(axis.text.x = element_blank()) pl_dis_wspr }
问题原因
paste("df_wspr_", x, sep="")生成的是字符串(比如"df_wspr_40"),但ggplot()的data参数需要传入实际的数据框对象,而非字符串形式的名称,因此无法识别对应的数据。
两种解决方法
方法1:使用get()函数获取数据框对象
get()函数可以根据字符串名称找到环境中对应的对象,修改循环中获取数据框的代码即可:
for (x in band) { # 将字符串转为数据框对象 current.df <- get(paste("df_wspr_", x, sep="")) plot.subtitle <- paste(x,"m Band from ", first_row," to ", last_row, sep = "") pl_dis_wspr <- ggplot(data=current.df, aes(y=avg_distance, x=date_120_min_interval)) + geom_bar(stat="identity", width = 0.5, position = position_dodge(0.8)) + geom_smooth(aes(group = 1), linewidth = 1, method = "loess", se = TRUE) + labs(x="Date & Time", y = "Distance Km", title = "120 minute Average Distance", subtitle = plot.subtitle) + theme(axis.text.x = element_blank()) # 显式打印绘图(脚本中必须添加,RStudio交互式环境可省略) print(pl_dis_wspr) }
方法2:将数据框存入列表(更规范的R编程风格)
把分散的数据框统一存入列表,避免通过字符串名称调用,代码更易维护:
# 先创建包含所有数据框的列表 df_list <- list( "40" = df_wspr_40, "60" = df_wspr_60, "80" = df_wspr_80, "160" = df_wspr_160 ) # 遍历列表的频段名称和对应数据框 for (band_num in names(df_list)) { current.df <- df_list[[band_num]] plot.subtitle <- paste(band_num,"m Band from ", first_row," to ", last_row, sep = "") pl_dis_wspr <- ggplot(data=current.df, aes(y=avg_distance, x=date_120_min_interval)) + geom_bar(stat="identity", width = 0.5, position = position_dodge(0.8)) + geom_smooth(aes(group = 1), linewidth = 1, method = "loess", se = TRUE) + labs(x="Date & Time", y = "Distance Km", title = "120 minute Average Distance", subtitle = plot.subtitle) + theme(axis.text.x = element_blank()) print(pl_dis_wspr) }
额外提示
如果需要保存所有生成的绘图,可以创建一个空列表,将每个绘图存入其中:
plot_list <- list() for (x in band) { current.df <- get(paste("df_wspr_", x, sep="")) # ... 生成pl_dis_wspr的代码 ... plot_list[[as.character(x)]] <- pl_dis_wspr }
之后可通过plot_list[["40"]]直接调用对应频段的绘图。
内容的提问来源于stack exchange,提问作者Sean Smith
相关产品推荐
相关产品推荐

