MATLAB绘制时间-风速散点图报错:输入参数需为数值型
解决MATLAB散点图绘制的数值转换问题
嘿,我来帮你捋捋这个问题!你现在遇到的核心问题是表格列的类型没转对,而且时间字符串没法直接给scatter用,咱们一步步来解决:
首先,先看你遇到的报错:
Error using scatter (line 55) Input arguments must be numeric or objects which can be converted to double.
Error in windconversions (line 18) scatter(time,wnd_TS)
这个报错很明确:scatter的X、Y轴都得是数值型,但你传的time和wnd_TS都是表格的列对象(不是纯数组),而且time还是字符串类型,自然转不了double。
再看你的代码问题:你写了table2array(wnd_TS);但没把转换后的结果赋值给新变量!所以wnd_TS还是原来的表格列,等于白转了。
具体解决步骤
1. 正确提取并转换风速数据
你可以直接用圆点索引提取表格里的数值列,或者转换后赋值:
T = readtable('allunderway.txt', 'HeaderLines', 2); % 方法一:直接用列名提取(如果你的表格有列名,比如WND_TS) wnd_TS_num = T.WND_TS; % 方法二:如果是默认列名(比如Var11),用索引提取后转数组 wnd_TS_num = table2array(T(:,11));
用class(wnd_TS_num)检查一下,结果是double类型就对了。
2. 把时间字符串转成数值型
字符串时间没法直接绘图,得转成MATLAB能识别的数值,这里给你两种常用方法:
方法一:转成日期时间对象再转成序列号
如果你的日期和时间是分开的两列,先合并成完整的时间字符串,再转成datetime,最后转成数值序列号:
% 合并日期和时间列(假设日期列是Var1,时间列是Var2,根据你的表格调整) full_time_str = strcat(T.Var1, ' ', T.Var2); % 转成datetime对象,注意InputFormat要匹配你的数据格式(比如截图里的日期是yyyy-MM-dd,时间是HH:mm:ss) time_datetime = datetime(full_time_str, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); % 转成数值型的日期序列号 time_num = datenum(time_datetime);
方法二:只转一天内的秒数(如果不需要完整日期)
如果你的数据都是同一天的,或者只关心当天的时间变化,可以把时间转成一天内的秒数:
% 提取时间字符串列 time_str = T.Var2; % 转成持续时间对象 time_duration = duration(time_str); % 转成秒数(数值型) time_num = seconds(time_duration);
3. 绘制散点图
现在用转换后的数值型数据绘图:
scatter(time_num, wnd_TS_num); xlabel('时间(秒)'); % 或者如果用了日期序列号,改成'时间(日期序列号)' ylabel('风速'); % 要是用了datetime对象,其实也可以直接传进去,scatter支持datetime类型: % scatter(time_datetime, wnd_TS_num);
额外小提示
- 用
readtable时,可以加上ReadVariableNames=true(默认就是),这样如果你的数据文件第三行(跳过2行后)是列名,就可以直接用T.DATE、T.TIME这种更直观的方式取列,不用记索引。 - 转换前用
class()查看变量类型,比如class(T(:,2)),能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

