微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GNU Octave Matlab:绘制刻度标记 Octave 方法可能也适用于 matlab

如何解决GNU Octave Matlab:绘制刻度标记 Octave 方法可能也适用于 matlab

我正在制作频率图,我需要刻度标记方面的帮助。 这是我所拥有的:

Frequency plot

semilogx([200,1000,5000],[0,6,0]);
xlim([20 20000]);
sc = [20:10:100,125:25:175];
scale = [sc,sc*10,sc*100,20000];
xticks(scale);
xticklabels(scale);
set(gca,'XMinorTick','Off')
grid on;
set (gca,"xminorgrid","off")
xlabel('frequency (Hz)');
ylabel('dB');
  1. 如何使 1000 及以上的所有数字显示为 1K、2K、5K 等?
  2. 如何使 50,100,200,500,1K,2K,5K,10K 上的线条显得更粗/更黑?

解决方法

在 MATLAB 中

*不幸的是,我还没有找到如何加粗特定行

添加以下代码允许将刻度转换为第 1 部分中建议的新名称/格式。对于第 2 部分,我现在能找到的最好的方法是将特定数字加粗,不幸的是不是特定的刻度/行。此处 \bf 表示要加粗的标签。所有名称都将对应于您的轴向量 scale 最初设置的位置。下面代码中的最后一行表示替换当前轴,gca

Customized Axes

semilogx([200,1000,5000],[0,6,0]);
sc = [20:10:100,125:25:175];
scale = [sc,sc*10,sc*100,20000];

Current_Axis = gca;
Current_Axis.XMinorTick = 'off';
xlabel('frequency (Hz)'); ylabel('dB');
xlim([20 20000]);
grid on;

X_Scale_Names = {'\bf20'; '30'; '40'; '\bf50'; '60';
'70';'80';'90';'\bf100';'125';'150';'175';'\bf200';'300';'400';
'500';'600';'700';'800';'900';'\bf1K';'1.25K';'1.5K';'1.75K';
'\bf2K';'3K';'4K';'\bf5K';'6K';'7K';'8K';'9K';'\bf10K';'12.5K';'15K';
'17.5K';'20K'};

要调整更多网格和轴属性:

Current_Axis = gca;
set(Current_Axis,'xtick',scale,'xticklabel',X_Scale_Names);
Current_Axis.LineWidth = 1;
Current_Axis.GridColor = 'k';
Current_Axis.GridAlpha = 0.5;

使用 MATLAB R2019b 运行

,

Octave 方法(可能也适用于 matlab)

老实说,我不会依靠乳胶诡计来做到这一点。
这是我通常做这样的事情的方式。
实际上,因为轴标签对象被视为单个对象,并且您不能将其拆分为多个部分,所以诀窍是覆盖一个不可见的、最小的轴对象,仅定义您想要的标签,并按照您的意愿处理这些标签(例如调整它的字体粗细、字体大小、xcolor 等)。

H = semilogx([200,0]);
A = gca();
B = axes();

subscale = [20:10:100,125:25:175];
scale    = [subscale,subscale * 10,subscale * 100,20000];

ScaleTextLabels = {};
for i = 1 : length( scale )
    if scale(i) >= 1000,ScaleTextLabels{i} = sprintf("%dk",scale(i) / 1000 );
    else,ScaleTextLabels{i} = num2str( scale(i) );
    end
end

SpecialTickLabels   = { '50','100','200','500','1k','2k','5k','10k'};
ScaleIndices        = 1 : length( ScaleTextLabels );
SpecialIndices      = nthargout( 2,@ismember,SpecialTickLabels,ScaleTextLabels );
NormalIndices       = setdiff( ScaleIndices,SpecialIndices );

set( A,'xgrid','on','xlabel','frequency (Hz)','xlim',[20 20000],'xminorgrid','off','xminortick',ScaleTextLabels(NormalIndices),scale(NormalIndices),'ylabel','dB','gridlinestyle',':','gridcolor','k','gridalpha',0.5 );
set( B,'',get( A,'xlim' ),ScaleTextLabels(SpecialIndices),scale(SpecialIndices),'color','none','fontsize',12,'fontweight','bold','position','position'),'xcolor',0],'xscale','log','ylim','ylim'),'ytick',[],'--',0.8 );

这种“透明轴对象层”技术在一般情况下非常有用,它在设计复杂图形时提供了极大的灵活性。 :)

,

我是这样做的:

semilogx([200,0]);
xlim([20 20000]);
sc = [20:5:35,40:10:100,20000];
xticks(scale);
xticklabels(scale);
set(gca,'XMinorTick','Off')
grid on;
set(gca,':');
set(gca,0.6);
set (gca,"xminorgrid","off");
xg = [50,100,200,500,2000,5000,10000]; #highlight grids
xx = reshape([xg;xg;NaN(1,length(xg))],1,length(xg)*3);
yy = repmat([ylim() NaN],length(xg));
line(xx,yy,'Color',[0.65,0.65,0.65]);
xlabel('frequency (Hz)');
ylabel('dB');
X_Scale_Names = {'\fontsize{11}\bf20'; '25'; '30';'35';'40'; '\fontsize{11}\bf50'; '60';
'70';'80';'90';'\fontsize{11}\bf100';'125';'150';'175';'\fontsize{11}\bf200';'250';'300';'350';'400';
'\fontsize{11}\bf500';'600';'700';'800';'900';'\fontsize{11}\bf1K';'1.25K';'1.5K';'1.75K';
'\fontsize{11}\bf2K';'2.5K';'3K';'3.5K';'4K';'\fontsize{11}\bf5K';'6K';'7K';'8K';'9K';'\fontsize{11}\bf10K';'12.5K';'15K';
'17.5K';'\fontsize{11}\bf20K'};
set(gca,X_Scale_Names);

但我不认为这是最好/最快/最简单的方法...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。