2017-12-23 7 views
2

아래 그림과 같이 9 개의 서브 플로트를 하나의 컬러 막대로 세 개의 서브 플로트로 플롯합니다.MATLAB 컬러 바 틱 레이블에 오류가 있습니까?

여기서 색상 막대의 가장 높은 값을 > value으로 표시하려고합니다. 놀랍게도 직접 ​​눈금 레이블을 h.TickLabels{end} = ['>' h.TickLabels{end}];으로 편집하면 색상 막대가 값을 반복하기 시작합니다.

h.TickLabels{end} = ['>' h.TickLabels{end}];을 제거하면 색상 막대가 문제없이 표시됩니다. 그림 크기를 set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 8 8])으로 변경하면 [0 0 5 5]으로 바뀌고 다시 컬러 바 라벨이 바뀝니다.

이 오류를 해결하는 방법?

data = [1 2 3; 5 7 3; 12 29 14; 1 7 3; 2 8 3; 5 4 1; 2 2 1; 2 3 1; 1 5 2]; 
for i=1:9 
    subplot(3, 3, i) 
    plot(data(i,:)); 
    if ismember(i, [1:3])   
     caxis([0 20]) 
     if i==3 
      h = colorbar('Fontsize', 6, 'LineWidth', 0.15, 'TickDirection', 'out',... 
         'TickLength', 0.02); 
      set(h, 'Position', [.935 .6867 .01 .2533]) 
      h.TickLabels{end} = ['>' h.TickLabels{end}]; 
     end 
    end 
    if ismember(i, [4:6])  
     caxis([0 6]) 
     if i==6 
      h = colorbar('Fontsize', 6, 'LineWidth', 0.15, 'TickDirection', 'out',... 
         'TickLength', 0.02); 
      set(h, 'Position', [.935 .3733 .01 .2533]) 
      h.TickLabels{end} = ['>' h.TickLabels{end}]; 
     end 
    end 
    if ismember(i, [7:9])   
     caxis([0 4]) 
     if i==9 
      h = colorbar('Fontsize',6, 'LineWidth', 0.15, 'TickDirection', 'out',... 
         'TickLength', 0.02); 
      set(h, 'Position', [.936 .06 .01 .2533]) 
      h.TickLabels{end} = ['>' h.TickLabels{end}]; 
     end 
    end 
end 
set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 8 8]) 
print('test', '-djpeg', '-r300') 
close all 

enter image description here

+0

TickLabels를 수동으로 변경하면 일이 엉망이된다는 아이디어를 얻었으므로 주석에 해당 답변을 추가 할 수 있습니다. 감사. – Mario

+0

@SardarUsama 귀하의 수정 된 답변을 읽었지만, 여기에 내 문제를 설명하기 위해 MCVE를 게시했습니다. 실제로 나는 평균 강우량 데이터, 평균 및 분산이 있으며, 범위는 0에서 400 사이입니다. 색상 막대 제한은 95 백분위 수 값으로 고정됩니다. 필자는 많은 플롯을 가지고 있으므로 매번 틱 레이블 간격을 편집하는 것은 매우 어려울 것입니다. – Mario

+0

아니, 이걸하고있어. 'limit = prctile (datat, 95); caxis ([0, limit]) '를 입력하십시오. – Mario

답변

2

왜 이런 일이 : 아래

내 예와 출력 이미지를 작업?
TickLabels을 수동으로 변경하면 TickLabelsMode 속성이 manual로 변경되고 그림 창의 확대/축소/크기 조정/크기 조정의 컨트롤이 손실됩니다.


어떻게 고칠 수 있습니까?

  • 틱 자체를 조정하는 수신기를 사용하십시오. 문서화되지 않은 기능이 필요할 수 있습니다. Yair Altman의 this utility에서 colorbar에 대한 청취자 구현에 대한 아이디어를 얻을 수 있습니다. 이것은 축 레이블의 경우이며 colorbar에서 약간의 조정이 필요합니다.

또는 상대적으로 간단한 방법이하는 것입니다 :

  • 변경 수동 예에 'TicksMode' :

    set(h, 'Ticks', get(h,'Ticks')); %or h.Ticks = h.Ticks; for >= R2014b 
    
    :이 줄 h.TickLabels{end} = ['>' h.TickLabels{end}]; 전에
    는 이 줄을 포함

    이렇게하면 틱은 동일하게 유지되므로 틱 수는 동일하게 유지되므로 틱 표시는 확대/축소/이동/크기 조정시 오작동하지 않습니다.

    당신은 당신이 원래 다음 얻을로 설정보다 더 많거나 적은 틱 갖고 싶어 :

    %Adjust the increment as desired. I set it as 1 (default) 
    set(h, 'Ticks', in1:1:in2);  %or h.Ticks = in1:1:in2; for >= R2014b 
    %where in1 and in2 are the 1st and 2nd input args you used for caxis respectively 
    

또는 당신은 출력 jpeg 파일와 만 우려 경우 출력 이미지 파일에서 ticklabels이 제대로 작동하지 않습니다.

  • PaperUnits/PaperPosition 마지막에 그것을하는 대신 음모의 시작 부분에.이것은 ticklabels를 자동화하지는 않지만 일시적인 조정 만 할 것입니다.
+0

코드 시작 부분에 set (gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 8 8])'을 유지했지만 도움이되지 않습니다. 컬러 바 문제는 동일하게 유지되었습니다. – Mario

+0

MATLAB에서 이미지를 사용 하시겠습니까? 또는 출력 JPEG 이미지 파일에 관심이 있습니까? 코드를 다시 실행 한 후에 크기를 변경 했습니까? 나는 네가 한 것 같아. 그렇지 않다면 출력 jpeg 파일 –

+0

fyi에서 문제가 발생하지 않을 것입니다. Matlab 2014a에서는 출력이 잘못 남아 있습니다 – shamalaia

2

Sardar wrote으로, 유일한 옵션은 자동으로이 문제를 해결하고, 그림 창 크기가 리스너를 추가하는 것입니다 변경 될 때 틱의 자동 스케일링을 잃지 않을 수 있습니다. m 행 파일에

복사 다음과 같은 기능을, 그리고 당신이이 그림 작업 폴더 (예 : 현재 경로)에 저장 :이 방법으로 할 수 있습니다에,

function set_cb_lables 
% add '>' to the last tick label in all colorbars 

h = findobj(gcf,'Type','Colorbar'); % get all colorbars handels 
set(h,{'TickLabelsMode'},{'auto'}); % change thier mode to 'auto' 
tiklbl = get(h,{'TickLabels'}); % get all tick labels after the change 
for k = 1:numel(tiklbl) 
    tiklbl{k}{end} = ['>' tiklbl{k}{end}]; % add '>' to the last tick 
end 
set(h,{'TickLabels'},tiklbl); % replace the current ticklabels with tiklbl 
end 

그런 다음 코드에서이 줄을 루프 뒤에 추가하십시오.

set(gcf,'SizeChangedFcn','set_cb_lables'); % aplly the function 'set_cb_lables' upon any size change 

그림의 크기를 조정할 때 마지막 눈금 레이블에 자동으로 '>'가 추가됩니다.

이 솔루션은 '>'을 추가하기 전에 틱을 얻는 것보다 낫습니다. 이제 창이 커지면 색상 막대에 자동으로 틱이 채워지기 때문입니다.

+0

정확히 똑같은 디렉토리에 함수 파일을 저장하고 루프 다음에'set (gcf, 'SizeChangedFcn', 'set_cb_lables'); gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 8 8])'과 같이 표시됩니다. 이것은 두 번째 및 세 번째 눈금을 수정하지만 첫 번째 눈금은 같은 문제를 보여줍니다. – Mario

+0

@Mario, 확실하게 - 귀하의 질문과 똑같은 스크립트를 사용 하시겠습니까? (모든 하위 그림에 대해 하나의 그림). 'set_cb_lables' 함수에서 첫 줄 끝 부분에';'를 제거하면 크기를 변경 한 후'h '크기를 볼 수 있습니다. – EBH

+0

다음은 스크립트, 기능 및 출력 이미지입니다 https://drive.google.com/open?id=1HgXRZfz2rmEYqnEX3rdsx3v7PvvXoGAY 첫 번째 색상 막대가 잘못되었습니다 – Mario

관련 문제