2013-04-02 93 views
26

我有存儲在MATLAB格式的一些數據(兩個參數的函數),我想使用MATLAB來繪製。一旦我讀取數據,我使用mesh()來繪製一張圖。我mesh()情節給我的函數的值作爲顏色和表面高度,就像這樣:如何在matlab中製作「彩色地圖」圖?

A color and a surface height as a function of two independent variables.

我應該使用什麼MATLAB繪圖功能,以使那裏的因變量表示的2D網格圖作爲只有一種顏色?我正在尋找gnuplot中的pm3d map之類的東西。

+1

gnuplot函數與Matlab的網格有什麼不同?使用Mesh,顏色與表面高度成正比 – Molly

+0

我不想要一個表面,我只想要一個帶有顏色的2D地圖 – Dan

回答

37

默認mesh將顏色基於(默認)jet顏色表(即熱更高)的表面值。您還可以使用surf填充表面修補程序,並將'EdgeColor'屬性設置爲'None'(因此修補程序邊緣不可見)。

[X,Y] = meshgrid(-8:.5:8); 
R = sqrt(X.^2 + Y.^2) + eps; 
Z = sin(R)./R; 

% surface in 3D 
figure; 
surf(Z,'EdgeColor','None'); 

enter image description here

2D地圖:您可以通過切換圖

% 2D map using view 
figure; 
surf(Z,'EdgeColor','None'); 
view(2);  

enter image description here

view財產......或治療的價值得到了2D地圖在Z作爲基質,將其視爲一個縮放圖像全光照克imagesc和選擇適當的colormap

% using imagesc to view just Z 
figure; 
imagesc(Z); 
colormap jet; 

enter image description here

地圖的彩色調色板,通過colormap(map),其中map可以是定製的或任何的控制內置由MATLAB提供色彩映射表:

enter image description here

更新/改進地圖:地圖上的幾個設計選項(分辨率,平滑,軸等)可以由常規M ATLAB選項。作爲@Floris指出,這裏是一個平滑的,等軸,無軸標籤地圖,適用於這個例子:

figure; 
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp'); 
view(2); 
axis equal; 
axis off; 

enter image description here

+2

非常好的答案(+1)。如果添加''facecolor'','interp'作爲額外的命名屬性,則可以更平滑地對顏色進行插值,而不是現在獲得的塊狀外觀。另外,如果描述X和Y尺寸的矢量是「 xv'和'yv',你可以通過'imagesc(xv,yv,Z)'來縮放座標軸。或者用'axis off'關閉x和y軸標籤。您將得到X和Y縮放比例與'軸圖像'相同 - 防止圖像被拉伸。最後,如果數據開始時不在常規網格中,則希望使用'griddata'函數進行重新採樣。 – Floris

+0

@弗羅里斯以上所有的重點!將更新反映一些。儘管這些和類似選項中的許多(分辨率,粗略或精細,規則網格等)將取決於數據表示和映射的需要。 – gevang

+1

謝謝 - 你說得對。但是,即使使用粗略數據,插值等操作也會有所幫助,並且讓軸線正確反映X和Y的比例是我心目中必不可少的。如果你沒有正確標記它們,不要標記它們('axis off')。你的回答非常好,我想幫助它變得更好。 – Floris

19

gevang的答案是偉大的。還有另外一種方式也可以直接使用pcolor做到這一點。代碼:

[X,Y] = meshgrid(-8:.5:8); 
R = sqrt(X.^2 + Y.^2) + eps; 
Z = sin(R)./R; 
figure; 
subplot(1,3,1); 
pcolor(X,Y,Z); 
subplot(1,3,2); 
pcolor(X,Y,Z); shading flat; 
subplot(1,3,3); 
pcolor(X,Y,Z); shading interp; 

輸出:

enter image description here

此外,pcolor是平的也一樣,顯示這裏(pcolor是2D鹼;使用mesh生成它上面的三維圖):

enter image description here

2

我也建議使用contourf(Z)。對於我的問題,我想用二維可視化3D直方圖,但輪廓太光滑,無法表示直方圖條的頂視圖。

所以在我的情況下,我更喜歡使用jucestain的答案。 pcolor()的默認shading faceted更合適。 但是,pcolor()不使用繪製矩陣的最後一行和一列。對於這一點,我用了padarray()功能:

pcolor(padarray(Z,[1 1],0,'post')) 

很抱歉,如果這是不是真的涉及到原來的職位

4

注意,這兩個令pColor和「衝浪+視圖(2)」不顯示最後一行和你的二維數據的最後一列。

另一方面,使用imagesc,你必須小心軸。 gevang的答案中的surf和imagesc示例(幾乎 - 除了最後一行和一列)相互對應,因爲2D sinc函數是對稱的。

爲了說明這2點,我公司生產的下面的下面的代碼所示:

[x, y] = meshgrid(1:10,1:5); 
z  = x.^3 + y.^3; 

subplot(3,1,1) 
imagesc(flipud(z)), axis equal tight, colorbar 
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1); 
title('imagesc') 

subplot(3,1,2) 
surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar 
title('surf with view(2)') 

subplot(3,1,3) 
imagesc(flipud(z)), axis equal tight, colorbar 
axis([0.5 9.5 1.5 5.5]) 
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1); 
title('imagesc cropped') 

colormap jet 

surf vs imagesc

正如你可以看到第10行和第5列中缺少衝浪情節。 (您也可以在其他答案中的圖像中看到此圖像。)

請注意如何使用「set(gca,'YTick'...」(和Xtick)命令正確設置x和y刻度標籤如果x和y不是1:1:N

另外請注意,如果您的z數據對應於xs和ys是(每個)均等間隔,那麼imagesc纔有意義。如果不是,您可以使用surf(並可能重複最後一列和一行以及一個「(end,end)」值 - 儘管這是一種骯髒的方法)。