选择最独特的标记,线条和颜色

时间:2017-06-09 11:43:48

标签: algorithm matlab

我想自动选择线条样式,标记和颜色。我希望有这样的功能:

function [selected_lineStyles, selected_markers, selected_colours] = plot_lineStyle_markers_and_colours(i)
    linestyles = {'-', '--', ':', '-.'};
    colours = {'red', [0.0, 220.0, 0.0]./255.0, 'blue', 'black', [255.0, 180.0, 0.0]./255.0, [0.0, 128.0, 0.0]./255.0, [0.0, 255.0, 255.0]./255.0, [1.0, 0.0, 1.0]};
    markers = {'d', '*', '+', 'x', 'o', 's', '^', 'v', '.', '>', '<', 'p', 'h'};
    num_different_lineStyles = numel(linestyles);
    num_different_markers = numel(markers);
    num_different_colours = numel(colours);
    num_different_combinations = num_different_markers*num_different_lineStyles*num_different_colours;
    if any(i(:) > num_different_combinations)
        warning('Not enough unique combinations of line styles, markers and colours available!');
    end
    i = 1 + mod(i - 1, num_different_combinations);
    [lineStyle_i, marker_i, colour_i] = ind2sub([num_different_lineStyles, num_different_markers, num_different_colours], i);
    selected_lineStyles = linestyles(lineStyle_i);
    selected_markers = markers(marker_i);
    selected_colours = colours(colour_i);
end

有关

i = 1:4

此函数返回不同的线条样式,但标记和颜色相同。

但是我想这样:对于i = 1,它应该返回第一个linestyle,第一个标记和第一个颜色。对于i = 2,它应该返回第二个linestyle,第二个标记和第二个颜色。与i = 3和i = 4相同。对于i = 5,线条样式必须首次重复,因为它们只有4个。但是,该函数应返回第五个颜色和第五个标记。

一般来说,线条样式,标记和颜色的“最独特”组合应该返回低i,这样在图中它们很容易区分。

我不知道如何用数学方式表达,甚至解决这个问题。我猜一个人必须沿着n维非方阵的对角线走。

有人可以帮我这个或者指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

我第一次误解了这个问题,我不得不考虑一下。

如果您愿意通过添加或减去颜色或线条样式来更改列表,那么您可以利用三个列表中每个列表中的元素数量为coprime这一事实来实现。如果你有两个互质数N和M,那么最小公倍数将是N×M。如果你有第三个数字P互为2,那么最小公倍数是N×M×P等。

这对您的列表意味着,如果您在每个步骤中反复增加每个索引,则很长一段时间内不会重复组合。你有4种线型,8种颜色和13种标记。如果你添加一种颜色(例如中性灰色index index.html; location / { try_files $uri $uri/ /index.html; } # Location of asset folder location ~ ^/(assets)/ { gzip_static on; gzip_types image/svg+xml text/plain text/xml text/css text/comma-separated-values text/javascript application/x-javascript application/atom+xml; expires 0; } ),你有4,9和13,它们都是互质的。

[0.5 0.5 0.5]

现在每个属性都会循环,你不会得到第二组红色实线,直到36行之后,它将具有与第一个不同的线型。没有额外的颜色,这个数字将是8.

我家里没有MATLAB,所以这次我不能打印出一个数字,但我认为它会做你想要的。

答案 1 :(得分:0)

我注意到有一个叫做数组元素到主阵列对角线的距离,我希望索引按照这个距离的升序排列。对于3D下标索引A,此距离定义为sum(abs([A(1) - A(2), A(2) - A(3), A(3) - A(1)]))。现在我使用这个功能:

function subs_sorted_by_dist_from_main_diagonal = subs_sorted_by_dist_from_main_diagonal(siz)
    d = numel(siz);
    n = prod(siz);
    i = arrayfun(@(n)1:n, siz, 'UniformOutput', false);
    sub = cell(1, d);
    [sub{:}] = ndgrid(i{:});

    sub2 = zeros(n, d);
    for j = 1:d
        sub2(:, j) = sub{j}(:);
    end

    dist_from_main_diagonal = sum(abs(sub2 - sub2(:, [2:end, 1])), 2);

    [~, sort_index] = sort(dist_from_main_diagonal, 'ascend');

    subs_sorted_by_dist_from_main_diagonal = sub2(sort_index, :);
end

这不是最优的,因为它会对所有下标索引进行排序,而不是在没有排序的情况下生成它们。