資料視覺化之美-以matlab為工具

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第3天,點選檢視活動詳情

問題+視覺化場景+資料=故事

絕大多數視覺化故事會以某類問題作為開場,引導讀者進入某個主題或者場景中,在該主題或場景中,資料所蘊含的意義最為豐富。故事的多個關鍵部分會作為一些組成環節嵌入到視覺化的特定場景中。視覺化場景經常是作為資訊圖片或者視覺化的介紹文字的一部分。 視覺化場景提供瞭解答下述問題的資訊: - 我們正在看的是什麼資料? - 這份資料存在於什麼時間段內? - 哪些顯著的時間或者變化影響了這些資料?

資料視覺化主要旨在藉助於圖形化手段,清晰有效的傳達與溝通訊息。Matlab作為高校中常使用的工具之一,其視覺化能力非常強。\ 本文將從視覺化的基礎講起,也介紹一些資料視覺化的作品(包含部分程式碼)。

Matlab視覺化基礎(見下圖,該圖源自一位中科大的博士),裡面涉及到畫圖的一些基礎內容,其github連結,文末會提供原始碼下載:\ http://github.com/Pjer-zhang/matlabPlotCheatsheet

image.png

資料視覺化作品(Matlab版本,含程式碼)

1、 三維切片圖:通過切片觀測三維資料的變化

相信理工科方面的科研人員經常會遇到做三維切片圖的時候。切片主要是通過二維切片來展示,在matlab中主要是通過slice來展示切片。

三維體切片平面 - MATLAB slice

1.1 簡單示例

在這裡x,y,z為空間上的三個軸,v是屬性值 注意切片的屬性值。

```matlab [X,Y,Z] = meshgrid(-2:.2:2); V = X.*exp(-X.^2-Y.^2-Z.^2);

xslice = [-1.2,0.8,2];
yslice = []; zslice = 0; slice(X,Y,Z,V,xslice,yslice,zslice) ```

image.png

1.2 稍複雜的示例

```matlab 1. [x,y,z,v] = flow; %%flow()函式可以生成幾個三維向量 2. x1 = min(min(min(x)));x2 = max(max(max(x))); %此處x為255025的矩陣。 3. y1 = min(min(min(x)));y2 = max(max(max(x))); 4. z1 = min(min(min(x)));y2 = max(max(max(x))); 5. sx = linspace(x1+1.5,x2,5); 6. sy = 0; 7. sz = 0; 8. slice(x,y,z,v,sx,sy,sz); 9. view([-38,38]);shading interp; 10. colormap jet; 11. 12. set(gcf,'color',[1 1 1])

```

example1.png

1.3 現實的案例:空氣汙染物

三維空間分佈往往能夠更加直觀地展示大氣中的物質分佈情況。

image.png

2、三維流場

相對於二維的quiver箭頭,三維的箭頭為quiver3。 ```matlab 1. [x, y, z] = meshgrid(-0.8:0.2:0.8, -0.8:0.2:0.8, -0.8:0.8:0.8);
2.
3. % Calculate homogenous turbulence values at each (x,y,z)
4. u = sin(pix).cos(piy).cos(piz);
5. v = -cos(pi
x).sin(piy).cos(piz);
6. w = sqrt(2/3)cos(pix).cos(piy).sin(piz);
7.
8. % Draw a 3 dimensional quiver plot using the quiver3 function
9. figure
10. quiver3(x, y, z, u, v, z)
11.
12. % Set the axis limits
13. axis([-1 1 -1 1 -1 1])
14.
15. % Add title and axis labels
16. title('Turbulence Values')
17. xlabel('x')
18. ylabel('x')
19. zlabel('z')

```

example2.png

3、流場的渦量切片

這裡的切片如上文中的1.3一致。

```matlab 1. close all
2. load wind % 利用matlab提供的示例資料
3.
4. mycmp=[[ones(20,1),(0.05:0.05:1)',(0.05:0.05:1)'];[(1:-0.05:0.05)',(1:-0.05:0.05)',ones(20,1)]];
5. cav = curl(x,y,z,u,v,w); %計算旋度
6. h = slice(x,y,z,cav,[90 134],59,0); %切片
7. shading interp
8. daspect([1 1 1]);
9. axis tight
10. colormap(mycmp);
11. caxis([-5,5])
12. camlight
13. set([h(1),h(2)],'ambientstrength',.6);

```

example3.png

4、運動的流場

image.png

5、三維流帶圖

example5.png

6、流管圖

example3.png

7、三維速度場全貌

example4.png

8、運動的地球

SphericalSpin2.gif