2012-11-17 2 views
3

아래 그림과 같은 표면 플롯을 갖고 싶지만 적절한 컬러 바를 사용하고 싶습니다. MATLAB에서 사용자 정의 색상 범위를 colorbar와 결합하는 방법은 무엇입니까?

plot without colorbar

내 코드입니다 : 나는 색상이 (녹색, 노란색, 빨간색은) 내 사용자 지정 범위에 따라 정렬됩니다 년 Colorbar을 추가하는 운이 없었다 지금까지

[X,Y,Z] = peaks(30); 

[maxval dummy] = max(Z(:)); 
[minval dummy] = min(Z(:)); 

crange = 1.5; 

% red, yellow, green 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
colormap(cmap); 

colors = zeros(size(Z));     
colors(Z <= -crange) = 1;    % red (1) 
colors(Z > -crange & Z < crange) = 2; % yellow (2) 
colors(Z >= crange) = 3;    % green (3) 

surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

%cbh = colorbar('YGrid','on');  
%caxis([minval-0.1 maxval+0.1]); 
%set(cbh,'YTick',[minval -crange crange maxval]); 

(녹색 [8 ... 1.5], 노란색 [1.5 ... -1.5], 빨간색 [-1.5 ... -6.4]). 대신 마지막 세 줄의 주석 처리를 제거하면 선형 정렬 된 색상 막대가 나타나고 내 플롯의 색상이 사용자 정의 범위가 아니라 색상 막대에 따라 정렬됩니다.

plot with colorbar

지금, 내가 가지고 싶은 것은 년 Colorbar의 색상이 내 사용자 지정 진드기 일치 줄거리는 첫 번째 사진에서 보이는 것이 있다는 것입니다.

답변

4

문제는 서핑 플롯에서 각 지점의 색상을 사용자가 직접 지정하므로 기본적으로 z 값과 관련이 없습니다. 색상 표시 줄은 색상 번호에 따라 1 ~ 3까지만 구성됩니다. 변경하기 전에 색상 막대의 기본 눈금으로도 표시됩니다 (변경하기 전에)

눈금을 수동으로 설정할 수 있습니다 와 같은 방법으로 당신은 '속임수'를 사용 yticklabels을 할 수 있습니다

figure 
colormap(cmap); 
surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

cbh = colorbar('YGrid','on'); 
set(cbh,'ytick',linspace(1,3,4)); 
set(cbh,'yticklabel',arrayfun(@num2str,[minval -crange crange maxval],'uni',false)); 

enter image description here

또는 다른 방법은 단순히 caxis을 사용하는 것입니다,하지만 플롯의 색상은 선형 MINMAX 값으로 정의된다 따라서 비선형 범위를 설정할 수 없습니다.
그림 :

enter image description here

figure 
colormap(cmap); 
surf(X,Y,Z); 
axis([-3 3 -3 3 -10 10]); 
caxis([minval-0.1 maxval+0.1]); 
cbh=colorbar 
set(cbh,'YTick',[minval -crange crange maxval]); 
그래서 결국 나는 내 첫 번째 방법 (사용 yticklabels가) 당신이 원하는 일을하는 유일한 방법이라고 생각합니다.

1

나는 이것이 미친 오래된 게시물 인 것을 알고있다. 그러나 나는 대답을 찾고있는 것처럼 나온다. 그리고 여기 내 대답이 될 것입니다. (불행히도 컬러 바의 눈금은 같은 크기입니다).

색상 맵을 3 색으로 만들었 으면 다음 부분은 대수입니다. caxis은 색상 막대의 색상 수와 최소 및 최대 범위에 따라 결정되는 간단한 공식을 따릅니다.

index = fix((C-cmin)/(cmax-cmin)*m)+1; 

그래서 인덱스는 컬러 맵의 인덱스 (즉, 귀하의 칼라 맵의 길이 m = 3 때문에)를 참조하고, 내가 무엇을 할 것이다 당신이 대칭하려는 경우 (결정, C = 1.5을 것입니다 것입니다 당신은 cmax와 cmin을 위해 풀고 두가지가 모두 x 일 때 더 쉽습니다.) 그리고 index = 2로 만드십시오. (왜냐하면 당신은 1.5를 해결하면 cmmin/노란색과 빨간색 사이에 표시 범위 값을 어딘가에 설정할 수 있어야합니다 (레이블이 아닐지라도). 색상 표를 적절하게 설정해야합니다. (예 : 레이블이 아닐지라도)

죄송합니다. .

0

내가 가진 문제에 대한 해결책을 찾을 때 나는이 질문에 마주 쳤다. 어쨌든이 질문은 필자가 작성한 코드를 거의 수정하지 않고 내 문제에 대한 해결책을 얻는 데 도움이되었습니다. 동시에 코드에 대한 몇 가지 변경 사항을 제안하여 사용자가 필요한 색상과 적절한 색상 막대로 필요한 플롯을 얻을 수 있도록하고 싶습니다. 여기서, 코드

[X,Y,Z] = peaks(30); 
 

 
[maxval dummy] = max(Z(:)); 
 
[minval dummy] = min(Z(:)); 
 

 
crange=1.5; 
 

 
% red, yellow, green 
 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
 
colormap(cmap); 
 

 
colors = zeros(size(Z));     
 
colors(Z <= -crange) = minval-0.1;    % red (1) 
 
colors(Z > -crange & Z < crange) = crange; % yellow (2) 
 
colors(Z >= crange) = maxval+0.1;    % green (3) 
 

 
surf(X,Y,Z, colors); 
 
axis([-3 3 -3 3 -10 10]); 
 

 
cbh = colorbar('YGrid','on');  
 
caxis([minval-0.1 maxval+0.1]); 
 
set(cbh,'YTick',[minval -crange crange maxval]);

Plot

관련 문제