web-dev-qa-db-ja.com

実線と灰色のマイナーグリッド

以下を使用して、プロットにマイナーグリッドを表示しています。

grid(gca,'minor') 
set(gca,'MinorGridLineStyle','-')

グリッド線の色を素敵なグレースケールに変更したいと思います。 MATLABでオプション「グリッドカラー」を見つけることができません...回避策を知っていますか?私はこれを見つけました: http://www.mathworks.com/matlabcentral/fileexchange/9815-gridcolor しかし、コメントを読んだとき、それはうまく機能せず、さらにグリッドカラーを変更するだけです、副グリッドの色ではありません...ありがとうございます!


[〜#〜] edit [〜#〜]:ここに投稿する際のsemilogxに関する問題:

x = [1e-9 1e-8 1e-7 1e-6 1e-5 1e-4 1e-3 1e-2]';
y1 = linspace(20, 90, 8);
y2 = y1.^2;
y3 = y1./y2+5;

% plotte: http://www.mathworks.com/help/techdoc/ref/linespec.html
myfig = figure('Position', [500 500 445 356]); %[left, bottom, width, height]:
p1 = semilogx(x,y1,'x--r',x,y2,'*-b');

ax1 = gca;
set(ax1, 'Position',[0.13 0.18 0.75 0.75]);

xlim([0 max(x)]);
ylim([0 max([max(y1) max(y2)])]);


col=.85*[1 1 1];
%# create a second transparent axis, same position/extents, same ticks and labels
ax2 = axes('Position',get(ax1,'Position'), ...
    'Color','none', 'Box','on', ...
    'XTickLabel',get(ax1,'XTickLabel'), 'YTickLabel',get(ax1,'YTickLabel'), ...
    'XTick',get(ax1,'XTick'), 'YTick',get(ax1,'YTick'), ...
    'XLim',get(ax1,'XLim'), 'YLim',get(ax1,'YLim'),...
    'XScale', 'log');

%# show grid-lines of first axis, give them desired color, but hide text labels
set(ax1, 'XColor',col, 'YColor',col, ...
    'XMinorGrid','on', 'YMinorGrid','on', ...
    'MinorGridLineStyle','-', ...
    'XTickLabel',[], 'YTickLabel',[],'XScale', 'log');


%# link the two axes to share the same limits on pan/zoom
linkaxes([ax1 ax2],'xy');

このように表示する: enter image description here


EDIT2:次の図のように2番目のy軸を追加すると問題が発生します。右のy軸の目盛りを見てください。

enter image description here

これについては、概要を説明するためにここで説明します。 Matlab:副グリッドスタイルと2つのy軸を設定するときの目盛りの問題

13
tim

'XColor','YColor' 軸プロパティを設定します。これらのプロパティは、軸線、目盛り、目盛りラベル、および軸グリッド線の色を決定することに注意してください。そのため、AFAIKでは、軸全体の色とは異なる色を割り当てることはできません。

例:

plot(Rand(10,1))
set(gca, 'XMinorGrid','on', 'YMinorGrid','on', 'XColor','r', 'YColor','g')

編集1:

現在の軸の上に重ねられた目盛りやラベルなしで、希望のグリッド色で2番目の透明な軸をいつでも作成できます。次に例を示します。

%# create plot as usual
plot(Rand(10,1))
hAx1 = gca;

%# create a second axis, same position/extents, no tick or labels, colored grid-lines
hAx2 = axes('Position',get(hAx1,'Position'), ...
    'Color','none', 'TickLength',[1e-100 1e-100], ...
    'XMinorGrid','on', 'YMinorGrid','on', ...
    'Box','off', 'XColor','g', 'YColor','r', ...
    'XTickLabel',[], 'YTickLabel',[], ...
    'XTick',get(hAx1,'XTick'), 'YTick',get(hAx1,'YTick'), ...
    'XLim',get(hAx1,'XLim'), 'YLim',get(hAx1,'YLim'));

%# position it on top
%#uistack(hAx2,'top')

%# redraw the enclosing box in the original axis colors
x = get(hAx1,'XLim');
y = get(hAx1,'YLim');
line([x([1 2]) nan x([2 1])],[y([1 1]) nan y([2 2])],'Color',get(hAx1,'XColor'))
line([x([1 1]) nan x([2 2])],[y([1 2]) nan y([2 1])],'Color',get(hAx1,'YColor'))

唯一の問題は、グリッド線がプロットの上に描画されることです。グリッド線が太い場合、邪魔になることがあります:)

edit1_screenshot


EDIT2:

@ yoda は上記と同様の考えを持っていたようです。これは彼の解決策に触発されたわずかに改善されたバージョンです:

%# create plot as usual
plot(11:20, Rand(10,1)*5)
hAx1 = gca;   %# get a handle to first axis

%# create a second transparent axis, same position/extents, same ticks and labels
hAx2 = axes('Position',get(hAx1,'Position'), ...
    'Color','none', 'Box','on', ...
    'XTickLabel',get(hAx1,'XTickLabel'), 'YTickLabel',get(hAx1,'YTickLabel'), ...
    'XTick',get(hAx1,'XTick'), 'YTick',get(hAx1,'YTick'), ...
    'XLim',get(hAx1,'XLim'), 'YLim',get(hAx1,'YLim'));

%# show grid-lines of first axis, give them desired color, but hide text labels
set(hAx1, 'XColor','g', 'YColor','r', ...
    'XMinorGrid','on', 'YMinorGrid','on', ...
    'XTickLabel',[], 'YTickLabel',[]);

%# link the two axes to share the same limits on pan/zoom
linkaxes([hAx1 hAx2],'xy');

%# lets create a legend, and some titles
legend(hAx1, 'text')
title('title'), xlabel('x'), ylabel('y')

edit2_screenshot


EDIT3(テイク2):

以下は同じ例ですが、対数スケールのx軸を使用しています。 2番目の軸を作成し、そのプロパティを手動で最初の軸と一致するように設定する代わりに、単純に copyobj 軸を作成して、その子を削除する方法に注意してください。

%# create a plot as usual (x-axis is in the log-scale)
semilogx(logspace(0,5,100), cumsum(Rand(100,1)-0.5))
xlabel('x'), ylabel('y'), title('text')
legend('plot')

%# capture handle to current figure and axis
hFig = gcf;
hAx1 = gca;

%# create a second transparent axis, as a copy of the first
hAx2 = copyobj(hAx1,hFig);
delete( get(hAx2,'Children') )
set(hAx2, 'Color','none', 'Box','on', ...
    'XGrid','off', 'YGrid','off')

%# show grid-lines of first axis, style them as desired,
%# but hide its tick marks and axis labels
set(hAx1, 'XColor',[0.9 0.9 0.9], 'YColor',[0.9 0.9 0.9], ...
    'XMinorGrid','on', 'YMinorGrid','on', 'MinorGridLineStyle','-', ...
    'XTickLabel',[], 'YTickLabel',[]);
xlabel(hAx1, ''), ylabel(hAx1, ''), title(hAx1, '')

%# link the two axes to share the same limits on pan/zoom
linkaxes([hAx1 hAx2], 'xy');

%# Note that `gca==hAx1` from this point on...
%# If you want to change the axis labels, explicitly use hAx2 as parameter.

このコードを使用した例では、正しいプロットが得られるはずです。ただし、選択したx変数の値は、現在の図のサイズでは近すぎてすべての縦線を表示できないと思います(図を最大化して、意味を確認してください)...

edit3_screenshot

各軸の内容をよりよく理解するために、左側のプロットにはhAx1によってレンダリングされたグラフィックのみが含まれ、右側のプロットにはhAx2コンポーネントのみが含まれる分割ビューを示します。これらの2つのビューは、基本的に、前に示した最終的な図では互いに重なり合っています。

edit3_screenshot_divided_axes

10
Amro

残念ながら、グリッド化された2番目の軸を重ねたり重ねたりするトリックはほとんど機能しますが、PDFファイルに保存すると、Matlabは適切にレンダリングしません。これは、MatlabがサポートしていないためですPDFの透明度。

1つの回避策は、lineを使用してグリッド線を1つずつ描画することです。

for dir='XY';
    ticks = get(gca, [dir 'Tick']);
    lim = get(gca, [dir 'lim']);
    for ii=1:length(ticks)
        coord = ticks(ii);

        for jj=1:9,
            if jj==1                  % major grid properties
                color = [1 1 1]*0.9;
                weight = 2;
            else                      % minor grid properties
                color = [1 1 1]*0.9;
                weight = 1;
            end
            if jj*coord > lim(2)
                continue
            end
            if dir=='X' 
                L = line((jj*coord)*[1 1], get(gca, 'ylim'), ...
                         'color', color, 'linewidth', weight);
            else
                L = line(get(gca, 'xlim'), (jj*coord)*[1 1], ...
                         'color', color, 'linewidth', weight);
            end
            uistack(L, 'bottom');
        end
    end
end

このアプローチの欠点の1つは、目盛りとプロット境界ボックスを上書きすることです。これに対する解決策は、このアプローチを2番目の軸を下に置くトリックと組み合わせることです。下にあるAxesに偽のグリッドを描画します。これはIS PDFで適切にレンダリングされます:

enter image description here

6
nibot

Amroは、副グリッドの色が軸ラベルの色と同じであることを理解していますが、いつでも軸ラベルをオフにして、2番目の軸を透明な塗りつぶしでオーバーレイし、ラベルに別の色を設定できます。以下は、その方法を示す小さな例です。

plot(Rand(10,1))
xTicks=get(gca,'xTick');
yTicks=get(gca,'ytick');
set(gca, 'XMinorGrid','on', 'YMinorGrid','on',...
    'XColor','r', 'YColor','g','xticklabel',[],'yticklabel',[],...
    'box','off')

h2=axes;
set(h2,'color','none','xtick',linspace(0,1,numel(xTicks)),'xticklabel',xTicks,...
    'ytick',linspace(0,1,numel(yTicks)),'yticklabel',yTicks)

enter image description here

3
abcd

これにより、外側のボックスを上書きせずに、XとYの主グリッド線と副グリッド線に独立した色を設定できます。さらに良いことに、後続のlegend()コマンドは、手動で描画されたグリッド線ではなく、プロット線を取得します。

コツは、Axesのコピーを作成してから、Figureの描画階層でそれらの順序を逆にすることです。軸の各コピーは、独自のグリッドの色とスタイルのセットを描画できます。

この戦略は、subplot()およびprint()と互換性があります。

function gridcolor(majorX, majorY, minorX, minorY)

ax1 = gca;   %# get a handle to first axis

%# create a second transparent axis, same position/extents, same ticks and labels
ax2 = copyobj(ax1,gcf);
ax3 = copyobj(ax1,gcf);

delete(get(ax2,'Children'));
delete(get(ax3,'Children'));

set(ax2, 'Color','none', 'Box','off','YTickLabel',[],'YTickLabel',[],...
    'GridLineStyle', '-',...
    'XGrid','on','YGrid','on',...
    'XMinorGrid','off','YMinorGrid','off',...
    'XColor',majorX,'YColor',majorY);
set(ax3,'Box','off','YTickLabel',[],'YTickLabel',[],...
    'MinorGridLineStyle','-',...
    'XGrid','off','YGrid','off',...
    'XMinorGrid','on','YMinorGrid','on',...
    'XColor',minorX,'YColor',minorY);

set(ax1, 'Color','none', 'Box','on')

handles = [ax3; ax2; ax1];
c = get(gcf,'Children');
for i=1:length(handles)
    c = c(find(c ~= handles(i)));
end
set(gcf,'Children',[c; flipud(handles)]);

linkaxes([ax1 ax2 ax3]);
end

subplot(211);semilogx([1:4000]);gridcolor('r','g','c','b');
subplot(212);semilogx(([1:4000]).^-1);gridcolor('r','g','c','b');

Screenshot demonstrating gridcolor()

2
Shanti