數據可視化之美-以matlab為工具

語言: CN / TW / HK

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

問題+可視化場景+數據=故事

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

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

Matlab可視化基礎(見下圖,該圖源自一位中科大的博士),裏面涉及到畫圖的一些基礎內容,其github鏈接,文末會提供源碼下載:\ https://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