【问题标题】:Bar plot with two y axes带有两个 y 轴的条形图
【发布时间】:2019-06-01 22:53:39
【问题描述】:

我在 MATLAB 中有以下 2 个 y 轴的绘图代码。我很高兴 2 轴功能有效,但是,我想避免条形重叠。此外,右侧轴上的类别应该有不同的颜色,不仅是黄色,而且应该以某种方式清楚地表明它们是绘制在右侧轴上而不是左侧轴上。如何做到这一点?

EONMW = [100 399 500];
RWEMW = [200 996 120];
GermanByEON = [0.2 0.4 0.5];
GermanByRWE = [0.1 0.5 0.9];
EONGermanPortfolio = [0.7 0.2 0.1];
RWEGermanPortfolio = [0.8 0.3 0.6];
years = [2010 2012 2014];
% Plot
values1 = [EONMW; RWEMW]';
values2 = [GermanByEON; GermanByRWE; EONGermanPortfolio; RWEGermanPortfolio]';
years1 = [years; years]';
years2 = [years; years; years; years]';
figure;
bar(years1,values1);
ylabel('Utilities generation portfolio in MW')  
yyaxis right
bar(years2,values2);
legend('EON German portfolio in MW', 'RWE German portfolio in MW',...
    'Percentage of German portfolio by EON', 'Percentage of German portfolio by RWE',...
    'EON"s percentage of generation in Germany', 'RWE"s percentage of generation in Germany')
legend('Location','northwest')
ylabel('Utilities generation portfolio as percentages')  

【问题讨论】:

  • 好的,看看我的编辑!
  • 编辑使问题更清晰,但是从(个人)数据可视化的角度来看,您在一个图中有 3 个不同的指标这一事实非常不清楚......请考虑只使用 subplot ,您可以将数据拆分为堆叠图,以便它们在 x 轴上排列,但每个图的目的和内容更清晰。它还可以避免您陷入上述解决方法的困境,我不确定这对bar 来说是否容易。所有yyaxis right 条形图颜色相同的原因是您知道它们位于哪个轴上 - 否则您怎么知道?
  • 我不建议像这样绘制数据(即使使用@Dev-iL 的suggestion)。我看不出用 2 个 y 轴绘制这些条形图有什么好处,而不是使用 2 个垂直子图,年份对齐。如果它们无论如何都无法比较,为什么还要将它们绘制在一起?

标签: matlab plot bar-chart matlab-figure axis


【解决方案1】:

我同意这种情节有点难以阅读,但也许有办法稍微改善这种情况。

我更改的主要内容是添加不可见条(使用NaN),以便颜色顺序保持不变:

function q54071610
EONMW = [100 399 500];
RWEMW = [200 996 120];
GermanByEON = [0.2 0.4 0.5];
GermanByRWE = [0.1 0.5 0.9];
EONGermanPortfolio = [0.7 0.2 0.1];
RWEGermanPortfolio = [0.8 0.3 0.6];
years = [2010 2012 2014];
% Plot
values1 = [[EONMW; RWEMW].' NaN(3,4)];
values2 = [NaN(3,2) [GermanByEON; GermanByRWE; EONGermanPortfolio; RWEGermanPortfolio].'];
years1 = repmat(years.', [1,6]);
figure;
bar(years1,values1, 'EdgeColor', 'b', 'LineWidth', 2);
ylabel('Utilities generation portfolio in MW')  
yyaxis right
hB = bar(years1,values2, 'EdgeColor', 'r', 'LineWidth', 2);
c = lines(6);
for ind1 = 1:6
  hB(ind1).FaceColor = c(ind1, :);
end
legend('EON German portfolio in MW', 'RWE German portfolio in MW',...
    'Percentage of German portfolio by EON', 'Percentage of German portfolio by RWE',...
    'EON"s percentage of generation in Germany', 'RWE"s percentage of generation in Germany')
legend('Location','northwest')
ylabel('Utilities generation portfolio as percentages')

结果:

现在您应该解释一下,红框条属于右轴,而蓝框条属于左轴。

【讨论】:

  • 这很好,谢谢!唯一的问题:在图例中,条目仅显示为蓝色框架...
  • 是的,我注意到了这一点。不确定可以做什么(编辑图例条目应该是可能的,但可能很困难)。您可以做的可能是提前绘制另一个条形图,其中包含所有 NaN y 值,然后显示图例(条目周围将有黑色小框,如您的图像所示)。只需在figure; 之后添加bar(years1,NaN*values1); hold on;,看看结果是否适合您。
【解决方案2】:

我不确定这些条到底是什么意思,所以我可能错过了图中的要点(这可能是这里的主要问题)。但是,我发现这种呈现方式并不令人愉悦且具有误导性,因为读者需要付出很多努力才能理解哪个值属于哪个条形,什么是可比较的,什么不是。

我在这里的建议不是直接解决技术问题(您已经从@Dev-iL 获得),而是针对更基本问题的不同解决方案 - 如何可视化这些数据?我相信,如果我能理解这些数字代表什么(百分比?)以及你想用这个图强调什么,我可以找到一个更好的解决方案。

一、代码:

EONMW = [100 399 500];
RWEMW = [200 996 120];
GermanByEON = [0.2 0.4 0.5];
GermanByRWE = [0.1 0.5 0.9];
EONGermanPortfolio = [0.7 0.2 0.1];
RWEGermanPortfolio = [0.8 0.3 0.6];
years = [2010 2012 2014].';
values1 = [EONMW; RWEMW].';
values2 = [GermanByEON; GermanByRWE; EONGermanPortfolio; RWEGermanPortfolio].'*100;

% Plot
colMap = mat2cell(lines(2),[1 1],3); % Choose your favorite colors
figure(2);
% upper plot:
subplot 211
b = bar(years,values1);
set(b,{'FaceColor'},colMap)
xticklabels({}) % remove the years labels, the bottom axes will show them
ylabel('Utilities generation portfolio in MW')
legend('EON German', 'RWE German',...
    'Location','northwest')

% bottom plot
subplot 212
b = bar(years,values2);
set(b,{'FaceColor'},repmat(colMap,2,1)) % matching the colors by topic
set(b,{'FaceAlpha'},{1;1;0.6;0.6}) % distiguish between related mesures
xlabel('Year')
ylabel('Utilities generation portfolio (%)')
legend('German portfolio by EON', 'German portfolio by RWE',...
    'EON''s generation in Germany', 'RWE''s generation in Germany',...
    'Location','north')

结果:

我改变的主要内容:

  1. 按 y 轴的单位拆分条形,但按 x 轴对齐
  2. 匹配绘图之间相关条的颜色
  3. 缩短图例和标签

祝你好运!

【讨论】:

    【解决方案3】:

    最好将bar(x,y) 定义为b=bar(x,y) 然后控制b 的选项之一是b.FaceColor。看看下面的代码

    EONMW = [100 399 500];
    RWEMW = [200 996 120];
    GermanByEON = [0.2 0.4 0.5];
    GermanByRWE = [0.1 0.5 0.9];
    EONGermanPortfolio = [0.7 0.2 0.1];
    RWEGermanPortfolio = [0.8 0.3 0.6];
    years = [2010 2012 2014];
    x=0.2;
    % Plot
    values1 = [EONMW; RWEMW]';
    values2 = [GermanByEON; GermanByRWE; EONGermanPortfolio; RWEGermanPortfolio]';
    years1 = [years; years]';
    years2 = [years; years; years; years]';
    figure;
    b1=bar(years1,values1,x*0.66);
    ylabel('Utilities generation portfolio in MW')  
    yyaxis right
    b2=bar(years2,values2,x);
    %%%%%%%%%%%%
    %%%%%%%%%%%%
    %% Defining colors
    b1(1).FaceColor=[1 0 0];
    b1(2).FaceColor=[0 1 0];
    b2(1).FaceColor=[0 0 1];
    b2(2).FaceColor=[1 1 0];
    b2(3).FaceColor=[0 1 1];
    b2(4).FaceColor=[1 0 1];
    %%%%%%%%%%%%
    %%%%%%%%%%%%
    %%
    legend('EON German portfolio in MW', 'RWE German portfolio in MW',...
        'Percentage of German portfolio by EON', 'Percentage of German portfolio by RWE',...
        'EON"s percentage of generation in Germany', 'RWE"s percentage of generation in Germany')
    legend('Location','northwest')
    ylabel('Utilities generation portfolio as percentages')  
    

    这是你的代码加上下面的块

    %%%%%%%%%%%%
    %%%%%%%%%%%%
    %% Defining colors
    b1(1).FaceColor=[1 0 0];
    b1(2).FaceColor=[0 1 0];
    b2(1).FaceColor=[0 0 1];
    b2(2).FaceColor=[1 1 0];
    b2(3).FaceColor=[0 1 1];
    b2(4).FaceColor=[1 0 1];
    %%%%%%%%%%%%
    %%%%%%%%%%%%
    %%
    

    结果如下

    还添加了一个触发选项x 来控制条形宽度。

    【讨论】:

    • 但是你现在怎么知道哪个条属于哪个轴呢?
    • 在上面的代码中,在定义了b=bar(x,y)之后,b变成了一个向量,每个组件都是对应的bar控制面板。例如,如果 b=bar(x,y) 其中 x 和 y 是 2*20 向量,则 b 维护一个 2*1 向量,其中 b(1) 与 bar(x(1,:),y(1,: )) 和 b(2) 与 bar(x(2,:),y(2,:)) 相关
    • @mostafa 我相信他的意思是问观众如何理解他们应该从左轴还是右轴读取 y 值?
    • 你的意思是用黑色墨水在纸上打印(颜色变得模糊)?否则,我认为颜色和图例是自我解释的......
    • @MostafaAyaz 即使在打印之前...由于我们有两个 y 轴,它们表示不同的东西(这不仅仅是转换单位的问题,轴的 含义 是完全不同)。现在,应该根据正确的 y 轴读取每个条形图,所以问题是 - 您的建议如何告诉读者他们应该看右轴还是左轴?我希望现在很清楚。
    猜你喜欢
    • 2014-08-02
    • 2019-01-23
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多