2017-12-23 35 views
2

下の図に示すように9つのサブプロットを1つのカラーバーでプロットしています。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

いいえ、私はこれをしています '限界= prctile(datat、95);毎回 caxis([0、limit])を実行します。 – Mario

答えて

2

ですが、なぜでしょう:以下

は、私は一例であり、出力画像を作業していますか?
手動で TickLabelsを変更すると、 TickLabelsModeプロパティが手動に変更され、Figureウィンドウのズーム/パン/サイズ変更のためにコントロールが失われます。


これをどのように修正できますか?

  • ダニ自体を調整するリスナーを使用します。文書化されていない機能が必要な場合があります。あなたはYair Altmanのthis utilityからcolorbarのリスナーを実装するアイディアを取ることができます。これは軸の目盛りのためのもので、colorbarのためにいくつかの調整が必要です。

または比較的単純なアプローチは、に次のようになります。

  • 変更すなわちマニュアルへ'TicksMode':この行h.TickLabels{end} = ['>' h.TickLabels{end}];
    、このライン を含める:

    set(h, 'Ticks', get(h,'Ticks')); %or h.Ticks = h.Ticks; for >= R2014b 
    

    これにより、ティックは同じままであり、したがってチックの数も同じままであり、したがって、チンベルはズーム/パン/図形ウィンドウのサイズ変更で誤動作しない。

    あなたは、もともと、その後取得し、それらを設定するよりも、多かれ少なかれティック持つようにしたい場合:

    %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ファイルとのみに関心している場合、あなたの

  • PaperUnits/を設定すると、出力画像ファイルでティックラベルが正しく機能しません。を最後に行うのではなく、プロッティングの最初に表示します。これにより、ティックラベルは自動化されませんが、一時的な調整のみが行われます。
+0

私はコードの最初にset(gcf、 'PaperUnits'、 'inches'、 'PaperPosition'、[0 0 8 8]) 'を書いていましたが、助けにはなりません。カラーバーの問題は変わりませんでした。 – Mario

+0

MATLABでイメージを使用していますか?またはあなたは出力JPEG画像ファイルに関心がありますか?コードを再実行した後にFigureのサイズを変更しましたか?私はあなたがしたと思う。もしあなたがしなかった場合、あなたは出力JPEGファイルでこの問題は起こりません –

+0

fyi、Matlab 2014aで出力が間違っています – shamalaia

2

Sardar wroteとして、唯一のオプションは、自動的にこの問題を解決し、Figureウィンドウのサイズは、リスナーを追加することで変更されたときにダニの自動スケーリングを失わないように。

コピー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 

次に、あなたにループの後に次の行を追加します。

図のサイズ変更時に最後の目盛りラベルに自動的に '>'が追加されます。

このソリューションは、「>」を追加する前にティックを取得するよりも優れています。ウィンドウが大きくなると、カラーバーにはより多くのティックが自動的に設定されるからです。

+0

関数のファイルを同じディレクトリに保存し、ループの後に 'set(gcf、 'SizeChangedFcn'、 'set_cb_lables'); gcf、 'PaperUnits'、 'inches'、 'PaperPosition'、[0 0 8 8]) 'となります。これは2番目と3番目のスケールを修正しますが、最初のスケールは同じ問題を示しています。 – Mario

+0

@Mario、確かにあなたの質問と同じスクリプトを使用します。 (すべてのサブプロットについて1桁)。 'set_cb_lables'関数の最初の行の最後に'; 'を削除して、サイズ変更後に' h'のサイズを表示します。 – EBH

+0

ここにスクリプト、関数、出力イメージがありますhttps://drive.google.com/open?id=1HgXRZfz2rmEYqnEX3rdsx3v7PvvXoGAY最初のカラーバーが正しくありません – Mario

関連する問題