我正在尝试调整x轴的比例以使值更接近,但我无法这样做。
我需要输出像这张照片:
然而,我实际得到的是下面的照片:
以下是我为重现此错误而编写的代码:
x = [0.1 1 10 100 1000 10000];
y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016];
figure;
bar(x,y);
ylabel('Y values');
xlabel('X values');
set(gca,'XTick', [0.1 1 10 100 1000 10000])
如何调整x轴以使其看起来像第一张照片?
答案 0 :(得分:4)
因为您的数据具有如此巨大的动态范围,并且由于x
轴的线性行为,您的图形自然会出现这样的情况。我建议的一个折衷方案是,您转换x
数据,以便将其映射到较小的比例,然后重新映射您的x
数据,使其落在一个小的指数规模。之后,只需使用此重新映射的比例绘制数据,然后重命名x
刻度,使它们具有与x
数据相同的值。为此,我先取log10
个数据,然后对这些数据应用指数。通过这种方式,您可以将x
坐标缩放到较小的动态范围。当您将指数应用于此较小范围时,x
坐标将逐渐展开,x
的值越高,值x
的值越大越好x = [0.1 1 10 100 1000 10000]; %// Define data
y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016];
xplot = (1.25).^(log10(x)); %// Define modified x values
figure;
bar(xplot,y); %// Plot the bar graph on the modified scale
set(gca,'XTick', xplot); %// Define ticks only where the bars are located
set(gca,'XTickLabel', x); %// Rename these ticks to our actual x data
-axis,但不会像你在原始情节中看到的那样遥远。
因此,尝试这样的事情:
x
这就是我得到的:
请注意,您必须使用指数的基数,即我所做的1.25,以适应您的数据。显然,x
数据的动态范围越大,越小此指数就必须使数据彼此更接近。
根据您的评论,您希望条形在相邻条形之间是等距的。因此,您只需将x
轴线性调整为小范围,从...说... 1到x
值的总数。然后,我们应用相同的逻辑来重新命名x
轴上的刻度,以便它们来自真正的xplot
值。因此,您只需要更改一行,即x = [0.1 1 10 100 1000 10000]; %// Define data
y = [1.9904 19.8120 82.6122 93.0256 98.4086 99.4016];
xplot = 1:numel(x); %// Define modified x values
figure;
bar(xplot,y); %// Plot the bar graph on the modified scale
set(gca,'XTick', xplot); %// Define ticks only where the bars are located
set(gca,'XTickLabel', x); %// Rename these ticks to our actual x data
。其他行应该保持不变。因此:
{{1}}
这就是我得到的: