我正在尝试根据跳转后的图绘制双底x轴:

它是一个小时数的半对数图,带有额外的特定刻度,分别代表分钟,几个月和几年。如何创建这些额外的价格变动?

最佳答案

您可以使用Victor May的方法来覆盖辅助轴,但这需要更多的调整才能真正起作用。

首先,让我们重新创建基本图:

clear, close
time = [1/60, 1, 24, 24*7, 24*30, 24*30*6, 24*365, 24*365*10];
r = [110, 90, 80, 75, 70, 65, 63, 60];

% plot the data
semilogx(time, r, 'o-')

% adjust ticks and format of primary axes
xlim([0.005 1e6])
ylim([0 140])
tick = 10 .^ (-2 : 6);
set(gca, 'XTick', tick)
set(gca, 'XTickLabel', arrayfun(@num2str, tick, 'UniformOutput', false))
set(gca, 'XMinorTick', 'off')
set(gca, 'TickDir', 'out')

仅当辅助轴的位置,大小,轴限制和比例类型与主轴相同且背景透明时(否则数据被隐藏),才可以覆盖辅助轴:
% put matching secondary axes on top with transparent background
pos = get(gca, 'Position');
axes('Position', pos)
set(gca, 'Color', 'none')
xlim([0.005 1e6])
ylim([0 140])
set(gca, 'XScale', 'log')
set(gca, 'XMinorTick', 'off')
set(gca, 'TickDir', 'out')

给它适当的刻度和刻度标签
% adjust ticks
set(gca, 'YTick', [])
set(gca, 'XTick', time)
label = {'1 min', '1 hour', '24 hours', '1 week', '1 month', '6 months', '1 year', '10 years'};
set(gca, 'XTickLabel', label)

结果是

–并不是我们真正想要的。

通过技巧,我们可以让辅助轴的刻度线和刻度线标签进入内部...
% tinker with it
set(gca, 'XAxisLocation', 'top')
pos(4) = eps * pos(4);
set(gca, 'Position', pos)

...但是那仍然不是我们真正想要的。

另一种策略:我们不要重叠坐标轴,而要把额外的刻度线放进去!
label = {'1 min', '1 hour', '24 hours', '1 week', '1 month', '6 months', '1 year', '10 years'};
line([time', time'], [0 2], 'Color', 'k')
text(time, 4 * ones(size(time)), label, 'Rotation', 90, 'VerticalAlignment', 'middle')

结果

仍然不是完美的,但仍然可以使用。

10-06 13:52