【问题标题】:Modifying Each Bars EdgeColor After Every If-Statement在每个 If 语句之后修改每个条的 EdgeColor
【发布时间】:2013-02-15 10:19:12
【问题描述】:

问题:如何根据稍后在代码中进行的数学比较来更改每个条形的edgecolor(我们有两个条形图 f3 和 f4,每个条形图显示条形的数量取决于rowNosMaxSG,其中最多包含 14 个小节)。

目前使用下面的数学-if-statement 更改edgecolor,不幸的是,在执行每个 3-if-statement 后,我​​遇到了边缘颜色重叠,这种重叠影响了每个图表的整个条形,而我希望能够根据数学比较控制每个条形图中每个条形的edgecolor

截断代码(包括数学比较):

    f3= bar(SN, Shift_Grade', 'stacked', 'FaceColor', 'white');
    f4= bar( SN( Shift_Gradey ~= 0 ), Shift_Gradey( Shift_Gradey ~= 0 ),...
      'stacked', 'FaceColor', 'white', 'EdgeColor','green',...
      'LineWidth', 2);
%----------------   **Mathematical-Comparison (3-if-statements)**  --------------------
    if ( SN( Shift_Grade' <= 11.3 )
         set(f3, 'EdgeColor', 'r')
    end
    if  (  SN( 11.3 < Shift_Grade' ) & SN( Shift_Grade' < 16 ) )
         set(f3, 'EdgeColor', 'y')
    end
    if ( SN( Shift_Grade' >= 16 ) )
         set(f3, 'EdgeColor', 'g')
         set(f4, 'EdgeColor', 'g')
    end
set(gca, 'Xtick', 1:2:length(SN)+1)
set(gca,'YLim',[0 20])
set(gca,'XLim',[0 length(SN)+1])

希望有一个清晰明了的答案来解决这个阻碍我进步的问题。提前感谢您的时间。


Doresoom 好主意,我不知道。我已经实现了你的想法,但我仍然收到以下代码的错误:

???错误使用 ==> set

无法从cell 转换为double

可重现的代码:

SN= [1:14]';
SG= [15.5; 13; 15; 12.2; 13.6; 13.4; 14.2; 9; 17.7; 15; 12.5; 10; 16; 13.6];
SN_UnderDogs= [8; 12];
SN_Mediocre= [1; 2; 3; 4; 5; 6; 7; 10; 11; 14];
SN_Top= [9; 13];

for cc = 1:length(SN)
    f3(cc) = bar(cc, SG(cc), 'FaceColor', 'white');
end

if  SN( SG <= 11.3 )
    for SNUD = SN_UnderDogs ( 1 : length (SN_UnderDogs) )
        set(get(f3(SNUD),'Children'),'EdgeColor','r')
    end
end
if  SN( 11.3 < SG  &  SG < 16 )
    for SNM = SN_Mediocre ( 1 : length (SN_Mediocre) )
        set(get(f3(SNM),'Children'),'EdgeColor','y')
    end
end
if  SN( SG >= 16 )
    for SNT = SN_Top ( 1 : length (SN_Top) )
        set(get(f3(SNT),'Children'),'EdgeColor','g')
    end
end

我该如何解决这个错误?提前致谢。

【问题讨论】:

  • 您能否附上当前正在发生的事情以及实际应该是什么样子的图片?
  • 不幸的是,由于我是这个网站的新手,所以我没有足够的声誉,所以我无法上传图片。但是,我已经解释了第二段中发生的事情。如果有不清楚的地方请告诉我,以便我进一步解释。
  • 也许您可以使用bar(1:10,1:12:120) 或类似的东西制作一个可重复的小示例。

标签: matlab graph set bar-chart


【解决方案1】:

试试这个:

SN= [1:14]';
SG= [15.5; 13; 15; 12.2; 13.6; 13.4; 14.2; 9; 17.7; 15; 12.5; 10; 16; 13.6];
SN_UnderDogs= [8; 12];
SN_Mediocre= [1; 2; 3; 4; 5; 6; 7; 10; 11; 14];
SN_Top= [9; 13];

for cc = 1:length(SN)
    f3(cc) = bar(cc, SG(cc), 'FaceColor', 'white');
    hold on;
end

if  SN( SG <= 11.3 )
    for SNUD = SN_UnderDogs ( 1 : length (SN_UnderDogs) )
        % set(get(f3(SNUD),'Children'),'EdgeColor','r')
        cellfun(@(x) set(x,'EdgeColor','r'), get(f3(SNUD),'Children'))
    end
end
if  SN( 11.3 < SG  &  SG < 16 )
    for SNM = SN_Mediocre ( 1 : length (SN_Mediocre) )
        % set(get(f3(SNM),'Children'),'EdgeColor','y')
        cellfun(@(x) set(x,'EdgeColor','y'), get(f3(SNM),'Children'))
    end
end
if  SN( SG >= 16 )
    for SNT = SN_Top ( 1 : length (SN_Top) )
        % set(get(f3(SNT),'Children'),'EdgeColor','g')
        cellfun(@(x) set(x,'EdgeColor','g'), get(f3(SNT),'Children'))
    end
end

【讨论】:

  • 好吧,我以为您在拨打所有bar 电话之前先拨打hold on - 否则您第二个帖子的代码将以同样的方式崩溃。不过,我在帖子中修复了代码。希望对您有所帮助。
  • 太棒了!你再次拯救了我的一天!竖起大拇指。
【解决方案2】:

您是否尝试过自己抓住酒吧的补丁手柄?

您可能必须将所有条形图绘制为单独的条形图。 这样的事情可能会起作用:

figure
hold on
for n = 1:10
bh(n) = bar(n,n);
end
set(get(bh(1),'Children'),'EdgeColor','r','FaceColor','w')

【讨论】:

  • 竖起大拇指,因为我利用了你的想法。也感谢用户 miy 解决了这个问题。
  • 哦,我知道我不能勾选多个答案:(我下次会这样做。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-05-13
  • 2019-09-21
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2017-10-23
相关资源
最近更新 更多