剧情外的图例不适用于Octave中的plotyy

时间:2018-11-09 16:31:30

标签: plot gnuplot octave legend

我正在尝试使用plotyy在Octave中创建绘图(在Windows上使用v4.4.1),并将图例放在绘图之外(因为数据覆盖了图形内的所有可用空间)。以下MVCE应该可以很好地重现该问题:

% Generate some random data to reproduce the issue
data = rand(1000,10);
data(:,1:8) = data(:,1:8)-0.5;
data(:,9:10) = data(:,9:10)+30;
timedate = linspace(737310,737313,size(data,1));
data_labels={'1';'2';'3';'4';'5';'6';'7';'8';'9';'10'};

% Plot the data
figure('Name','MVCE','Position',[300 200 1000 600])
[ax,h1,h2] = plotyy(timedate,data(:,1:8),timedate,data(:,9:10));
set(h2,'Visible','on'); 
datetick(ax(1),'x','HH:MM:SS')
datetick(ax(2),'x','HH:MM:SS')
ylim(ax(1),[-1 1])
ylim(ax(2),[20 50])
xlabel('Date & time')
ylabel(ax(1),'Something')
ylabel(ax(2),'Something else')
title('plotyy graph with legend problem')
[hl,hlo] = legend([h1;h2],data_labels,'location','eastoutside');
grid on

这是使用gnuplot图形工具包的代码输出:

enter image description here

如您所见,图例不会超出图的范围,并且第二个y轴不可见(看起来实际上是图的一部分被截断了)。

我尝试使用qtfltk图形工具箱,它们各自提供问题:

  1. 使用qt图形工具包

enter image description here

  1. 使用fltk图形工具包

enter image description here

anoybody是否可以提出修复建议或至少解决方法?在MATLAB中是否也会发生相同的问题?还是特定于Octave的?

编辑 使用Tasos答案中的建议,我几乎可以使它与gnuplot一起使用:

% Plot the data
figure('Name','MVCE','Position',[300 200 1000 600])
[ax,h1,h2] = plotyy(timedate,data(:,1:8),timedate,data(:,9:10));
set(h2,'Visible','on'); 
datetick(ax(1),'x','HH:MM:SS')
datetick(ax(2),'x','HH:MM:SS')
ylim(ax(1),[-1 1])
ylim(ax(2),[20 50])

ax1Pos = get(ax(1), 'position');   
ax2Pos = get(ax(2), 'position');
ax1Pos(3) = ax1Pos(3) * 0.73;      
ax2Pos(3) = ax2Pos(3) * 0.73;
set(ax(1), 'position', ax2Pos);    
set(ax(2), 'position', ax2Pos);

xlabel('Date & time')
ylabel(ax(1),'Something')
ylabel(ax(2),'Something else')
title('plotyy graph with legend problem')
[hl,hlo] = legend([h1;h2],data_labels,'location','eastoutside');
pos = get(hl,'Position');
pos(1) = 0.9;
set(hl,'Position',pos)
grid on

哪个会产生:

enter image description here

除了图例上覆盖了第二个y轴标签(仅在打印到jpg时,它不显示在屏幕上)之外,问题在于八度似乎在顶部绘制了两个图例出于某种原因而彼此冲突:一个带有附加在第一组轴上的第一组数据,另一个带有完整的数据组,两个轴都位于第一个图例的顶部。显然这是错误的,尝试将Visible的{​​{1}}属性设置为hl会删除两个图例,而不仅仅是一个图例。

1 个答案:

答案 0 :(得分:1)

已更新:处理图例位置和影响图形的OpenGL精度。

关于图例未正确显示在所需位置的问题,您可以手动调整图形中所有轴的位置,以将它们准确放置在所需位置。

关于OpenGL在将小数添加到大数时无法处理所涉及的精度问题,仅绘制涉及小数的图形,然后简单地调整xticklabel使其与所需的数字相对应。 / p>

下面的完整代码:

% Generate some random data to reproduce the issue
data = rand(1000,10);
data(:,1:8) = data(:,1:8)-0.5;
data(:,9:10) = data(:,9:10)+30;
t_offset = 737310;
timedate = linspace(0,3,size(data,1));
data_labels={'1';'2';'3';'4';'5';'6';'7';'8';'9';'10'};

% Plot the data
figure('Name','MVCE','Position',[300 200 1000 600])
[ax,h1,h2] = plotyy(timedate,data(:,1:8),timedate,data(:,9:10));
set(h2,'Visible','on'); 
ylim(ax(1),[-1 1])
ylim(ax(2),[20 50])
ylabel(ax(1),'Something')
ylabel(ax(2),'Something else')
title('plotyy graph with legend problem')
[hl,hlo] = legend([h1;h2],data_labels,'location','eastoutside');
set(hl, 'position', get(hl, 'position') .* [0.975, 1, 0.975, 1] )
grid on

ax1Pos = get(ax(1), 'position');   ax2Pos = get(ax(2), 'position');
ax1Pos(3) = ax1Pos(3) * 0.95;      ax2Pos(3) = ax2Pos(3) * 0.95;
set(ax(1), 'position', ax2Pos);    set(ax(2), 'position', ax2Pos);
XTicks = get(ax(1), 'xtick');
set(ax(1), 'xticklabel', datestr(XTicks + t_offset, 'HH:MM:SS'))
xlabel('Date & time')
set(ax(2), 'xtick', []);

输出:

enter image description here