在R中使用ggplot绘制时间序列散点图遇异常求助
问题解决:ggplot散点图仅显示单个点的问题
问题描述
有一个包含两列的数据框:
- 第一列
Order Time:POSIXct格式的请求发起时间 - 第二列
Order to Final (min):请求完成耗时(单位:分钟)
使用base R的plot()可正常生成散点图,但执行以下ggplot代码时:
ggplot(time_frame, aes( 'Order Time', 'Order to Final (min)')) + geom_point()
出现警告:
Warning: [38;5;250mAll aesthetics have length 1, but the data has 87 rows. [36mℹ[38;5;250m Did you mean to use
annotate()?[39m
图表仅显示单个点,期望得到与base R plot一致的散点图效果。
数据框的dput输出:
structure(list(`Order Time` = structure(c(-2209067733, -2208991620, -2209031808, -2209025030, -2209022501, -2209006936, -2209007168, -2209027968, -2209035932, -2209028941, -2209004948, -2209070934, -2209030418, -2209018856, -2209018041, -2209041405, -2209055940, -2209024891, -2209054157, -2209007145, -2208989104, -2209023868, -2209065315, -2208996091, -2209016728, -2209045016, -2209022746, -2209008132, -2209020141, -2209003186, -2209023453, -2209037310, -2208994122, -2209017969, -2209048043, -2209019289, -2209068394, -2209045114, -2208994213, -2209039028, -2209016558, -2209013258, -2209059017, -2208999105, -2209030858, -2209005507, -2209004852, -2208997739, -2209017292, -2209027275, -2209002050, -2209002360, -2209018231, -2209028904, -2209023644, -2208990474, -2209000518, -2208993688, -2209021437, -2209018324, -2208990042, -2209041306, -2209015105, -2208990091, -2209074416, -2209045786, -2209001815, -2209005009, -2209017487, -2208991033, -2209068840, -2209012408, -2209039642, -2209014277, -2209074441, -2209065490, -2209064888, -2209025754, -2209003145, -2209009233, -2209031908, -2209025111, -2209014456, -2208997047, -2209039772, -2209068463, -2209055958), class = c("POSIXct", "POSIXt"), tzone = "UTC"), `Order to Final (min)` = c(311, 112, 105, 18, 78, 50, 64, 60, 25, 238, 47, 85, 161, 78, 87, 51, 221, 86, 170, 93, 145, 53, 56, 31, 83, 63, 86, 177, 28, 71, 72, 40, 58, 89, 71, 40, 281, 75, 11, 70, 80, 71, 131, 108, 46, 53, 83, 31, 43, 35, 46, 168, 42, 132, 149, 100, 154, 61, 75, 49, 157, 56, 60, 224, 56, 55, 70, 220, 59, 145, 102, 79, 96, 423, 67, 834, 233, 35, 87, 52, 31, 103, 50, 108, 192, 135, 56)), row.names = c(NA, -87L), class = c("tbl_df", "tbl", "data.frame"))
原因分析
在aes()中使用单引号包裹列名时,ggplot会将其视为固定字符串常量,而非引用数据框中的列。这导致美学映射的长度为1,而数据有87行,因此只会绘制一个点,并触发警告。
解决方法
方法1:用反引号包裹含空格的列名
直接引用列名,对于包含空格或特殊字符的列名,用反引号(`)包裹:
library(ggplot2) ggplot(time_frame, aes(`Order Time`, `Order to Final (min)`)) + geom_point()
方法2:使用.data代词引用列
这是更规范的方式,尤其适合在函数或复杂代码中使用:
ggplot(time_frame, aes(.data[["Order Time"]], .data[["Order to Final (min)"]])) + geom_point()
验证效果
运行上述任意一种代码,都会生成与base R plot(time_frame$Order Time, time_frame$Order to Final (min))完全一致的散点图,所有87个数据点都会正常显示。
内容的提问来源于stack exchange,提问作者Jacob267
相关产品推荐
相关产品推荐

