Octave(MATLAB),散点图传奇和填充不起作用

时间:2011-04-03 19:22:58

标签: matlab octave legend scatter-plot

我正在使用Octave,它是免费的伪MATLAB。 我的问题是:我想填补散点图的气泡,以及放置一个传奇。但是当我尝试使用'填充'时我会遇到错误,当我使用图例(...)时没有传说。 我的部分代码如下所示:

%ALL SAMPLES, PHI(Signal) @ THETA(Sample)=0
figure(5)
plot( Angles(:,1)([18:27]),  ALL([18:27]), 10, [1 0 1]);  %Magenta
hold on 
scatter(Angles(:,1)([68:76]), ALL([68:76]), 10, [0 0 0]);   %Black
scatter(Angles(:,1)([86:95]), ALL([86:95]), 10, [1 0 0]);   %Red
scatter(Angles(:,1)([119:127]), ALL([119:127]), 10, [0 1 0]);   %Green
scatter(Angles(:,1)([133:141]), ALL([133:141]), 10, [0 0 1]);   %Blue
hold off
xlabel('Signal PMT angle (Sample angle at 0)'); 
ylabel('Normalized (signal/monitor) intensity');
legend('Control', 'Control', '1+2','Virgin','Cycle #1', 'Location','NorthEast');
title('Plot of All Samples, "-int Intensity"')

我知道它应该是plot( Angles(:,1)([18:27]), ALL([18:27]), 10, [1 0 1], 'filled');,但是当我这样做时,我会收到错误。此外,传奇似乎永远不会出现。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

显然,在Octave中使用legendscatter时出现问题。基于这篇文章:

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');

示例代码生成以下图:

Scatter plot generated by the example code.

答案 1 :(得分:0)

以下适用于我:

n = 100;
x = randn(n, 1);
y = randn(n, 1);
S = rand(n, 1)*20;
hold on
scatter(x(1:50), y(1:50), S(1:50), "red", "filled")
scatter(x(51:100), y(51:100), S(51:100), "green", "filled")
hold off
print('-depsc', 'bubbleplot.eps');

enter image description here

但是,我无法添加图例,而且我没有找到任何错误报告或缺少此功能的指示。因此,作为替代方案,我建议在标记中添加标记和文本。