2013-07-22 9 views
6

プログラミング以外の質問は、the powers-that-be have determined that all MATLAB-related questions belong hereに持ち越すために事前にお詫びします。データのトレースと時間の表示 "不確実性のバンド"

私はいくつかのカルマンフィッターを行い、状態変数の推定値をプロットして、時間の経過とともに収束する様子を見てきました。さて、私は視覚的に共分散行列を表現したいと思います。これは推定値の不確実性を示しています。だから私は推定値の周りにバンドを塗りつぶす小さな関数を書いた。

(編集注:以前のバージョンでは、それが2つの標準偏差にする必要があるとき、各ハーフバンドの幅のため2*covを使用してのミスを犯した)

function [ls, regions] = plotuncertain(t, y, cov) 
    t = t(:); 
    y = y(:); 
    stdev = cov(:).^(1/2); 
    a = ones(size(t)); 
    regions(1) = patch('XData', [t; t(end:-1:1)], ... 
         'YData', [y + 2*stdev; y(end:-1:1)], ... 
         'FaceVertexAlphaData', [0*a; a], ... 
         'FaceAlpha', 'interp', 'EdgeColor', 'none'); 
    regions(2) = patch('XData', [t; t(end:-1:1)], ... 
         'YData', [y - 2*stdev; y(end:-1:1)], ... 
         'FaceVertexAlphaData', [0*a; a], ... 
         'FaceAlpha', 'interp', 'EdgeColor', 'none'); 
    ls = line('XData', t, 'YData', y); 

そして、それは合理的になります。

One cone of uncertainty

しかし、私は1つの軸に並行してプロットするのと同じ意味を持つ2つの状態変数を持っています。

Two cones of uncertainty

UH-OH、K_1の初期データは、K_2バンド(の上半分)によって隠されています。 MATLABは、それらを提出した順序で線とパッチを描画しませんでした。そして、私が描く順序を制御することができたとしても、アルファブレンディングは、確率に基づいて色を混合するよりも最適ではありません。

両方を同時にレンダリングする方法はありますか? 2つの変数に2つの異なるカラープレーンを使用しているという事実を、どういうわけか利用できますか?

+0

行のハンドルを取得し、 'uistack'worksを使ってそれらを上げる(2行目を上げる)か確認してください。 – Werner

答えて

3

プロットが複雑すぎると、matlabはここのように不規則に動作し始めます。私はしばしばhereと記載されている解決策を適用しようとします。あなたの特定の(そして非常に素晴らしい)プロットの

、私は軸を宣言することによって機能を変更します:

function [ax, ls, regions] = plotuncertain(t, y, cov) 

    ax = axes; 

    t = t(:); 
    y = y(:); 
    cov = cov(:); 
    a = ones(size(t)); 
    regions(1) = patch('XData', [t; t(end:-1:1)], ... 
         'YData', [y + 2*cov; y(end:-1:1)], ... 
         'FaceVertexAlphaData', [0*a; a], ... 
         'FaceAlpha', 'interp', 'EdgeColor', 'none'); 
    regions(2) = patch('XData', [t; t(end:-1:1)], ... 
         'YData', [y - 2*cov; y(end:-1:1)], ... 
         'FaceVertexAlphaData', [0*a; a], ... 
         'FaceAlpha', 'interp', 'EdgeColor', 'none'); 
    ls = line('XData', t, 'YData', y); 

をし、その後で関数を呼び出す:この方法で

[ax1, ls, regions] = plotuncertain(t, y, cov); 
[ax2, ls, regions] = plotuncertain(t, y, cov); 
set(ax2,'Visible','off'); 
linkaxes([ax1 ax2],'xy'); %or any (XLim,YLim) settings 

、の透明性一方の軸は他方の軸とは独立している。

EDIT

良好な色混合を制御するための方法は、画像内に専用の図で作成軸のそれぞれを変換し、それらを融合することです。例えば、imfuse(im1,im2,'blend')(画像処理ツールボックス)を使用することも、2つの画像をミックスする機能を使用することもできます。

図から画像を抽出する方法は、この解決策は、私は決定的には使用しないであろう(報告プロセスの最終段階でのみ適して

F = getframe(gcf); 
imwrite(F.cdata, 'image.png'); 
確か

enter image description here

あります科学記事 - コメントを見てください - 素晴らしいプレゼンテーションのために)また、Matlabよりも透過性/ OpenGLをよく扱う代替ソフトウェアを使用する方が効率的かもしれません。

+0

私はこれを試してみましたが、それは素敵に見え、間違いなく描画順序を制御していますが、間違いなく1つのパッチが上にあり、他を隠しています。 (また伝説が破れた)。ブレンドに対称性があると理想的です。 –

+0

イメージを使用した回避策の編集をご覧ください。 Ilは伝説の問題を開いたままにします(おそらく、凡例の画像を切り抜いて最後の画像に挿入する)。これは良い解決策ではないように感じ始める! – marsei

+0

ありがとう、私は 'getframe'を知らなかった。私はそれをチェックして、それが私に論文の適切なコントロールを与えるかどうかを見なければならないでしょう。 –

2

これを試したことをお勧めしますが、私はパッチの順序を入れ替えることで大きな違いがあることを発見しました。

、最初のスワッピングなしであなたの例の私のバージョン:スワッピングと、その後

t=[1:100]; 
y=t.^2; 
cov=t.^2; 

t2=[1:100]; 
y2=t2.^2.05; 
cov2=t2.^2; 

figure 

t = t(:); 
y = y(:); 
cov = cov(:); 
a = ones(size(t)); 

t2 = t2(:); 
y2 = y2(:); 
cov2 = cov2(:); 

a = ones(size(t2)); 

regions(1) = patch('XData', [t; t(end:-1:1)], ... 
    'YData', [y + 2*cov; y(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'r'); 

regions(2) = patch('XData', [t; t(end:-1:1)], ... 
    'YData', [y - 2*cov; y(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'r'); 
ls = line('XData', t, 'YData', y,'Linewidth',1.5); 

regions(3) = patch('XData', [t2; t2(end:-1:1)], ... 
    'YData', [y2 - 2*cov2; y2(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'b'); 
ls = line('XData', t2, 'YData', y2,'Linewidth',1.5); 

regions(4) = patch('XData', [t2; t2(end:-1:1)], ... 
    'YData', [y2 + 2*cov2; y2(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'b'); 

not swapped

regions(1) = patch('XData', [t; t(end:-1:1)], ... 
    'YData', [y + 2*cov; y(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'r'); 

regions(3) = patch('XData', [t2; t2(end:-1:1)], ... 
    'YData', [y2 - 2*cov2; y2(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'b'); 
ls = line('XData', t2, 'YData', y2,'Linewidth',1.5); 


regions(2) = patch('XData', [t; t(end:-1:1)], ... 
    'YData', [y - 2*cov; y(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'r'); 
ls = line('XData', t, 'YData', y,'Linewidth',1.5); 


regions(4) = patch('XData', [t2; t2(end:-1:1)], ... 
    'YData', [y2 + 2*cov2; y2(end:-1:1)], ... 
    'FaceVertexAlphaData', [0*a; a], ... 
    'FaceAlpha', 'interp', 'EdgeColor', 'none', 'FaceColor', 'b'); 

swapped

グレート効果、私は見たことがなかったですMatlabの前にこれ。

+0

2次(1,3,2,4)をプロットすると、図1と(1,2,3,4)図2が得られます。また、太い 'ls'線もありません。 – marsei

+0

@Maglaそれは奇妙なことですが、私はもう一度チェックし、結果を思いつきました。 Matlabのバージョンかもしれない、私はまだ古代R14を使用しています。いずれの場合でも、1つのパッチがもう一方のパッチを圧倒する傾向があるため、これはおそらく理想的な解決策ではありません。 –

+1

あなたの最後のコメントはまさに正しいです。私は呼び出し順序を変えても何の違いもありませんでした。ただ、MATLABは呼び出しと同じ順序で要素をレイヤ化しませんでした。私はR2012aを使用しています。しかし、 "1つのパッチが他のものを圧倒"が私の主な関心事です。理想的には、各カラーチャンネルに1つのものがあり、対称性があり、最初に描かれているものは問題ではありません。 –

関連する問題