2013-02-15 52 views
0

问题:如何根据稍后在代码中进行数学比较(我们有两个条形图f3和f4,每个条形图编号的酒吧取决于rowNosMaxSG,其中最多它将由14个酒吧组成)。在每条if语句后修改每条边缘颜色

目前下面的数学if语句更改edgecolor,不幸的是,在每个3-if语句执行后,我都会遇到边缘颜色重叠,并且此重叠会影响每个图的整个条,而我想要根据数学比较能够控制每个条形图中每个单条的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 

我该如何解决这个问题?提前致谢。

+0

你可能包括什么是目前发生的事情,什么它实际上应该看起来像一个形象呢? – 2013-02-15 12:15:43

+0

很抱歉,我无法上传图片,因为我对这个网站不熟悉,因为我没有足够的声望。但是,我已经解释了第二段中发生了什么。如果有什么不清楚请让我知道,所以我进一步解释。 – Hans 2013-02-15 13:02:47

+0

也许你可以使用'bar(1:10,1:12:120)'或类似的东西来制作一个可重复使用的小例子。 – 2013-02-15 13:10:43

回答

0

试试这个:

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 
+0

给出:???错误使用==>'得到' 无效的句柄对象。 – Hans 2013-02-15 23:14:52

+0

嗯,我想你叫'hold on'然后再进行所有bar调用 - 否则第二篇文章中的代码会以同样的方式崩溃。不过,我在我的文章中修复了代码,希望它有帮助。 – miy 2013-02-15 23:32:47

+0

Bravo!你再次拯救了我的一天!Thumbs-向上。 – Hans 2013-02-15 23:41:57

0

你试过抓住酒吧自己的补丁句柄吗?

您可能必须将所有条形图绘制为单独的条形图。 像这样的东西可能会奏效:

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

竖起大拇指,因为我已经利用你的想法。也感谢用户** miy **解决了这个问题。 – Hans 2013-02-15 23:44:23

+0

噢,我看到我不能打勾超过一个答案:(我会在下次做。谢谢 – Hans 2013-02-15 23:51:53