yejet 发表于 2005-6-24 10:18

改变grid颜色/线宽的函数

function gridcolor(xc,yc);
% GRIDCOLOR change the color of the axes
% xc is the color of x-axes direction
% yc is the color of y-axes direction
% Example:
% plot(1:10); grid on; gridcolor('r','b');
% Author's email:zjliu2001@163.com
% See also grid,plot,title,xlabel.
if nargin==0, xc='k';yc='k';
elseif nargin==1; yc=xc;
   if ~strcmp('char',class(xc)); error('the class of xc must char!'); end
elseif nargin==2;
   if ~strcmp('char',class(xc)); error('the class of xc must char!'); end
   if ~strcmp('char',class(yc)); error('the class of yc must char!'); end
elseif nargin==3;
   error('this program is applied to 2-D axes!');
end
xs=get(gca,'xgrid'); ys=get(gca,'ygrid');
if strcmp(xs,'on')
   hold on; set(gca,'xgrid','off'); changeC(xc,'x'); hold off;
end
if strcmp(ys,'on')
   hold on; set(gca,'ygrid','off'); changeC(yc,'y'); hold off;
end

function changeC(zc,ss);
if ss~='x' & ss~='y', error('ss must "x" or "y"!'); end
S=; Da=get(gca,S); Li=get(gca,);
if ss=='x'
   for k=2:length(Da)-1, plot(,Li,':','color',zc); end
else
   for k=2:length(Da)-1, plot(Li,,':','color',zc); end
end

[ 本帖最后由 ChaChing 于 2010-2-12 10:42 编辑 ]

yejet 发表于 2005-6-24 11:25

改变grid线宽的函数

在紫丁香站发现有人提出这个问题,zjliu 使用plot函数栽了一个小函数,来实现改变grid线宽。程序如下:
function =gridxy(linewidth,xy);
% GRIDXY add grid to the axes
% linewidth is the width of grid's line;
% xy defines grid's direction
% Example:
% plot(1:10); =gridxy(,'xy');
% Author's email:zjliu2001@163.com
% See also grid,plot,gca
xk=get(gca,'xtick'); yk=get(gca,'ytick'); xl=xlim; yl=ylim; hold on;
if nargin==1, xy='x'; end
if xy=='x', hx=plotx(xk,xl,yl,linewidth(1)); hy=[];
elseif xy=='y'; hy=ploty(yk,xl,yl,linewidth(end)); hx=[];
else hx=plotx(xk,xl,yl,linewidth(1)); hy=ploty(yk,xl,yl,linewidth(end));
end
hold off;
function H=plotx(xk,xl,yl,linewidth);
H=[];
for k=1:length(xk); if xk(k)~=xl(1)&xk(k)~=xl(end);
   h=plot(,yl,'k:','linewidth',linewidth); H=;
end; end
function H=ploty(yk,xl,yl,linewidth);
H=[];
for k=1:length(yk); if yk(k)~=yl(1)&yk(k)~=yl(end);
   h=plot(xl,,'k:','linewidth',linewidth); H=;
end; end



[ 本帖最后由 ChaChing 于 2010-2-12 13:43 编辑 ]

ChaChing 发表于 2010-2-12 13:46

整理下老帖, 顺便修改练习下!

function GridColor(xc,yc)
% GRIDCOLOR change the color of the axes
% xc/yc is the color of x/y-axes direction
% Example: plot(1:10); grid on; GridColor('r','b');
if nargin==0, xc='k';yc='k';
elseif nargin==1, yc=xc;
   if ~ischar(xc), error('the class of xc must char!'); end
elseif nargin==2,
   if ~ischar(xc), error('the class of xc must char!'); end
   if ~ischar(yc), error('the class of yc must char!'); end
else error('this program is applied to 2-D axes!'); end
hold on; set(gca,'xgrid','off'); set(gca,'ygrid','off');
changeC(xc,'x'); changeC(yc,'y'); hold off;
function changeC(zc,ss)
if ss~='x' & ss~='y', error('ss must "x" or "y"!'); end
S=; Da=get(gca,S); Li=get(gca,);
if ss=='x'
   for k=2:length(Da)-1, plot(,Li,':','color',zc); end
else
   for k=2:length(Da)-1, plot(Li,,':','color',zc); end
end


function =GridXY(linewidth,xy)
% GRIDXY add grid to the axes
% linewidth is the width of grid's line; xy defines grid's direction
% Example: plot(1:10); =GridXY(,'xy');
xk=get(gca,'xtick'); yk=get(gca,'ytick'); xl=xlim; yl=ylim; hold on;
if nargin==1, xy='x'; end
if xy=='x', hx=plotx(xk,xl,yl,linewidth(1)); hy=[];
elseif xy=='y', hy=ploty(yk,xl,yl,linewidth(end)); hx=[];
else hx=plotx(xk,xl,yl,linewidth(1)); hy=ploty(yk,xl,yl,linewidth(end));
end; hold off;
function H=plotx(xk,xl,yl,linewidth)
H=[];
for k=1:length(xk), if xk(k)~=xl(1) & xk(k)~=xl(end),
   h=plot(,yl,'k:','linewidth',linewidth); H=;
end; end
function H=ploty(yk,xl,yl,linewidth)
H=[];
for k=1:length(yk), if yk(k)~=yl(1) & yk(k)~=yl(end),
   h=plot(xl,,'k:','linewidth',linewidth); H=;
end; end

penghust 发表于 2010-3-27 23:59

如何调整Grid 线宽?

我现在需要设置 Box 'LineWidth=1.5' ;Grid 'LineWidth=0.5'
e=; n=;
plot(n,e); =gridxy(,'xy');

用这种方法得出的图像,在线性坐标下,可以在图像属性里任意设置 Box 的线宽。 但是如果我把坐标轴都改成对数坐标,所有的grid 都自动消失了?
再次在图像属性里添加 X 和Y 方向的Grid ,则不能单独设置Grid 线宽。 不知道大家能不能帮忙找一下原因! 谢谢各位!

我需要如下图形


[ 本帖最后由 ChaChing 于 2010-3-28 21:40 编辑 ]

ChaChing 发表于 2010-3-28 01:34

回复 地板 penghust 的帖子

试了下, 没问题!? LS怎调用函数? 出错代码?

penghust 发表于 2010-3-28 16:14

回复 5楼 ChaChing 的帖子

运行过程没有错误, 运行如下程序
e=; n=;
plot(n,e); =gridxy(,'xy');
得到的图像为线性坐标,X,Y方向Grid 线宽为 1,1
-----打开 'Proparty editor‘--axas'----
'X Axis' -- 'X Scale' 设为log---然后Y方向 Grid 自动消失
'Y Axis' -- 'Y Scale' 设为log---然后X方向 Grid 自动消失
然后打开 ‘More Properties’----- 'LineWidth'----设置为'1.5'--XGrid on--YGrid on
--得到的 X,Y方向Grid 线宽自动设置为 '1.5‘

[ 本帖最后由 ChaChing 于 2010-3-28 21:44 编辑 ]

penghust 发表于 2010-3-28 16:57

发现一个有趣的现象,运行3楼例子
Example: plot(1:10); =GridXY(,'xy');
然后将
'X Axis' -- 'X Scale' 设为log
'Y Axis' -- 'Y Scale' 设为log
X,Y方向Grid 并未消失
打开 ‘More Properties’----- 'LineWidth'----设置为'1.5',此时Box 线宽变为 1.5
X,Y方向Grid 线宽并未改变,仍然为0.5.

如果再运行
Example:plot(1:20);      [ hx,hy]=GridXY(,'xy');
然后将X,Y 坐标轴改为 对数坐标,在6楼所描述的现象再次出现。

ChaChing 发表于 2010-3-28 21:37

昨天我是这样用
e=;
n=;
loglog(n,e); =gridxy(,'xy');
个人很少使用那些面板(旧版没这些功能), LZ说的正在看看中!

[ 本帖最后由 ChaChing 于 2010-3-28 21:38 编辑 ]

penghust 发表于 2010-3-29 11:40

对上面的程序做了简单修改,现在可以实现任意设置 Box 和 Grid 线宽
e=;
n=;
loglog(n,e); =gridxy(,'xy');

function =gridxy(linewidth,xy)
% GRIDXY add grid to the axes
% linewidth is the width of grid's line; xy defines grid's direction
% Example: plot(1:10); =gridxy(,'xy');
xk=get(gca,'xtick'); yk=get(gca,'ytick'); xl=xlim; yl=ylim; hold on;
if nargin==1, xy='x'; end
if xy=='x', hx=plotx(xk,xl,yl,linewidth(1)); hy=[];
elseif xy=='y', hy=ploty(yk,xl,yl,linewidth(end)); hx=[];
else hx=plotx(xk,xl,yl,linewidth(1)); hy=ploty(yk,xl,yl,linewidth(end));
end; hold off;
function H=plotx(xk,xl,yl,linewidth)
H=[];
for k=1:length(xk), if xk(k)~=xl(1)                            %在此处做了修改
   mxk=xk(k-1):xk(k-1):xk(k);                                 %在相隔的两个刻度之间设置细分刻度 MiniGrid
   for kk=1:length(mxk)                                                
       h=plot(,yl,'k:','linewidth',linewidth); H=;   
   end                                                                     
end; end
function H=ploty(yk,xl,yl,linewidth)
H=[];
for k=1:length(yk), if yk(k)~=yl(1)                            %在此处做了修改
    myk=yk(k-1):yk(k-1):yk(k);                                  %在相隔的两个刻度之间设置细分刻度 MiniGrid
   for kk=1:length(myk)                                                   
       h=plot(xl,,'k:','linewidth',linewidth); H=;   
   end                                                                     
end; end

通过上面的程序,可以实现对 Grid 设置线宽,线型。修改了1楼的程序,可以实现在相隔刻度之间,设置细分刻度的功能。
谢谢 ChaChing的帮助:handshake

penghust 发表于 2010-3-29 16:12

回复 8楼 ChaChing 的帖子

ChaChing
你对句柄图形有研究没?
或者对句柄图形有研究的版内兄弟一起讨论一下。
是否可通过 get() ,set()对句柄图形对象进行设置?
关键是能否通过 get() 分别得到 Box 和 Grid 的句柄??
然后对 Box 和 Grid 的线宽进行单独设置?

rocwoods 发表于 2010-3-29 17:26

box和grid都是axes的属性,它和坐标轴是一体的,而非父子对象关系。grid 和box都和坐标轴连在一起了,硬要设置属性改动的话,坐标轴也会跟着改。譬如下面的代码:
plot(rand(100,1),rand(100,1),'*','color','k')
grid on
set(gca,'xcolor','r');
set(gca,'ycolor','b');
set(gca,'linewidth',5);
得到下面图形:

ChaChing 发表于 2010-3-30 00:52

help中有 Handle Graphics Property Browser!
好多可以更改!
页: [1]
查看完整版本: 改变grid颜色/线宽的函数