[繪圖] scatter3()
各位版友,我遇到一個奇怪的狀況,沒有辦法正確指定資料點的大小,請多指教啦
(不好意思我用的好像不是正版的,不知道有沒有關連 :P)
照理講 scatter3(x,y,z,s,c) 中使用一個 s 向量跟 x~z 長度一樣,可以指定
每一個點的大小。(c 可以point-wise指定顏色)
看 Help 裡面說 s 是直接指定絕對大小(number of points)。
當只有 100 或 200 個點的時候沒問題(大的點比小的點大很多),問題是當
資料點稍微多一點的時候,譬如說到1000,點的尺寸就完全不一樣了(大的點跟
小的點幾乎一樣大)。
明明1000根本還很小的說....
彷彿因為繪圖相關的記憶體的限制,數據點的比較多的時候就不能畫太大,不然圖
上有顏色的點(pixel)就會太多。
我可以(應該說必須)譬如說把向量 s 乘以十 來再次畫出大小有落差的尺寸。
這樣子要抓大小真的很難耶。
底下是我的程式碼。
更奇怪的是,如果把數據加上一些隨機項,就會整個亂掉...我希望按照 x 座標,
小的點在「左邊」,但是完全不對,很小的點跟很大的點都排在一起。
我使用同樣的向量來畫顏色 scatter3(x,y,z,s,s),所以可以對照看出 s 是沒有
問題的(我的程式碼裡面的確會讓「尾巴」的部分有一點點重複,但那不是問題)
到底是怎麼回事呢? @@
謝謝~
% =================== helix ======================
w(:, 1) = 0:1/m:1;
turn = [2 3];
w(:, 2) = cos( turn(1) * 2*pi * w(:, 1));
w(:, 3) = sin( turn(2) * 2*pi * w(:, 1));
figure;
scatter3( w(:, 1), w(:, 2), w(:, 3), ...
40 + 400 * w(:, 1) .* w(:, 1) , ...
w(:, 1), 'filled' ... % un-filled is quite funny :P
); axis square; colormap('default');
mn = min( min(w) ); mx = max( max(w)); rng = mx - mn;
xlim([-0.2 mx + 0.1*rng ]); xlabel('x');
ylim([mn - 0.1*rng mx + 0.1*rng ]); ylabel('y');
zlim([mn - 0.1*rng mx + 0.1*rng ]); zlabel('z');
% ============= helix with perturbed ======================
m = 8*10^2;
w(:, 1) = rand(m, 1);
turn = [2, 3];
w(:, 2) = cos( turn(1) * 2*pi * w(:, 1));
w(:, 3) = sin( turn(2) * 2*pi * w(:, 1));
scale = 10 * repmat([3 2 1], m, 1); % stretch
w = w .* scale; % still not tilted, though
pscale = 0.1 * repmat([7 3 1], m, 1); % scale of noise
w = w + pscale .* randn(m ,3); % perturb
% Do this before centering
PointSizes = w(:, 1) .* w(:, 1);
w = w - repmat( mean(w), m, 1);
figure;
scatter3( w(:, 1), w(:, 2), w(:, 3), ...
100 + PointSizes/2, ...
PointSizes, 'filled' ... % un-filled is quite funny :P
); axis square;
cmap = 0.7 * bone; % scaled to avoid light dots
colormap(cmap);
mn = min( min(w) ); mx = max( max(w)); rng = mx - mn;
xlim([mn - 0.1*rng mx + 0.1*rng ]); xlabel('x');
ylim([mn - 0.1*rng mx + 0.1*rng ]); ylabel('y');
zlim([mn - 0.1*rng mx + 0.1*rng ]); zlabel('z');
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 64.134.26.99