Я пытаюсь создать график в 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
:
Как видите, легенда не выходит за пределы графика, а вторая ось y не видна (похоже, что часть графика фактически обрезана).
Я пытался использовать графические наборы инструментов qt
и fltk
, которые дают свои собственные проблемы:
- С
qt
графическим инструментарием
- С
fltk
графическим инструментарием
Может ли кто-нибудь предложить исправление или хотя бы обходной путь? Такая же проблема возникает и в 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
Который производит:
Помимо того, что легенда накладывается на метку второй оси y (чего нет на моем экране, только при печати в jpg
), проблема в том, что в Octave появляются две надписи над каждой из них. другой по какой-то причине: один с первым набором данных, прикрепленным к первому набору осей, и один с полным набором данных для обеих осей прямо поверх первой легенды. Это, очевидно, неправильно, и попытка установить свойство Visible
для hl
в off
удаляет обе легенды, а не только одну.