How to create a contour plot with frequencies on the y axis and time on the x axis but with the time in hh:mm:ss format?

2 次查看(过去 30 天)
Hello, I am trying to create a contour plot with frequencies on the y axis and time on the x axis but I want the time in hh:mm:ss format. The graph is generated well with the code below (time is in seconds, simple vector from 0 to 500) but I want the x ticks in hh:mm:ss with a specified start time (and that it adjusts when I zoom in). Thank you in advance. Marc
figure ('OuterPosition',[200 300 1000 600]); contour(time,freq_vector,log(freq_matrix),20); xlabel('time [s]'); ylabel('Frequency [Hz]');
  2 个评论
Marc
Marc 2018-9-26
Hi Jonas, I am not exactly new to Matlab, but am not very familiar with dates formats. It would be very much appreciated if you could write a bit more explicitly what you mean (with an example maybe?). Thanks in advance... again. Marc

请先登录,再进行评论。

采纳的回答

jonas
jonas 2018-9-26
编辑:jonas 2018-9-27
Try this,
t is a double (seconds)
t=t/(60*60*24);
contour(t,freq,z)
datetick('x','hh:mm:ss','keepticks')
This is a bit hacky and will not work if your time-vector exceeds 24h, whereafter the xticks will return to 00:00. In other words, the xaxis shows the time of day, not the time elapsed.
Note that surf works with datetime, if that works for your application. I suppose contourf does not work because the xy-values of the contours are stored in the same matrix where datetime and doubles cannot be mixed.
I've also written an ugly but easy-to-use script for plotting contours with datetime because, quite honestly, it should be possible. Of course, some functionality of normal contour plots (such as clabel) are unavailable.
%%Some data
t=1:100;
y=1:100;
z=peaks(100);
%%Get contours
C=contourc(t,y,z);
cnt=[0];nc=[];idc=[];
while (sum(nc)+cnt)<size(C,2)
cnt=cnt+1;
idc=[idc sum(nc)+cnt];
nc=[nc C(2,idc(end))];
end
%%Save levels and remove the corresponding cols
lvls=C(1,idc);
C(:,idc)=NaN;
So now we have a list of levels and a matrix with all contours saved, each contour enclosed by NaNs. We can easily plot the contours as a single line.
%%Plot
plot(seconds(C(2,:)),C(1,:))
xtickformat('hh:mm:ss')
However, we do not utilize the z-data, so all contours share the same colors. There are some solutions, but the most practical one is probably to split the matrix up in cell arrays. In hindsight, I should have stored them like this from the get go. Here's a piece of code written by Stephen Cobeldick:
%%Split matrix into cell array
C=C(:,2:end)';
idx = all(isnan(C),2);
idy = 1+cumsum(idx);
idz = 1:size(C,1);
C = accumarray(idy(~idx),idz(~idx),[],@(r){C(r,:)});
Now we can plot separate lines and access their individual colors in the handle. Let's define the linecolors by scaling their corresponding z-data to a colormap.
%%Plot
hold on
h=cellfun(@(x)plot(seconds(x(:,1)),x(:,2)),C)
xtickformat('hh:mm:ss')
cb=colorbar(gca)
set(gca,'clim',[min(lvls),max(lvls)])
%%Define colors
cmap=parula(300);
colormap(cmap)
%%Normalize and round for indexing
LevelColors = round(normalize(lvls,'range',[1 size(cmap,1)]))
%%Change color of handles
for j=1:numel(lvls)
h(j).Color = cmap(LevelColors(j),:);
end
The result is a quite nice contour plot with dateformat on the x-axis. The colorbar is fake, in the sense that it is not scaled automatically.

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Contour Plots 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by