我有两组数据:一组每天120个数据点(10分钟记录间隔),另一组每天96个数据点(15分钟记录间隔)。
我已经有了一个功能性的matlab脚本来绘制24小时内具有相同点数的两个数据文件。问题是这个脚本依赖于每天标记x轴的点数。
代码的主要部分如下:
data1=importdata(a);
data2=importdata(b);
data=data1.data(:,1);
Data=data2.data(:,1);
text=data1.textdata;
for i=1:length(data(:,1))
dates(i,:)=[str2num(text{i,1}(1:2)),str2num(text{i,1}(4:5)),str2num(text{i,1}(7:8))];
dates2(i,:)=text{i,1};
time(i,:)=[str2num(text{i,2}(1:2)),str2num(text{i,2}(4:5)),str2num(text{i,2}(7:8))];
time2(i,:)=text{i,2};
end
pH=data(:,1);
pH2=Data(:,1);
maxpH=max(data(:,1));
minpH=min(data(:,1));
h=figure;
set(h,'Position', [1 1 1200 565]);
subplot('Position',[0.08 0.09 0.87 0.8]);
hold on
set(gcf,'PaperPositionMode','auto');
plot(1:length(data(:,1)),acidosisthreshold*ones(1,length(data(:,1))),'r','linewidth',2);
plot(pH,'linewidth',1.5);
plot(pH2,'m','linewidth',1.5);
set(gca, 'XTick',1:pointsperday:length(dates), 'XTickLabel',dates2(1:pointsperday:length(dates(:,1)),:),'xlim',[0 length(dates)]);
xlabel('Time', 'FontSize',16);
ylabel('pH', 'FontSize',16);
title(['A plot of the pH over ',num2str(c),' days; group']);
如您所见,pointsperday变量是在x轴上设置比例的原因。我的问题是:如何使这个适用于两个具有不同pointperday值的文件?
编辑:从csv文档读入数据。示例行将是:
15/01/2014 , 00:00:00 , 6.53 , -330 , 39.7 , 2.97
对应于:
DD/MM/YYYY , HH:MM:SS , pH , [other values are irrelevant
]
答案 0 :(得分:1)
如果不了解数据格式的详细信息,很难给出明确的建议。在这种情况下我通常做的是读取日期/时间字符串并使用datenum()
转换为Matlab的内部表示。这通常对字符串格式非常巧妙,如果需要,可以给它一个显式的格式字符串。
然后可以使用datenum
格式数据作为x
值来绘制数据。这与每个系列中各点之间的时间间隔无关。可以使用datetick()
生成x刻度。
或者,您可以通过查找最早的数据点并从所有其他数据点中减去datenum
并将结果用作x
值来工作。这为您提供了自数据开始以来的天数。
修改强>
如果您将前两个字段组合在一起,要提供类似15/01/201400:03:15
的输入字符串,那么您可以通过以下方式获得datenum
:
timestamp = datenum(input_string, 'dd/mm/yyyyHH:MM:SS');
答案 1 :(得分:0)
您可以使用以下代码,是的,它有点脏,但有效(基于我可以从您的输入信息中假设的输入数据) -
%% Import data
for i=1:length(data(:,1))
dates(i,:)=[str2num(text{i,1}(1:2)),str2num(text{i,1}(4:5)),str2num(text{i,1}(7:8))];
dates2(i,:)=text{i,1};
time(i,:)=[str2num(text{i,2}(1:2)),str2num(text{i,2}(4:5)),str2num(text{i,2}(7:8))];
time2(i,:)=text{i,2};
end
pH=data(:,1);
pH2=Data(:,1);
maxpH=max(data(:,1));
minpH=min(data(:,1));
h=figure;
set(h,'Position', [1 1 1200 565]);
subplot('Position',[0.08 0.09 0.87 0.8]);
%% Correction needed to normalize sizes of pH and pH2
ext_len = max(size(pH,1)*2,size(pH2,1)*3);
a1 = NaN(ext_len,1);
a2 = NaN(ext_len,1);
a1(2:2:end) = pH;
a2(3:3:end) = pH2;
pH = a1;
pH2 = a2;
data=pH;
dates1=NaN(ext_len,size(dates,2));
dates1(2:2:end,:) = dates;
dates=dates1;
%% Continue plotting
hold on
set(gcf,'PaperPositionMode','auto');
plot(1:length(data(:,1)),acidosisthreshold*ones(1,length(data(:,1))),'r','linewidth',2);
plot(pH,'b.','linewidth',1.5);
plot(pH2,'m.','linewidth',1.5);
set(gca, 'XTick',1:pointsperday:length(dates), 'XTickLabel',dates2(1:pointsperday:length(dates(:,1)),:),'xlim',[0 length(dates)]);
xlabel('Time', 'FontSize',16);
ylabel('pH', 'FontSize',16);
如您所见,我们需要将标准化(即使pH和pH2的大小相同)相同,并且中间数据必须用NaN填充。
此外,您可以看到绘图将使用点与默认线相比。如果你必须使用带有线条的情节,可以查看这个code。
如果上述代码适合您,请告诉我们!