Легенда вне сюжета не работает с плоты в Октаве - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать график в Octave (используя v4.4.1 в Windows), используя plotyy и помещая легенду за пределы графика (поскольку данные покрывают все полезное пространство внутри графика). Следующий 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 не видна (похоже, что часть графика фактически обрезана).

Я пытался использовать графические наборы инструментов qt и fltk, которые дают свои собственные проблемы:

  1. С qt графическим инструментарием

enter image description here

  1. С fltk графическим инструментарием

enter image description here

Может ли кто-нибудь предложить исправление или хотя бы обходной путь? Такая же проблема возникает и в MATLAB, или она специфична для Octave?

EDIT Используя предложение в ответе Тасоса, мне удалось почти заставить его работать с 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), проблема в том, что в Octave появляются две надписи над каждой из них. другой по какой-то причине: один с первым набором данных, прикрепленным к первому набору осей, и один с полным набором данных для обеих осей прямо поверх первой легенды. Это, очевидно, неправильно, и попытка установить свойство Visible для hl в off удаляет обе легенды, а не только одну.

1 Ответ

0 голосов
/ 10 ноября 2018

ОБНОВЛЕНО : касается как размещения легенды, так и графика, влияющего на точность OpenGL.

Что касается проблемы, связанной с тем, что легенда не отображается точно в той позиции, в которой вы этого хотите, вы можете вручную отрегулировать положение всех осей, вовлеченных в фигуру, чтобы расположить их именно там, где вы хотите.

Что касается проблемы, заключающейся в том, что OpenGL не может справиться с точностью, возникающей при добавлении небольших чисел к большому числу, постройте график с использованием только малых чисел, а затем просто настройте xticklabels в соответствии с желаемыми числами.

Полный код ниже:

% 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

...