具有对数对数缩放比例的 pcolor 的小刻度
Minor ticks for pcolor with log-log scaling
下面的代码几乎完全符合我的要求 (MATLAB R2010a)
[x,y] = meshgrid(logspace(-1,1,5),logspace(0,7,5));
pcolor(x,y,x.*y); shading interp;
set(gca, 'XScale', 'log', 'YScale', 'log');
set(gca,'YMinorTick','on');
set(gca,'Layer','top');
它制作的绘图中没有显示网格线,但主要和次要刻度线都可见。但是,当我用
替换第一行时
[x,y] = meshgrid(logspace(-1,1,10),logspace(0,7,10));
(也就是说,当我提高分辨率时)小刻度线突然消失了。那么,如何在大型数据集的 pcolor 图上使用对数标度的次要刻度线?
Matlab 不提供对次要网格和刻度的太多控制。您可以打开或关闭它们的可见性(显然您已经受到限制),但您不能设置它们的 value/position/number 等 ...
解决方法是完全关闭保存 pcolor
绘图的轴上的所有刻度和网格,然后在其顶部创建一个透明的空 axes
,具有网格属性你定义的。
因为在这个空 axes
中没有绘图或其他图形对象,Matlab 在您设置的属性方面会表现得更好(它不会试图变得聪明并在后台更改一些东西).
所以对于你的情况,应该是这样的:
[x,y] = meshgrid(logspace(-1,1,10),logspace(0,7,10));
pcolor(x,y,x.*y); shading interp;
colormap(flipud(gray(64))) %// just so the grid lines are more visible
axbot = gca ; %// retrieve the handle of the current axis
set(axbot, 'XScale', 'log', 'YScale', 'log');
axis off %// remove all ticks/grid etc...
%// now create the "overlay" axes, which replicate some of the properties of the underlying axis (position/limits etc ...)
axtop = axes('Position',get(axbot,'Position'),'Color','none',...
'Xlim',get(axbot,'XLim'), 'Ylim',get(axbot,'YLim'),...
'XScale', 'log', 'YScale', 'log' , ...
'YMinorTick','on' , 'YMinorGrid','off') ;
请注意,一些属性只是从底层 axes
复制而来,而另一些属性是明确设置的(如 YMinorTick
和 YMinorGrid
)。
这将绘制:
如果您也想显示 Y 小网格,只需将 YMinorGrid
更改为 on
。
如果你也想要右边的Y刻度标记,你只需要重复同样的事情(几乎)。添加另一个轴,这次将 XAxisLocation
指定为 Top
,将 YAxisLocation
指定为 right
。
axtopright = axes('Position',get(axbot,'Position'),'Color','none',...
'Xlim',get(axbot,'XLim'), 'Ylim',get(axbot,'YLim'),...
'XScale', 'log', 'YScale', 'log' , ...
'YMinorTick','on' , 'YMinorGrid','off' , ...
'XAxisLocation', 'Top','YAxisLocation','right' ) ;
下面的代码几乎完全符合我的要求 (MATLAB R2010a)
[x,y] = meshgrid(logspace(-1,1,5),logspace(0,7,5));
pcolor(x,y,x.*y); shading interp;
set(gca, 'XScale', 'log', 'YScale', 'log');
set(gca,'YMinorTick','on');
set(gca,'Layer','top');
它制作的绘图中没有显示网格线,但主要和次要刻度线都可见。但是,当我用
替换第一行时[x,y] = meshgrid(logspace(-1,1,10),logspace(0,7,10));
(也就是说,当我提高分辨率时)小刻度线突然消失了。那么,如何在大型数据集的 pcolor 图上使用对数标度的次要刻度线?
Matlab 不提供对次要网格和刻度的太多控制。您可以打开或关闭它们的可见性(显然您已经受到限制),但您不能设置它们的 value/position/number 等 ...
解决方法是完全关闭保存 pcolor
绘图的轴上的所有刻度和网格,然后在其顶部创建一个透明的空 axes
,具有网格属性你定义的。
因为在这个空 axes
中没有绘图或其他图形对象,Matlab 在您设置的属性方面会表现得更好(它不会试图变得聪明并在后台更改一些东西).
所以对于你的情况,应该是这样的:
[x,y] = meshgrid(logspace(-1,1,10),logspace(0,7,10));
pcolor(x,y,x.*y); shading interp;
colormap(flipud(gray(64))) %// just so the grid lines are more visible
axbot = gca ; %// retrieve the handle of the current axis
set(axbot, 'XScale', 'log', 'YScale', 'log');
axis off %// remove all ticks/grid etc...
%// now create the "overlay" axes, which replicate some of the properties of the underlying axis (position/limits etc ...)
axtop = axes('Position',get(axbot,'Position'),'Color','none',...
'Xlim',get(axbot,'XLim'), 'Ylim',get(axbot,'YLim'),...
'XScale', 'log', 'YScale', 'log' , ...
'YMinorTick','on' , 'YMinorGrid','off') ;
请注意,一些属性只是从底层 axes
复制而来,而另一些属性是明确设置的(如 YMinorTick
和 YMinorGrid
)。
这将绘制:
如果您也想显示 Y 小网格,只需将 YMinorGrid
更改为 on
。
如果你也想要右边的Y刻度标记,你只需要重复同样的事情(几乎)。添加另一个轴,这次将 XAxisLocation
指定为 Top
,将 YAxisLocation
指定为 right
。
axtopright = axes('Position',get(axbot,'Position'),'Color','none',...
'Xlim',get(axbot,'XLim'), 'Ylim',get(axbot,'YLim'),...
'XScale', 'log', 'YScale', 'log' , ...
'YMinorTick','on' , 'YMinorGrid','off' , ...
'XAxisLocation', 'Top','YAxisLocation','right' ) ;