如何在同一个数字上绘制三个图形?

时间:2012-08-10 17:33:51

标签: matlab plot

这就是我绘制两个图形的方式(感谢帮助我这样做的人):

clear
logsFolder = 'C:\logs\';
stocks = {'log'};

for stock = stocks
    filename = [logsFolder stock{1} '.log'];
    fLog = fopen(filename);
    data = textscan(fLog, '%f:%f:%f:%f %f %f %f');
    fclose(fLog);

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

    y = data{5};
    yPrice = data{6};

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

    figure;
    [AX,H1,H2] = plotyy(xindays,y,xindays,yPrice);
    set(AX(1),'xtick',[]);

    lo1 = min(y);
    hi1 = max(y);
    lo2 = min(yPrice);
    hi2 = max(yPrice);

    if (hi2/lo2 > hi1/lo1)
      ylim(AX(1),[lo1 hi2/lo2 * lo1]);
      ylim(AX(2),[lo2 hi2]);
    else
      ylim(AX(1),[lo1 hi1]);
      ylim(AX(2),[lo2 hi1/lo1 * lo2]);
    end

    ticklabelformat(AX(2),'y','%g')
    ticklabelformat(AX(2),'x',{@tick2datestr,'x','HH:MM:SS'})
    title(stock);

    % iNeedToDrawThat = data{7}
end

输入文件示例可用here正如您所见,我的文件包含我还要显示的最后一列。范围应该从0(在图的底部)到最大值(在图的上部)。所以我需要以某种方式绘制三个图形。可以省略带有第三个图形标签的轴,因为我已经有两个轴,我没有地方可以添加第三个图形。但是如果可能的话,可以“重叠”两个轴。

我不知道该怎么做,所以我正在寻找你的帮助。

我已经尝试过,但它不起作用:

figure;
[AX,H1,H2] = plotyy(xindays,y,xindays,yPrice);

hold on;
volume = data{7};
plot(xindays, volume);
hold off;

3 个答案:

答案 0 :(得分:3)

我已经在评论中提到了similar question,它应该给你很多想法......

无论如何,我已经制定了一个绘制多个y轴的解决方案。现在代码有点涉及,但应该可以重构一个可重用的函数(比如文件交换上的addaxis函数)。

这个想法是首先在一个单独的轴上绘制每条曲线(全部叠加),并使它们透明(底部除外)。接下来,我们创建这组轴的副本并沿x方向移动它们。我们也使这些副本透明,但现在我们可以显示每个副本的y轴上的刻度线。最后,我们给它们正确的z顺序,并链接x和y限制,以便我们可以使用平移和缩放功能。

%# read and parse data from file
fid = fopen('log.log','rt');
C = textscan(fid, '%s %f %f %f', 'CollectOutput',true);
fclose(fid);
dt = datenum(C{1}, 'HH:MM:SS:FFF');
data = C{2};
NUM = size(data,2);

%# create a wider figure
hFig = figure('Position',get(0,'DefaultFigurePosition').*[1 1 1.7 1]);

%# some properties
clr = lines(NUM);
bgClr = get(0,'DefaultFigureColor');
pos = get(0,'DefaultAxesPosition');
pp = 0.1;   % shift in normalized units: pos(1)

%# create plot axes (make axis invisible)
hAx = zeros(NUM,1);
for i=1:NUM
    hAx(i) = axes('Parent',hFig, 'Color','none', ...
        'XColor',bgClr, 'YColor',bgClr, ...
        'Units','normalized', 'Position',pos+[(NUM-1)*pp 0 -(NUM-1)*pp 0]);
    line(dt, data(:,i), 'Color',clr(i,:), 'Parent',hAx(i))
end
axis(hAx, 'tight')  %# tight x/y limits

%# create shifted copies of axes to show y-ticks
hAxx = zeros(size(hAx));
for i=1:NUM
    hAxx(i) = copyobj(hAx(i), hFig);
    delete(get(hAxx(i),'Children'));    %# keep only axis
    set(hAxx(i), 'YColor',clr(i,:), ...
        'Units','normalized', 'Position',pos+[(NUM-i)*pp 0 -(NUM-i)*pp 0]);
    ylabel(hAxx(i), sprintf('Axis %d',i))
end
xlabel(hAxx(1), 'datetime')
title(hAxx(1), 'Log')
datetick(hAxx(1), 'x', 'HH:MM', 'keeplimits')

%# set 1st axis copy as current axis
set(hFig, 'CurrentAxes',hAxx(1))

%# adjust ticks of axes
set(hAx(1), 'Color','w')    %# give white bg to 1st axis
set(hAxx(1), 'XColor','k')  %# show xticks of 1st axis copy
set(hAxx(2:end), 'XTick',[], 'XTickLabel',[])
set(hAx, 'XTick',[], 'XTickLabel',[], 'YTick',[], 'YTickLabel',[])

%# fix z-order
for i=3:-1:1, uistack(hAxx(i),'top'), end
uistack(hAx(1), 'bottom')

%# link x/y limits so that panning/zooming works
lh = cell(NUM+1,1);
for i=1:NUM
    lh{i} = linkprop([hAxx(i);hAx(i)], 'YLim');
end
lh{end} = linkprop([hAxx;hAx], 'XLim');

result

screenshot

平移/缩放有点滑稽,你必须通过从侧面(移动的彩色轴)开始拖动来启动它们。这是因为第一个(对应于蓝线)是顶部的那个,因此捕获所有鼠标点击。

注意:我发现您使用的是自定义函数ticklabelformat,我还没有结合上面的代码进行测试。我会把那部分留给你..

HTH

答案 1 :(得分:0)

示例使用hold on

figure;
plot(x1,y1);
hold on
plot(x2,y2);
plot(x3,y3);
hold off

在循环外只做一次“数字”和“保持”。然后绘制你需要的所有图表

答案 2 :(得分:0)

figure;
[AX,H1,H2] = plotyy(xindays,y,xindays,yPrice);

hold on;
volume = data{7};
plot(xindays, volume);
hold off;

如果按照建议使用hold on的方式进行,即先使用plotyy(),那么轴将不会调整,所以如果第3个系列超出第一组轴的范围,则不会出现。尝试翻转它们,看看是否会产生结果?

volume = data{7};
plot(xindays, volume);

hold on;

[AX,H1,H2] = plotyy(xindays,y,xindays,yPrice);

这样轴应该调整

例如:

t = 1:10;
x = t*2;
y = t*-2;
z = x + 1000;

现在比较

plot(t,z, 'r')
hold on
plotyy(t,x, t,y)

plotyy(t,x, t,y)
hold on
plot(t,z, 'r')