2017-06-09 6 views
1

私は線のスタイル、マーカー、色の選択を自動化したいと思います。最もユニークなマーカー、線種、色を選択してください

i = 1:4 

については

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の場合、最初の線種、最初のマーカー、最初の色が返されます。 i = 2の場合、2番目の線種、2番目のマーカー、2番目の色が返されます。 i = 3、i = 4と同じです。i = 5の場合、linestyleは最初に繰り返されなければなりません。ただし、関数は5番目の色と5番目のマーカーを返す必要があります。

一般に、linestyle、マーカー、および色の「最もユニークな」組み合わせは、低いiに対して返される必要があります。プロット内では区別が容易です。

私は、この問題を数学的にどのようにフレーズするか、あるいは解決する方法は知らない。私はn次元、非正方形の配列の対角線に沿って歩く必要があると思います。

誰かがこれを手伝ったり、正しい方向に向けることができますか?

答えて

2

私はこの質問を初めて誤解しました。私はそれについて少し考えなければなりませんでした。

色や線種を追加または削除してリストを変更したい場合は、3つのリストの要素数がcoprimeであることを利用してリストを変更できます。あなたが2つの共起数NとMを持つ場合、最小公倍数はN×Mになります。お互いに相反する3番目の数字Pがある場合、最小公倍数はN×M×Pなどです。

これは、各ステップで各インデックスをインクリメントするとあなたは非常に長い間組み合わせを繰り返しません。 4つのラインスタイル、8色、13のマーカーがあります。色を追加すると(ニュートラルグレーの[0.5 0.5 0.5]など)、4、9、13があります。これらはすべて共通です。

% Define your combinations, with neutral grey added to the end of the color choices. 
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], [0.5 0.5 0.5]}; 
markers = {'d', '*', '+', 'x', 'o', 's', '^', 'v', '.', '>', '<', 'p', 'h'}; 

% Count the values in each cell array 
ldx = numel(linestyles); % = 4 
cdx = numel(colours); % = 9 
mdx = numel(markers); % = 13 

% Make each cycle the same length 
LDX = repmat(1:ldx, [1 cdx*mdx]); 
CDX = repmat(1:cdx, [1 ldx*mdx]); 
MDX = repmat(1:mdx, [1 ldx*cdx]); 

x = 1:10 
y = x; 
for idx = 1:numel(LDX) 
    % Pick out the current combination 
    currentLineStyle = LDX(idx); 
    currentMarker = MDX(idx); 
    currentColour = CDX(idx); 

    % Plot your data here... 
    line(x, y, 'Color', currentColour, 'LineStyle', currentLineStyle, 'Marker', currentMarker) 
end 

各プロパティは、今サイクルの意志、そしてあなたは36行後になるまで、たとえば、赤の実線の第2のセットを得ることはありません、それは最初とは異なる線のスタイルを持っています。余分な色がなければ、その数は8になります。

私は自宅でMATLABを持っていないので、今度は数字をプリントアウトできませんが、あなたが望むことをすると思います。

+0

これは私が望むものではありません。 私はすべての可能な順列を得る方法を知っています。私が知りたいのは、これらの順列をどのように並べ替えるかです。最初に返される4色、線種、マーカーはすべて異なります! 例: i = 1:色:赤、linestyle: - 、マーカー:+ i = 2色:青、linestyle: - 。、マーカー:* i = 3:色:green、linestyle: - 、マーカー:o i = 4:色:黒、linestyle::、マーカー:x 理由は以下のとおりです。少数のデータセット(i = 1:4またはi = 1:すべての可能な416の順列を使用するよりも、 – Procyon

+0

@Procyon、この答えを試してください。私は最初に誤解していましたが、問題について考えるのに少し時間がかかりました。 – craigim

+0

あなたの答えをありがとう。私は、配列要素の主配列対角線までの距離と呼ばれるものがあり、この距離の昇順にインデックスを持たせたいと気づきました。詳細については私自身の質問に対する私の答えを見てください。 – Procyon

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 

:今、私は、この関数を使用します。

関連する問題