【问题标题】:Matlab bars: changing the color of the bar and the space between bars and axesMatlab条:改变条的颜色以及条和轴之间的空间
【发布时间】:2018-01-16 00:17:00
【问题描述】:

我有一个棘手的问题,我认为不能简单地回答。

我有一个大型数据表,想为每 2 个相应的平均值保存条形图。我已经用“for循环”做到了,但我不能为我的条设置不同的颜色,也不能在条和轴之间设置适当的空间。

这是最简单的例子:

k = [2 5]
bar(k)

Matlab 将这些数据 [2 5] 视为一个“组”,它不会给出仅改变一个条形的颜色的可能性。

当然,当我们有不同的“组”时,颜色是可变的。

y = bar([1 2 3; 4 5 6]);
y(2).FaceColor = 'red';

但是我的例子呢?我只需要两个条,我需要给它们上色。另外,我想在每个条和轴之间设置一个小空间(再次使用两个条并不是那么简单,我不能使用“条宽”,因为这并没有给我我真正想要的东西)。

有谁知道如何解决这个问题?

感谢您的回复! 玛丽

【问题讨论】:

  • 轴间距是什么意思?哪个轴? x、y 还是两者都有?

标签: matlab charts bar-chart matlab-figure


【解决方案1】:

一个很好的技巧是为每个组添加零列:

k = [2 5;0 0];
bar(k,'grouped')

更新

另一种具有不同颜色的解决方案是使用bar中的位置:

k = [2 5];
figure(1);
hold on;
h=bar(1,k(1));
set(h,'FaceColor','k');
h=bar(2,k(2));
set(h,'FaceColor','b');
hold off

【讨论】:

  • 嗯,这不是一个好的解决方案,因为右边的第二个空白区域看起来很奇怪。此外,这对我来说实际上很重要,因为我为我的酒吧设置了名称 [[ 像这样:k = [2 5;0 0];酒吧(k,'分组');设置(gca,'xticklabel',{'一个','TWO'}); ]]。所以你的解决方案也毁了它。感谢您的尝试:)。最好的问候!
  • @BloodyMary 要更改颜色,您可以关注更新。虽然,它们不在同一列中。
【解决方案2】:

据我所知,这需要使用自定义条形图,因为 Matlab 的条形图使用动态颜色图。就个人而言,我喜欢用于所有这些自定义的 GRAMM 工具箱:[GRAMM on file-exchange][GRAMM on github]

这是一个例子:

x = [1 2];
y = [1 1.5];
c = x;
custom_map = ...
[1 0.3673 0.4132;
 0 0.7375 0.8344];

clear g
g(1,1)=gramm('x',x,'y',y,'color',c);
g(1,1).geom_bar('width',0.2);
g(1,1).set_title('Width = 0.2');

g(1,2)=gramm('x',x,'y',y,'color',c);
g(1,2).geom_bar('width',0.8);
g(1,2).set_title('Width = 0.8');

g.set_names('y','','x','');
g.set_color_options('map',custom_map);
g.axe_property('YTick',[],'LineWidth',1,'YColor',[1 1 1],'XLim',[0.5 2.5],'XTick',[1 2])

figure('Position',[100 100 600 300]);
g.draw();

【讨论】:

    【解决方案3】:

    这是解决此问题的一个选项。您可以使用 diag(k) 创建一个 2*2 矩阵,除了主对角线之外的所有零都将与您的值一起使用,Matlab 会将其读取为 2 个不同的组。然后你改变'dummy'条的Xdata(你看不到,但在x轴上占用一些空间到nan,所以Matlab会忽略它。

    k = [2 5];
    b = bar(diag(k));
    set(b,{'XData'},{[1 nan],[nan 1]}); % remove the group you don't want
    set(gca,{'xticklabel','XTick'},{{'ONE','TWO'},[0.85 1.15]});
    b(2).FaceColor = 'r'; % choose a different color
    

    结果:

    如果您想将其推广到更多组(这里是 5 个):

    k = 1:5;
    data = diag(k);
    xdata = eye(numel(k))./eye(numel(k)); % a martix of nan with 1 on the main diagonal
    b = bar(diag(k));
    % remove all data except one bin in all groups:
    set(b,{'XData'},mat2cell(xdata,ones(size(data,1),1),size(data,2)))
    X = xlim; 5 get x-axis limits
    w = (1-X(1))/(numel(k)/2); % calculate the width of one bin
    set(gca,'XTick',X(1)+w/2:w:X(2)) % set the X ticks to the center of the bins
    set(gca,'xticklabel',{'ONE','TWO','THREE','FOUR','FIVE'}); % set the labels
    set(b,{'FaceColor'},mat2cell(lines(numel(k)),ones(size(data,1),1),3)); % set the colors
    

    你会得到:

    最后,如果您希望它们“悬停”在 x 轴上方一点,您可以添加以下行:

    b(1).BaseLine.Color = 'none'; % remove the base line
    ylim([-0.1 max(k(:))]) % shift the bars up a little
    

    然后得到:

    【讨论】:

      【解决方案4】:

      histogram 函数是一种可以轻松处理间距和 x 轴标签的选项,但您必须分别绘制每个条形以独立控制颜色:

      k = [2 5];
      histogram('Categories', {'ONE'}, 'BinCounts', k(1), 'BarWidth', 0.8, ...
                'FaceAlpha', 1, 'FaceColor', [0 0.4470 0.7410]);
      hold on;
      histogram('Categories', {'TWO'}, 'BinCounts', k(2), 'BarWidth', 0.8, ...
                'FaceAlpha', 1, 'FaceColor', [0.8500 0.3250 0.0980]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多