サーチ…


備考

  • これらの機能は予告なく変更される場合があります。または、異なるMATLABバージョンでは動作が異なるため、文書化されていない機能を使用することは危険な方法です1 。このため、文書化されたフォールバックを持つtry/catchブロック内に、文書化されていないコードを囲むなどの防御プログラミング手法を採用することをお勧めします。

C ++互換ヘルパー関数

Matlab Coderを使用すると、C ++と互換性がない場合、非常に一般的な関数の使用が拒否されることがあります。比較的頻繁に、 文書化されていないヘルパー関数が存在し、これを置換えとして使用することができます。

ここには、サポートされている機能の包括的なリストがあります。

また、サポートされていない機能の代替案のコレクションに続いて、


関数sprintfsprintfcは非常によく似ています。前者は文字配列を返し、後者はセル文字列を返します

 str = sprintf('%i',x)   % returns '5' for x = 5
 str = sprintfc('%i',x)  % returns {'5'} for x = 5

ただし、 sprintfcはMatlab CoderがサポートするC ++と互換性があり、 sprintfはサポートしていません。

3次元のカラーデータを使用した色分けされた2Dラインプロット

R2014bより前のMATLABバージョンでは、古いHG1グラフィックスエンジンを使用して、 カラーコード化された2Dラインプロットを作成する方法は明らかではありませんでした。新しいHG2グラフィックスエンジンのリリースにより、 Yair Altmanによって紹介された新しい文書化されていない機能が生まれました:

n = 100;
x = linspace(-10,10,n); y = x.^2;
p = plot(x,y,'r', 'LineWidth',5);

% modified jet-colormap
cd = [uint8(jet(n)*255) uint8(ones(n,1))].';

drawnow
set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)

ラインプロット

ラインと散布図の半透明マーカー

Matlab R2014b以来、Yair Altmanによって導入された文書化されいない機能を使用して、ラインと散布図の半透明マーカーを簡単に実現することができます

基本的な考え方は、マーカーの隠しハンドルを取得し、 EdgeColorData最後の値に値<1を適用して、目的の透明度を実現することです。

ここではscatterに行く:

%// example data
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);

%// plot scatter, get handle
h = scatter(x,y); 
drawnow; %// important

%// get marker handle
hMarkers = h.MarkerHandle; 

%// get current edge and face color
edgeColor = hMarkers.EdgeColorData
faceColor = hMarkers.FaceColorData

%// set face color to the same as edge color
faceColor = edgeColor;

%// opacity
opa = 0.3;

%// set marker edge and face color
hMarkers.EdgeColorData = uint8( [edgeColor(1:3); 255*opa] ); 
hMarkers.FaceColorData = uint8( [faceColor(1:3); 255*opa] ); 

ここに画像の説明を入力

ラインplot

%// example data
x = linspace(0,3*pi,200);
y1 = cos(x);
y2 = sin(x);

%// plot scatter, get handle
h1 = plot(x,y1,'o-','MarkerSize',15); hold on
h2 = plot(x,y2,'o-','MarkerSize',15); 
drawnow; %// important

%// get marker handle
h1Markers = h1.MarkerHandle; 
h2Markers = h2.MarkerHandle; 

%// get current edge and face color
edgeColor1 = h1Markers.EdgeColorData;
edgeColor2 = h2Markers.EdgeColorData;

%// set face color to the same as edge color
faceColor1 = edgeColor1;
faceColor2 = edgeColor2;

%// opacity
opa = 0.3;

%// set marker edge and face color
h1Markers.EdgeColorData = uint8( [edgeColor1(1:3); 255*opa] ); 
h1Markers.FaceColorData = uint8( [faceColor1(1:3); 255*opa] ); 
h2Markers.EdgeColorData = uint8( [edgeColor2(1:3); 255*opa] ); 
h2Markers.FaceColorData = uint8( [faceColor2(1:3); 255*opa] ); 

ここに画像の説明を入力

操作に使用されるマーカーハンドルは、Figureとともに作成されます。 drawnowコマンドは、後続のコマンドが呼び出される前にFigureの作成を確実にし、遅延の場合のエラーを回避します。

等高線図 - テキストラベルをカスタマイズする

輪郭にラベルを表示する場合Matlabでは、科学的表記法に変更するなど、数値の書式を制御することはできません。

個々のテキストオブジェクトは通常のテキストオブジェクトですが、それらを取得する方法は文書化されていません。輪郭ハンドルのTextPrimsプロパティからそれらにアクセスします。

  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  drawnow();
  txt = get(h,'TextPrims');
  v = str2double(get(txt,'String'));
  for ii=1:length(v)
    set(txt(ii),'String',sprintf('%0.3e',v(ii)))
  end

注意drawnowコマンドを追加して、Matlabに輪郭線を描画させる必要があります。テキストオブジェクトの数と位置は輪郭が実際に描画されたときにのみ決定され、テキストオブジェクトが作成されます。

等高線が描画されたときにtxtオブジェクトが作成されるという事実は、プロットが再描画されるたびに再計算されることを意味します(例えばFigureのサイズ変更など)。これを管理するには、 undocumented eventれてundocumented event MarkedCleanを聞く必要があります:

function customiseContour
  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  % add a listener and call your new format function
  addlistener(h,'MarkedClean',@(a,b)ReFormatText(a))
end
function ReFormatText(h)
  % get all the text items from the contour
  t = get(h,'TextPrims');
  for ii=1:length(t)
    % get the current value (Matlab changes this back when it 
    %   redraws the plot)
    v = str2double(get(t(ii),'String'));
    % Update with the format you want - scientific for example
    set(t(ii),'String',sprintf('%0.3e',v));
  end
end

ここに画像の説明を入力

WindowsでMatlab r2015bを使用してテストした例

既存の凡例へのエントリの追加/追加

既存の伝説は管理が難しい場合があります。たとえば、プロットに2つの行があり、そのうちの1つだけに凡例があり、このようにしなければならない場合は、凡例を含む3行目を追加するのは難しい場合があります。例:

figure
hold on
fplot(@sin)
fplot(@cos)
legend sin  % Add only a legend entry for sin
hTan = fplot(@tan);  % Make sure to get the handle, hTan, to the graphics object you want to add to the legend

さて、 tan凡例エントリを追加するために、 cosではなく、次の行はトリックを行いません。彼らはすべて何らかの形で失敗する。

legend tangent  % Replaces current legend -> fail
legend -DynamicLegend  % Undocumented feature, adds 'cos', which shouldn't be added -> fail
legend sine tangent  % Sets cos DisplayName to 'tangent' -> fail
legend sine '' tangent  % Sets cos DisplayName, albeit empty -> fail
legend(f)

幸いにも、 PlotChildrenと呼ばれる文書化されていない伝説のプロパティは、親の図1の子供を追跡します。そのため、凡例の子を明示的にPlotChildrenプロパティで次のように設定する方法があります。

hTan.DisplayName = 'tangent';  % Set the graphics object's display name
l = legend;
l.PlotChildren(end + 1) = hTan;  % Append the graphics handle to legend's plot children

オブジェクトがPlotChildrenプロパティに追加または削除された場合、凡例は自動的に更新されます。

1確かに:数字。 DisplayNameプロパティを持つ任意のFigureの子を、図の任意の凡例、たとえば別のサブプロットから追加できます。これは、凡例自体が基本的に軸オブジェクトですからです。

MATLAB R2016bでテスト済み

散布図ジッタ

scatter関数には、文書化されていない2つのプロパティ'jitter''jitterAmount'があり、x軸上のデータだけをジッタさせることができます。これはMatlab 7.1(2005)の日付です。

この機能を有効にするには、 'jitter'プロパティを'on'に設定し、 'jitterAmount'プロパティを希望の絶対値に設定します(デフォルトは0.2 )。

これは、重複するデータを視覚化したい場合に非常に便利です。たとえば、次のようになります。

scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);

ジッタオーバーラッピングデータ

未記載のMatlabについてもっと読む



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow