0

X, Y, Z次のような3 つの配列があります。

x = [1, 1, 1, 2, 2, 2, 3, 3, 3]
y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
z = [1, 2, 3, 2, 4, 6, 3, 6, 9]

次に、これらの点を でプロットしていplot3(x,y,z)ます。ただし、結果は予期しないものです..これは基本的に対数グラフのように表示されることを意図しており、これを行いますが、余分な行もあります. 私はそれがどのように起こっているのか分かりません、多分ここの誰かが私を啓発することができます!

これが私のグラフの例です (明らかに、私は値をプロットしました。X, Y, Z上記の配列は、それらがどのように見えるかの単なる例です): 画像

ご覧のとおり、下の曲線は対数グラフの線であり、これは嬉しいものですが、その上に表示される曲線は私を混乱させます。X Y Z次のパターンに一致する値を表示してみました: X is between 110 and 120and Y = 0.05. これにより、理論的には、それぞれに対して 2 つの一致が得られるはずXです。すなわち。の間に 20 個の一致が得られるはずです。これは、グラフが 2 つの線がそれぞれX = [110, 120]の点にヒットしていることを示しているためです。Y = 0.05X

Xのどの値がグラフ化されているかをより明確にするために、それは基本的に と の0.1間の増分でX = 120ありX = 119、 をプロットしてい119.0, 119.1, ... , 120.0ます。いずれにせよ、 の間のX, Zヒットは 2 点だけです。Y = 0.05119-120

私が言ったようにX, Z、一致した の値をチェックしたところ、ごとに 1 つの結果Y = 0.05しか返されませんでしXた。つまり、 の場合X = [110, 120]、10 件の一致のみが返されます。これらの値は、一番下の行 (つまり、対数グラフの線) の値であり、一番上の行ではありません。事実上、これらの行は存在することを意図していません。彼らは間違いなくヒットY = 0.05しており、その間にX = [110, 120]あるので、一致として表示されるはずです..

それで、あなたはそれを持っています。何が起こっているのかよくわかりません!誰かが助けてくれたら、それは素晴らしいことです。

編集 - 詳細情報。X, Y戻る関数に手動で値を入れてもZ、上の行の値に到達することはありません。

ありがとう。

4

2 に答える 2

2

、 の例はx、実際yz問題をよく示しています。
個々の曲線 (対数プロットごとに 1 つ) をプロットするのではなく、1 つの連続した曲線をプロットします。したがって、余分な線は、実際には対数曲線の一方の端を次の端に接続しています。
プロット コマンドを分割する必要があります。

編集
最終的にはデータセットの知識が必要になりますが、上記で指定したxyz場合、これは 1 つではなく 3 つの独立した曲線を生成するために機能します。

x = [1, 1, 1, 2, 2, 2, 3, 3, 3];
y = [1, 2, 3, 1, 2, 3, 1, 2, 3];
z = [1, 2, 3, 2, 4, 6, 3, 6, 9];

DATASET_SIZE = 3;

hold on;

for i=1:size(x,2)/DATASET_SIZE

    plot3(x((i-1)*DATASET_SIZE+1:i*DATASET_SIZE),y((i-1)*DATASET_SIZE+1:i*DATASET_SIZE),z((i-1)*DATASET_SIZE+1:i*DATASET_SIZE));
    plot3(x(i*DATASET_SIZE+1:2*DATASET_SIZE),y(i*DATASET_SIZE+1:2*DATASET_SIZE),z(i*DATASET_SIZE+1:2*DATASET_SIZE));
    plot3(x(2*DATASET_SIZE+1:3*DATASET_SIZE),y(2*DATASET_SIZE+1:3*DATASET_SIZE),z(2*DATASET_SIZE+1:3*DATASET_SIZE));

    view(3)

end  

編集 2

この「問題」が発生したかどうかを確認する簡単な方法はData Cursor、MATLAB プロット ウィンドウで を使用することです。グラフの任意の場所に配置し、upまたはdown矢印キーを使用して移動します。プロットの全長に沿って移動できる場合、それは連続した線です。さらに、Cursor1 つのカーブの「終了」から次の「開始」へのジャンプが見られるはずです。

于 2013-05-17T16:07:22.267 に答える
0

surface(x,y,z) を使用して同じ問題が発生し、レンダラーを変更して問題に対処しました。MATLABには、データをプロットするための3つの異なるレンダラーがあり、デフォルトでは、表示されているようにopenGLレンダラーがプロットされます。Figure が GET(gcf) で使用しているレンダラーを表示できます。set(gcf,'Renderer','painters') 私が信じている 3 番目のレンダラーは zbuffer で、同様に機能する可能性があります。

于 2014-09-29T14:57:12.950 に答える