【问题标题】:creating graph from text file where axis X is date with millisecond precision and Y is value with markers从文本文件创建图形,其中轴 X 是具有毫秒精度的日期,Y 是带有标记的值
【发布时间】:2012-07-27 12:36:41
【问题描述】:

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

任务很简单。我有两个文件:devideHistory.logdeals.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 不适合我的需要?

【问题讨论】:

  • 您的标记显示正确,标签错误,直截了当!您有自定义标签的更新问题;用回调解决这个问题,或者用ticklabelformat 更简单地为你做这一切

标签: matlab graph plot zooming


【解决方案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 没有实现您想要的“直截了​​当”的解决方案,您就必须创建自己的功能。

【讨论】:

  • 我应该把下载的文件放在哪里?如何将它与我的脚本链接?
  • 我已尝试多次下载此文件,但仍无法收到“完整”版本。文件被剪切。文件仅包含 106 行,最后一行是“set(hAxes,[axName 'TickLabel'],tickLabels)”。我会立即尝试在另一个主机上搜索它,这可能是 mathworks 出了问题
  • 这里以纯文本形式显示:mathworks.com/matlabcentral/fileexchange/…
  • 谢谢,然后我下载了它的完整版,我没想到如果没有“结束”或类似的东西就完成了:) 所以唯一的问题是我应该把它放在哪里。我会尝试将它放在与我的脚本相同的文件夹中。
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 2013-06-18
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2011-02-13
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多