从同一数据框绘图时出现'x' and 'y' lengths differ错误
绘图报错:x与y长度不匹配问题分析及解决
原始代码
library("ggplot2") GDP_data <- read.csv("US GDP.csv", header=FALSE, sep=",") GDP_data = data.frame(GDP_data) names(GDP_data) <- GDP_data[1,] GDP_data <- GDP_data[-1,] plot(x=GDP_data["level-current"], y=GDP_data["date"], type="l",col="red", main="")
数据摘要(summary输出)
date level-current level-chained change-current change-chained Length:86 Length:86 Length:86 Length:86 Length:86 Class :character Class :character Class :character Class :character Class :character Mode :character Mode :character Mode :character Mode :character Mode :character
触发的错误
Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths differ
关键矛盾点
summary显示两列长度均为86,但用length(GDP_data["level-current"])和length(GDP_data["date"])查询时,结果均为1。
问题原因
用单括号[]提取列时,得到的是**数据框(data frame)**而非向量。length()函数作用于数据框时,返回的是数据框的列数,所以结果是1。而plot()函数需要的是向量类型的输入,传入数据框会导致解析错误,触发长度不匹配的提示。
另外,当前数据的列都是字符型,直接绘图会有逻辑问题——比如level-current是数值型数据却存为字符,date是日期也存为字符,需要先做类型转换才能得到合理的图表。
修正后的代码
library("ggplot2") # 读取数据并处理表头 GDP_data <- read.csv("US GDP.csv", header=FALSE, sep=",") names(GDP_data) <- GDP_data[1,] GDP_data <- GDP_data[-1,] # 类型转换:字符转数值/日期 GDP_data$`level-current` <- as.numeric(GDP_data$`level-current`) GDP_data$date <- as.Date(GDP_data$date) # 用$或[[提取向量进行绘图 plot(x=GDP_data$date, y=GDP_data$`level-current`, type="l", col="red", main="美国GDP走势")
说明
- 提取列时,使用
$列名或[[列名]]可以得到向量,此时length()返回的是向量的元素个数(86),符合plot()的输入要求。 - 转换数据类型后,日期轴会自动按时间顺序排列,数值轴也能正确展示GDP的数值变化,图表逻辑更合理。
内容的提问来源于stack exchange,提问作者tk1234
相关产品推荐
相关产品推荐

