GNU Octave Matlab:绘图刻度标签

3
我正在制作一个频率图,并希望在刻度标签方面得到一些帮助。 这是我目前的内容: 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上的线条更粗/更黑?
3个回答

3

在MATLAB中

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

添加以下代码可将刻度转换为第一部分中建议的新名称/格式。对于第二部分,目前我找到的最好的办法是加粗特定数字,而不是特定的刻度线。这里的\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吗?但我不知道这是否可以实现以及如何实现。 - lucullus
1
看起来你从另一个用户那里得到了一个惊人的答案,该用户使用了稍微自动化的方法。对于要加粗特定的线条/刻度,我仍然不确定如何做。如果要使所有刻度变粗,可以通过使用set(gca,'linewidth',1);设置当前轴线宽来解决问题。我在我的答案中添加了一个代码片段来更改网格可见性。 - MichaelTr7

3

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

老实说,我不会依赖LaTeX的花招来做这个。
这是我通常做类似事情的方式。
有效地,由于轴标签对象被认为是单个对象,您无法将其分成部分,技巧是叠加一个无形的、最少的轴对象,仅定义您想要的标签,并将其视为您所希望的那样处理(例如,调整其字体重量,字体大小,x颜色等等)。

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, 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', '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 );

这种“透明轴对象层次”技术通常非常有用,它可在设计复杂图表时提供很大的灵活性。:)


谢谢Taso! :) 非常优雅的解决方案!你知道如何使这些刻度线更黑吗?你能看一下我的下一个答案,告诉我你认为这是一个好方法吗?谢谢!(关于网格线的部分) - lucullus
1
@lucullus,与上面完全相同的方法:由于这些网格线只会出现在“特殊”刻度所在的位置,因此您只需将该轴层的“所有”网格线样式设置为黑色即可。实际上,我不得不“作弊”才能使它们看起来与其他层相同。我将更新我的示例以向您展示差异。 - Tasos Papastylianou

1
我是这样做的:

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 = {'\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,'xtick',scale,'xticklabel',X_Scale_Names);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接