我想自动选择线条样式,标记和颜色。我希望有这样的功能:
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维非方阵的对角线走。
有人可以帮我这个或者指出我正确的方向吗?
答案 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
这不是最优的,因为它会对所有下标索引进行排序,而不是在没有排序的情况下生成它们。