不同数据类型的 matlab plot(x,y)
matlab plot(x,y) of different data type
我得到了作为元胞数组导入的不同类型的数据 (2945 * 3)。第一列数据类型已导入为文本(时间,例如 1/1/1990),而第二列和第三列是数字。
到目前为止,我使用 cell2mat 将第 2 列和第 3 列转换为双倍。因此 plot(y) 有效 {y 是第二列或第三列数据},但是我想知道如何处理第一列中的文本数据类型以尝试使用 plot(x,y)。
如有任何想法,我们将不胜感激。干杯
--------sample.csv-------------
Date LAST Rt
1/27/2018 20 0.234556
1/26/2019 20.05 0.184556
1/23/2040 20.1 0.134556
1/22/1990 20.15 0.084556
1/21/1991 20.2 0.034556
1/20/1993 20.25 -0.015444
1/19/1998 20.3 -0.065444
1/16/2050 20.35 -0.115444
1/15/2030 20.4 -0.165444
--------cell array appearance------------
1 | 2 | 3
1| '1/27/2018' 20 0.234556
2| '1/26/2019' 20.05 0.184556
3| '1/23/2040' 20.1 0.134556
4| '1/22/1990' 20.15 0.084556
5| '1/21/1991' 20.2 0.034556
6| '1/20/1993' 20.25 -0.015444
7| '1/19/1998' 20.3 -0.065444
8| '1/16/2050' 20.35 -0.115444
9| '1/15/2030' 20.4 -0.165444
您可以使用 XTick
和 XTickLabel
。前者将设置你想要在 X 轴上的位置和数量(我想你会想要每个 X 数据一个,但你也可能想要跳 10 x 10)。第二个将在这些刻度位置设置标签。如果标签小于刻度,它们会重复,所以要小心。
举个例子:
x = [0 1 2 3];
y = [2 0 1 1];
plot (x, y);
yourstrings={'Banana', 'T', 'Potato', '45'};
set(gca,'XTick',x(1):x(end))
set(gca,'XTickLabel',yourstrings)
第二种选择是使用 text
。你可以把文字放在情节中任何你喜欢的地方。我再举例说明一下。当然我并不是想把它写成 "nice",但是如果 you/d 喜欢,你可以尝试偏移文本的位置等等以获得更多 "beautiful" 的情节.
x = [0 1 2 3];
y = [2 0 1 1];
plot (x, y);
yourstrings={'Banana', 'T', 'Potato', '45'};
for ii=1:length(yourstrings)
text(x(ii),y(ii),yourstrings{ii})
end
您还可以使用 datenum
将文本转换为日期序列号(从 Octave 命令行复制):
>> test
test =
{
[1,1] = 1/1/2000
[1,2] = 1/2/2001
[1,3] = 10/2/2001
[1,4] = 10/3/2001
[1,5] = 10/3/2005
}
>> x_dates = cellfun('datenum',test(:,1))
x_dates =
730486 730853 731126 731127 732588
>> y = rand(size(x_dates));
>> plot(x_dates,y)
>> datetick('x','dd/mm/yyyy')
更新:
看起来 cellfun
需要 MATLAB 中的函数句柄,因此您可能需要执行如下操作:
x_dates = cellfun(@datenum,test(:,1))
您可以使用 cellfun 函数循环遍历您的矩阵 (:,1) 来转换字符串,从而创建一个包含可用数据的新矩阵(或重写您当前的矩阵)。
或者只是为了绘制:
plot(cellfun(@(x)str2double(x), Measures(:,i)))
其中 i = 1:长度(矩阵)
我得到了作为元胞数组导入的不同类型的数据 (2945 * 3)。第一列数据类型已导入为文本(时间,例如 1/1/1990),而第二列和第三列是数字。
到目前为止,我使用 cell2mat 将第 2 列和第 3 列转换为双倍。因此 plot(y) 有效 {y 是第二列或第三列数据},但是我想知道如何处理第一列中的文本数据类型以尝试使用 plot(x,y)。
如有任何想法,我们将不胜感激。干杯
--------sample.csv-------------
Date LAST Rt
1/27/2018 20 0.234556
1/26/2019 20.05 0.184556
1/23/2040 20.1 0.134556
1/22/1990 20.15 0.084556
1/21/1991 20.2 0.034556
1/20/1993 20.25 -0.015444
1/19/1998 20.3 -0.065444
1/16/2050 20.35 -0.115444
1/15/2030 20.4 -0.165444
--------cell array appearance------------
1 | 2 | 3
1| '1/27/2018' 20 0.234556
2| '1/26/2019' 20.05 0.184556
3| '1/23/2040' 20.1 0.134556
4| '1/22/1990' 20.15 0.084556
5| '1/21/1991' 20.2 0.034556
6| '1/20/1993' 20.25 -0.015444
7| '1/19/1998' 20.3 -0.065444
8| '1/16/2050' 20.35 -0.115444
9| '1/15/2030' 20.4 -0.165444
您可以使用 XTick
和 XTickLabel
。前者将设置你想要在 X 轴上的位置和数量(我想你会想要每个 X 数据一个,但你也可能想要跳 10 x 10)。第二个将在这些刻度位置设置标签。如果标签小于刻度,它们会重复,所以要小心。
举个例子:
x = [0 1 2 3];
y = [2 0 1 1];
plot (x, y);
yourstrings={'Banana', 'T', 'Potato', '45'};
set(gca,'XTick',x(1):x(end))
set(gca,'XTickLabel',yourstrings)
第二种选择是使用 text
。你可以把文字放在情节中任何你喜欢的地方。我再举例说明一下。当然我并不是想把它写成 "nice",但是如果 you/d 喜欢,你可以尝试偏移文本的位置等等以获得更多 "beautiful" 的情节.
x = [0 1 2 3];
y = [2 0 1 1];
plot (x, y);
yourstrings={'Banana', 'T', 'Potato', '45'};
for ii=1:length(yourstrings)
text(x(ii),y(ii),yourstrings{ii})
end
您还可以使用 datenum
将文本转换为日期序列号(从 Octave 命令行复制):
>> test
test =
{
[1,1] = 1/1/2000
[1,2] = 1/2/2001
[1,3] = 10/2/2001
[1,4] = 10/3/2001
[1,5] = 10/3/2005
}
>> x_dates = cellfun('datenum',test(:,1))
x_dates =
730486 730853 731126 731127 732588
>> y = rand(size(x_dates));
>> plot(x_dates,y)
>> datetick('x','dd/mm/yyyy')
更新:
看起来 cellfun
需要 MATLAB 中的函数句柄,因此您可能需要执行如下操作:
x_dates = cellfun(@datenum,test(:,1))
您可以使用 cellfun 函数循环遍历您的矩阵 (:,1) 来转换字符串,从而创建一个包含可用数据的新矩阵(或重写您当前的矩阵)。
或者只是为了绘制:
plot(cellfun(@(x)str2double(x), Measures(:,i)))
其中 i = 1:长度(矩阵)