Видимо, есть проблема с использованием legend
с scatter
в октаве. На основании этого сообщения:
http://octave.1599824.n4.nabble.com/Legend-in-scatter-plot-td3568032.html
Хитрость в том, чтобы использовать функцию plot
для построения точечного графика. Я написал следующую функцию для построения группы диаграмм рассеяния на одной оси.
Эта функция принимает наборы ячеек одинаковой длины. Каждый элемент массива ячеек соответствует отдельной серии. Функция возвращает массив ячеек одинаковой длины, содержащий дескриптор, связанный с каждым графиком. Аргументы функции объясняются ниже:
x_vals
: массив ячеек двойников, соответствующих значениям x.
y_vals
: массив ячеек из двойных чисел, соответствующих значениям y.
sizes
: массив ячеек, представляющий размер маркеров.
colors
: массив ячеек двойных массивов длины 3, представляющих [R, G, B]
значения цвета маркеров.
styles
: массив ячеек строк, представляющих форму маркеров.
function [handles] = scatter_series_set(x_vals, y_vals, sizes, colors, styles)
N = length(x_vals);
if ( (~ ( N == length(y_vals))) || (~ ( N == length(sizes))) || ...
(~ ( N == length(colors))) || (~ ( N == length(styles))) )
error('scatter_series_set: all arguments must be cell arrays of the same length');
end
%plot the first series
handles = cell([N, 1]);
handles{1} = plot(x_vals{1}, y_vals{1});
set(handles{1}, 'linestyle', 'none');
set(handles{1}, 'marker', styles{1});
set(handles{1}, 'markersize', sizes{1});
set(handles{1}, 'color', colors{1});
%plot additional series if present
if N > 1
hold on;
for ind = 2:N
handles{ind} = plot(x_vals{ind}, y_vals{ind});
set(handles{ind}, 'linestyle', 'none');
set(handles{ind}, 'marker', styles{ind});
set(handles{ind}, 'markersize', sizes{ind});
set(handles{ind}, 'color', colors{ind});
end
hold off;
end
end
В следующем примере показано, как использовать эту функцию.
x1 = 0:(2*pi/100):(2*pi);
x2 = 2*x1;
y1 = sin(x1);
y2 = cos(x1);
y3 = sin(x2);
y4 = cos(x2);
names = {'a', 'b', 'c', 'd'};
x_vals = {x1, x1, x1, x1};
y_vals = {y1, y2, y3, y4};
sizes = {10, 10, 10, 10};
colors = {[1, 0, 0], [0, 0, 1], [0, 0, 0], [0.7071, 0, 0.7071]};
styles = {'^', 's', 'x', '+'}
scatter_series_set(x_vals, y_vals, sizes, colors, styles);
legend(names, 'location', 'southeast');
Пример кода создает следующий график: