[繪圖] scatter3()

看板MATLAB作者 (smd)時間12年前 (2013/03/12 20:46), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
各位版友,我遇到一個奇怪的狀況,沒有辦法正確指定資料點的大小,請多指教啦 (不好意思我用的好像不是正版的,不知道有沒有關連 :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
文章代碼(AID): #1HFoEqjz (MATLAB)