这就是我绘制两个图形的方式(感谢帮助我这样做的人):
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;
答案 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');
平移/缩放有点滑稽,你必须通过从侧面(移动的彩色轴)开始拖动来启动它们。这是因为第一个(对应于蓝线)是顶部的那个,因此捕获所有鼠标点击。
注意:我发现您使用的是自定义函数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')