【问题标题】:How to cut out parts of the y-axis for certain x-values in Matlab plots如何在 Matlab 图中为某些 x 值剪掉 y 轴的一部分
【发布时间】:2019-07-22 08:52:52
【问题描述】:

对于 Matlab 图中的某些 x 值,是否有(手动或自动)方法可以切割 y 轴的几个部分?我找到了其他编程语言的解决方案(请参阅下面的 2 个链接),但不适用于 Matlab,除了 File Exchange 上的 BreakAxisBreakYaxis,但这仅适用于一次休息。

我也在下面发布我的代码,我想为此实现它。我想为每个 yNegDatayPosData 设置一个 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 &lt;- 这 x10。如果您的图表没有清楚地显示您的数据,请使用不同的图表,不要让它不太清楚!
  • @LenaH 那么可能制作三个子批次,即每个“剪切”部分一个,会更有意义吗?然后,如果您希望它们彼此靠近,您可以调整子图之间的距离。参见例如this answer
  • 您应该永远剪切条形图。条形图对条形高度中的值进行编码。条形必须从 0 开始,并且不能被切断才能实现。切割条形图是欺骗读者的好方法。所有带有切口的轴都是坏的,但在条形图中它确实是坏的。您需要找到一种更好的方式来显示您的数据。如果您分享您想要展示的数据,我可以帮助您找到展示它的好方法。

标签: matlab plot axis


【解决方案1】:

有这个包

https://nl.mathworks.com/matlabcentral/fileexchange/45760-break-y-axis

适用于线条;它有一个小例子

a=20*rand(21,1)+10;
figure;hold on;
plot(a);
breakyaxis([14 21]);
% hold off %% I guess, inserted by me

但是,它似乎不适用于条形图 - 如果在上面的示例中将 plot(a) 替换为 bar(a),则分割条纹不会覆盖轴的宽度。我敢肯定,它可以进行调整,但这可能不值得付出努力。

如果您可以切换到 R,您可以使用 plotrix 包中的 gap.barplot()(参见 this example),您仍然可以切换到 gnuplot(参见 this example)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多