web-dev-qa-db-ja.com

Matlab / OctaveでプロットするためのColorOrderインデックスをリセットします

私は行列を持っていますx1, x2, ...含む変数行ベクトルの数。私は連続したプロットをします

figure
hold all % or hold on
plot(x1')
plot(x2')
plot(x3')

Matlabまたはoctaveは通常、ColorOrderを反復処理し、各線を異なる色でプロットします。 ただし、各plotコマンドをcolororderの最初の色で再開する必要がありますしたがって、デフォルトの場合、行列の最初のベクトルは青、2番目は緑、3番目は赤などになります。

残念ながら、カラーインデックスに関連するプロパティは、リセットする別の方法では見つかりません。

11
Honza

現在の軸の元のColorOrderをシフトして、新しいプロットが同じ色から始まるようにすることができます。

h=plot(x1');
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h)))
plot(x2');

あなたはそれを関数で包むことができます:

function h=plotc(X, varargin)
h=plot(X, varargin{:});
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h)));
if nargout==0,
    clear h
end
end

と電話

hold all
plotc(x1')
plotc(x2')
plotc(x3')
8

R2014b以降、カラーオーダーを再開する簡単な方法があります。

色の順序をリセットする必要があるたびに、この行を挿入します。

set(gca,'ColorOrderIndex',1)

または

ax = gca;
ax.ColorOrderIndex = 1;

参照: http://au.mathworks.com/help/matlab/graphics_transition/why-are-plot-lines-different-colors.html

8

リンクを見つけました 男が最終的にこれを解決するところ。彼はこのコードを使用します:

t = linspace(0,1,lineCount)';
s = 1/2 + zeros(lineCount,1);
v = 0.8*ones(lineCount,1);
lineColors = colormap(squeeze(hsv2rgb(t,s,v)))
ax=gca
ax.ColorOrder = lineColors;

各行列の行数が同じであると仮定すると、どちらが機能するはずです。そうでない場合は、上記のlineColorsを使用して各行を個別にループしてプロットし、plot'Color'linespecプロパティにRBGトリプルを指定する必要があると感じています。したがって、次のような関数を使用できます。

function h = plot_colors(X, lineCount, varargin)

    %// For more control - move these four lines outside of the function and make replace lineCount as a parameter with lineColors
    t = linspace(0,1,lineCount)';                              %//'
    s = 1/2 + zeros(lineCount,1);
    v = 0.8*ones(lineCount,1);
    lineColors = colormap(squeeze(hsv2rgb(t,s,v)));


    for row = 1:size(X,1)
        h = plot(X(row, :), 'Color', lineColors(row,:), varargin{:}); %// Assuming I've remembered how to use it correctly, varargin should mean you can still pass in all the normal plot parameters like line width and '-' etc
        hold on;
    end

end

ここで、lineCountは、x行列の中で最大の行数です。

2
Dan

実際のプロットを行う前に、plotへの呼び出しをインターセプトし、'ColorOrderIndex'1に設定する関数を定義します。

function plot(varargin)
if strcmp(class(varargin{1}), 'matlab.graphics.axis.Axes')
    h = varargin{1}; %// axes are specified
else
    h = gca; %// axes are not specified: use current axes
end
set(h, 'ColorOrderIndex', 1) %// reset color index
builtin('plot', (varargin{:})) %// call builtin plot function

私はこれをMatlabR2014bでテストしました。

2
Luis Mendo

少しハッキーで最小限のコード行アプローチが必要な場合は、各行列プロットの最後に適切な数の(0,0)ドットをプロットして、カラーオーダーを最初に戻すことができます。これは、モーセンノスラティニアのソリューションに似ていますが、あまりエレガントではありません...

Matlabのように循環する7つの色があると仮定すると、次のようなことができます。

% number of colours in ColorOrder
nco = 7;
% plot matrix 1
plot(x1');
% work out how many empty plots are needed and plot them
nep = nco - mod(size(x1,1), nco); plot(zeros(nep,nep));
% plot matrix 2
plot(x2');
...
% cover up the coloured dots with a black one at the end
plot(0,0,'k');
1
xenoclast