R语言:无X变量多列数据绘图、批量处理及极值标记求助
R语言数据可视化问题解决方案
问题1:多列数据用1-101序列作为X轴,修复zoo绘图的X轴标签混乱
方案1:用ggplot2实现(更灵活可控)
先将宽格式数据转为长格式,手动生成1到101的X序列,再绘图:
library(tidyverse) # 处理目标数据框(取前9列) df_long <- HIP_131_Y0_LC_walk1[, 1:9] %>% mutate(x = 1:n()) %>% # 生成X轴序列1-101 pivot_longer(cols = -x, names_to = "变量", values_to = "数值") # 绘图 ggplot(df_long, aes(x = x, y = 数值, color = 变量)) + geom_line() + scale_x_continuous(breaks = seq(0, 101, by = 10)) # 自定义X轴刻度间隔
方案2:修复zoo绘图的X轴标签
给zoo对象指定明确的index为1-101,就能让X轴标签正常显示:
library(zoo) # 创建带指定index的zoo对象 df_zoo <- zoo(HIP_131_Y0_LC_walk1[1:101, 1:9], order.by = 1:101) plot(df_zoo, xlab = "X", ylab = "数值")
问题2:批量处理列表中的多个数据框
方案1:ggplot2批量生成图形
定义处理单个数据框的绘图函数,再用lapply批量应用:
library(tidyverse) library(gridExtra) # 定义单个数据框的绘图函数 plot_single_df <- function(df) { df_long <- df %>% mutate(x = 1:n()) %>% pivot_longer(cols = -x, names_to = "变量", values_to = "数值") ggplot(df_long, aes(x = x, y = 数值, color = 变量)) + geom_line() + scale_x_continuous(limits = c(1, 101)) } # 批量生成图形列表 graph_list <- lapply(myfiles, plot_single_df) # 拼接并展示所有图形 do.call(grid.arrange, graph_list)
方案2:zoo批量绘图
在函数内完成zoo对象创建与绘图,批量执行:
library(zoo) # 定义zoo绘图函数 plot_zoo_single <- function(df) { df_zoo <- zoo(df[1:101, ], order.by = 1:101) plot(df_zoo) } # 批量绘制(会逐个弹出图形窗口) lapply(myfiles, plot_zoo_single)
问题3:在图中标记数据极值
推荐用ggplot2实现,灵活且易操作:
library(tidyverse) # 先处理数据,标记每个变量的最大值和最小值 df_long_with_extremes <- df_long %>% group_by(变量) %>% mutate( 是最大值 = 数值 == max(数值), 是最小值 = 数值 == min(数值) ) %>% ungroup() # 绘图并标记极值 ggplot(df_long_with_extremes, aes(x = x, y = 数值, color = 变量)) + geom_line() + # 标记最大值(黑色边框,填充对应颜色的圆点) geom_point( data = filter(df_long_with_extremes, 是最大值), aes(fill = 变量), shape = 21, size = 3, color = "black" ) + # 标记最小值(黑色边框,填充对应颜色的方块) geom_point( data = filter(df_long_with_extremes, 是最小值), aes(fill = 变量), shape = 22, size = 3, color = "black" ) + scale_x_continuous(limits = c(1, 101))
内容的提问来源于stack exchange,提问作者Edgar Garcia
相关产品推荐
相关产品推荐

