【问题标题】:Changing individual bar color in a bar graph without for loop在没有 for 循环的情况下更改条形图中的单个条形颜色
【发布时间】:2019-08-20 20:31:36
【问题描述】:

我想在 MATLAB 中更改条形图中的单个条形颜色。我当然可以使用 for 循环来做到这一点,但是否可以不使用 for 循环来做到这一点,比如矢量运算。

这是使用 for 循环的最小示例

distr = [11,12,34,45,9];
totalkeys = numel(distr);
color = parula(totalkeys);
hold on;
for i = 1:totalkeys
bb= bar(i-1, distr(i), 'facecolor', color(i,:),'BarWidth', 1);
end
hold off;
xlim([0 totalkeys-1]);

顺便说一句,我正在使用 MATLAB R2016a。

【问题讨论】:

  • 您有什么特别的理由要避免使用 for 循环吗?这段代码是不是太慢了?我怀疑 for 循环会减慢任何图形渲染速度。在基于“循环很慢”(不再正确)进行优化之前,分析您的代码以识别瓶颈,然后优化该位。
  • 如果您将bb = bar(...) 更改为bb(i) = bar(...),那么在您的所有代码之后尝试bb(3).FaceColor = [1 0 0]; 尽管老实说我不确定您为什么反复调用bar。但我对此进行了测试,它在 R2017a 中有效。
  • bar 的文档示例包括如何将'FaceColor' 属性设置为'flat',通过CData(i,:) = [r g b] 调整第i 个条的颜色。但我认为这不适用于您的版本。 bb.CData 是否存在于您的版本中?
  • @CrisLuengo ,我在另一个 for 循环中使用这个条形图,它运行了大约 1000 次,所以这个 for 循环会减慢整个过程。
  • @SecretAgentMan MATLAB R2016a 不存在 CData。我认为它出现在 R2017b 之后

标签: matlab plot bar-chart matlab-figure


【解决方案1】:

R2017b 开始 (感谢@SecretAgentMan 指出这是特定于版本的),bar 对象有一个CData 属性来指定每个条的颜色。但是,您还需要更改 FaceColor 属性才能使其工作:

Bar 对象的FaceColor 属性设置为'flat',以便图表使用CData 属性中定义的颜色。

distr = [11,12,34,45,9];
color = parula(numel(distr));
bar(distr,'BarWidth', 1 ,'FaceColor', 'flat', 'CData',color);

【讨论】:

  • 你用什么版本测试过?由于 Bar 类上没有 CData 属性,因此在 R2017a 中不起作用。 (无论如何+1,这个答案就是我上面的评论所指的,并且是未来访问者的最佳方式)
  • @SecretAgentMan 哦。我没有看到您在问题中的第二条评论。我正在使用 R2017b。所以现在我们知道这是它的第一个版本
  • @SecretAgentMan 所以我需要使用 R2017b 版本。有没有办法用我当前的版本来做
  • 我想不出除了循环之外的任何东西,对不起
猜你喜欢
  • 2011-08-03
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2012-10-18
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多