1

我仍然无法在 matlab 中创建可用的东西。

任务很简单。我有两个文件:devideHistory.log deal.log在这两个文件中,我们只考虑前两列。所以第一个文件包含应该形成图形的 X 和 Y。第二个文件包含应在图形上显示的标记的 X 和 Y。在这个社区的帮助下,创建了这样的程序

clear

fDevide = fopen('devideHistory.log');
data = textscan(fDevide, '%f:%f:%f:%f %f,%f %f,%f');
fclose(fDevide);

% hh:min:sec:millisec
secvec = [60*60 60 1 1e-3];
x = [data{1:4}] * secvec';

flvec = [1 1e-16];
y = [data{5:6}] * flvec';

xindays = x / (24*60*60);

plot(xindays, y);
% set(gca, 'YTickLabel', get(gca,'YTick'))
% datetick('x', 'HH:MM:SS');

hold on

fDeals = fopen('deals.log');
data = textscan(fDeals, '%f:%f:%f:%f %f,%f %f,%f %f,%f %f');
fclose(fDeals);

% hh:min:sec:millisec
secvec = [60*60 60 1 1e-3];
x = [data{1:4}] * secvec';

flvec = [1 1e-16];
y = [data{5:6}] * flvec';

xindays = x / (24*60*60);

plot(xindays, y, 'go','MarkerSize',6,'LineWidth',3);

% i need to set enough precision on Y but this doesn't work because
% while zooming labels doesn't update
set(gca, 'YTickLabel', get(gca,'YTick')) 

% i want to have "time" on X but this doesn't work because
% while zooming new labels doesn't appear
datetick('x', 'HH:MM:SS');

结果: 形象的

但是缩放功能有两个问题:

好吧,我的任务非常简单明了。matlab中是否有简单直接的解决方案?上面的代码已经包含了几个“hacks”,但仍然不能按预期工作。恐怕继续破解它没有意义。有人可以提出另一种方法吗?可能matlab只是不适合我的需要?

4

1 回答 1

1
  1. 下载http://www.mathworks.com/matlabcentral/fileexchange/36254-ticklabelformat
  2. 删除您自己的刻度标记调用,这些调用:

    set(gca, 'YTickLabel', get(gca,'YTick')) 
    datetick('x', 'HH:MM:SS');
    
  3. 将它们替换为

    ticklabelformat(gca,'y','%g')
    ticklabelformat(gca,'x',{@tick2datestr,'x','HH:MM:SS'})
    
  4. 创建一个新的辅助函数tick2datestr.m,其中包含:

    function tick2datestr(hProp,eventData,axName,dateformat)    %#ok<INUSL>
        hAxes = eventData.AffectedObject;
        tickValues = get(hAxes,[axName 'Tick']);
        tickLabels = arrayfun(@(x)datestr(x,dateformat),tickValues,'UniformOutput',false);
        set(hAxes,[axName 'TickLabel'],tickLabels);
    end
    

顺便说一句,这个辅助函数的大部分是直接从 ticklabelformat 中复制出来的。



是的,您可以将其视为黑客行为,但只要 TheMathworks 没有实现您想要的“直截了​​当”的解决方案,您就必须创建自己的功能。

于 2012-07-27T13:28:09.890 回答