【发布时间】:2019-07-22 08:52:52
【问题描述】:
对于 Matlab 图中的某些 x 值,是否有(手动或自动)方法可以切割 y 轴的几个部分?我找到了其他编程语言的解决方案(请参阅下面的 2 个链接),但不适用于 Matlab,除了 File Exchange 上的 BreakAxis 和 BreakYaxis,但这仅适用于一次休息。
我也在下面发布我的代码,我想为此实现它。我想为每个 yNegData 和 yPosData 设置一个 y 轴中断,即两个中断,分别在 [0.3*min(yNegData) 0.7*min(yNegData] 和 [0.3*max(yPosData) 0.7*max(yPosData]。
如果你能以一种我可以将它用于不同类型的图(例如,不仅是条形图,还有线图)的方式编写它,那将非常有用。
http://lagrange.univ-lyon1.fr/docs/matplotlib/examples/pylab_examples/broken_axis.html
Using gnuplot, how to 'cut out' usused y-axis regions of the graph
代码:
revenue = ones(100,1);
opex = -1*ones(100,1);
opex(10:15,1) = 3;
data{1} = revenue;
data{2} = opex;
colors = parula(numel(data));
labels = {'Revenue','Opex'};
for i = 1:numel(data)
dataNeg{i} = data{i};
dataNeg{i}(data{i}>0) = 0;
dataPos{i} = data{i};
dataPos{i}(data{i}<0) = 0;
mdata(i) = nnz(dataPos{i}); % was: mean(data{i});
end
[~,posOrder] = sort(mdata,'ascend');
[~,negOrder] = sort(mdata,'descend');
yDataPos = [dataPos{posOrder}];
yDataNeg = [dataNeg{negOrder}];
hold on;
bNeg = bar(yDataNeg,'stack');
bPos = bar(yDataPos,'stack');
for i= 1:numel(data)
set(bNeg(i),'FaceColor',colors(negOrder(i),:))
set(bPos(i),'FaceColor',colors(posOrder(i),:))
end
legend(labels{:});
hold off;
【问题讨论】:
-
为什么要断轴?在科学中它不经常使用,因为它会扭曲峰之间的视觉比例,例如由于切割 y 轴,您提供的第一个链接中的两个峰值看起来要小得多,从而导致数据的误传。为什么不使用对数图呢?
-
不完全是重复的,但您可以从这个问题和我的回答中获得灵感:Multiple axis breaks
-
@Adriaan
<-这 x10。如果您的图表没有清楚地显示您的数据,请使用不同的图表,不要让它不太清楚! -
@LenaH 那么可能制作三个子批次,即每个“剪切”部分一个,会更有意义吗?然后,如果您希望它们彼此靠近,您可以调整子图之间的距离。参见例如this answer
-
您应该永远剪切条形图。条形图对条形高度中的值进行编码。条形必须从 0 开始,并且不能被切断才能实现。切割条形图是欺骗读者的好方法。所有带有切口的轴都是坏的,但在条形图中它确实是坏的。您需要找到一种更好的方式来显示您的数据。如果您分享您想要展示的数据,我可以帮助您找到展示它的好方法。