如何创建指数图

How to create exponential graph

我怎样才能使 x 轴在每次增量时加倍?我想要 0、128、256、512、1024 和 2048 之间的距离相等。我该怎么做?

我正在尝试从我测量时间并在每个增量中将内存大小加倍的基准绘制点。

您可以使用线性轴作弊和绘图,例如从 1 到您想要的任意数量的数字,然后在完成后更改标签。您可以使用 'xtick' 属性 设置图表上保留的水平刻度值,并使用 'xticklabel' 属性 将标签更改为您想要的值。

labels = [0 128 256 512 1024 2048]; % Provide your labels here
x = 1 : numel(labels);
y = rand(1, numel(x)); % Insert your data here
plot(x, y, 'b.'); % Plot your data

set(gca, 'xtick', x); % Change the x-axis so only the right amount of ticks remain
set(gca, 'xticklabel', labels) % Change the labels to the desired ones

我得到了下图。请注意,我正在绘制的数据是完全随机的,因为我没有您的数据,但我想展示更改后的图的样子:

有关您可以在图形上更改的更多属性,请参阅 Axes Properties page on the Octave docs

向 Rayryeng 道歉,因为我本质上是在提出相同的方法,但我觉得它缺少重要信息,例如如何首先将轴本身转换为等距间隔,而不会弄乱与数据。所以这里有一个完整的解决方案,例如数据 X 与 Y,为基数 2 生成 semilogx 的等价物。

Y = 1 : 10;
X = 2 .^ Y;

XTicks = log2(X);
XTickLabels = {};
for XTick = XTicks
  XTickLabels{end+1} = sprintf('2^{%d}', XTick);
end

plot (log2 (X), Y);
set(gca, 'xtick', XTicks, 'xticklabel', XTickLabels);

请注意,如果您打算 'superimpose' 在此之上绘制另一个图,则必须考虑 X 轴中的 实际 值是本质上是“1、2、3、... 10”,因此在通过 hold on 叠加之前,也 "log-ify" 新图的 X 轴值,或者完全绘制到另一组独立的轴上,并且将它们放在相同的位置。

注意:我假设您使用以 2 为底的对数 x 轴。如果您 do 实际上希望 0-128 区间与 128-256 区间相同,则按照 Rayrengs 的回答修改 --- 甚至更好,使用更合适的图表,像条形图! (即 'powers-of-two' 纯粹用作每列的描述性标签)