GNU Octave Matlab:绘制刻度标记

Posted

技术标签:

【中文标题】GNU Octave Matlab:绘制刻度标记【英文标题】:GNU Octave Matlab: Plot tick labeling 【发布时间】:2021-04-11 14:21:26 【问题描述】:

我正在制作一个频率图,我想要一些关于刻度标记的帮助。 这是我所拥有的:

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');
    如何使 1000 及以上的所有数字显示为 1K、2K、5K 等? 如何使 50,100,200,500,1K,2K,5K,10K 上的线条显得更粗/更黑?

【问题讨论】:

【参考方案1】:

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

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

H = semilogx([200,1000,5000], [0,6,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, ScaleTextLabelsi = sprintf("%dk", scale(i) / 1000 );
    else,                ScaleTextLabelsi = 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', 'off', 'xticklabel', ScaleTextLabels(NormalIndices),  'xtick', scale(NormalIndices) , 'ylabel', 'dB', 'gridlinestyle', ':', 'gridcolor', 'k', 'gridalpha', 0.5 );
set( B, 'xgrid', 'on', 'xlabel', ''              , 'xlim', get( A, 'xlim' ), 'xminorgrid', 'off', 'xminortick', 'off', 'xticklabel', ScaleTextLabels(SpecialIndices), 'xtick', scale(SpecialIndices), 'ylabel', ''  , 'color', 'none', 'fontsize', 12, 'fontweight', 'bold', 'position', get( A, 'position'), 'xcolor', [0,0,0], 'xscale', 'log', 'ylim', get( A, 'ylim'), 'ytick', [], 'gridlinestyle', '--', 'gridcolor', 'k', 'gridalpha', 0.8 );

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

【讨论】:

谢谢塔索! :) 非常优雅的解决方案!你知道有什么方法可以让那些刻度上的网格线变黑吗?您能否看看我的下一个答案,看看我是如何发现它的,并告诉我您是否认为这是一个好方法?谢谢! (关于网格线的部分) @lucullus 与上述方法完全相同:由于这些网格线只会出现在“特殊”刻度所在的位置,因此您只需将该轴层的“所有”网格线样式设置为黑色。事实上,我不得不“作弊”以使它们看起来与另一层相同。我将更新我的示例以向您展示差异。【参考方案2】:

在 MATLAB 中

*很遗憾,我还没有找到如何将特定行加粗

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

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 运行

【讨论】:

感谢您的努力! :) 它有助于!我想让刻度线和网格线更黑。我想知道是否有任何方法可以自动化该过程,而不必键入所有标签。如果比例数字 >= 1000,则可能将比例数字除以 1000然后将它们转换为字符串并在它们后面添加一个 K?但我不知道这是否可以做到以及如何.. 看起来您从另一个使用稍微自动化的方法的用户那里得到了惊人的答案。对于更大胆的特定线条/刻度,我仍然不知道该怎么做。使用set(gca,'linewidth',1); 设置当前轴的线宽可以使所有刻度更粗。我在答案中添加了代码 sn-p 以更改网格可见性。【参考方案3】:

我是这样做的:

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

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

【讨论】:

以上是关于GNU Octave Matlab:绘制刻度标记的主要内容,如果未能解决你的问题,请参考以下文章

带有厚框的 GNU Octave 人物

给轴和刻度线标记优先于绘制线

在对数轴刻度中设置指数符号 - Matlab

[ML] Octave 简单操作

Ubuntu通过源代码编译安装Octave 4.0

在 MATLAB 中绘制频率响应,x 轴为对数刻度