【问题标题】:Stacked Bar Graph Matlab堆积条形图 Matlab
【发布时间】:2011-09-18 08:57:17
【问题描述】:

假设我有如下数据:

 level,age
     8,10
     8,11
     8,11
     9,10
     9,11
     9,11
     9,11

我希望在 Matlab 中形成一个堆积条形图,其中“级别”在 x 轴上,该级别的出现次数(频率)在 y 轴上:所以 8 会有一个 y-值为 3 和 9 的 y 值为 4。此外,我希望将其作为堆叠条形图,因此第 8 级将有 1 个绿色单位(绿色是 10 岁)和 2 个红色单位(其中红色是 11 岁),而 9 将有 1 个单位为绿色,3 个单位为红色。

感谢您的帮助!

【问题讨论】:

    标签: matlab plot bar-chart stackedbarseries


    【解决方案1】:

    您可以使用函数ACCUMARRAY 以相当紧凑和通用的方式执行此操作,其中data 是您的7×2 样本数据矩阵:

    ageValues = unique(data(:,2));          %# Vector of unique age values
    barData = accumarray(data(:,1),data(:,2),[],@(x) {hist(x,ageValues)});
    X = find(~cellfun('isempty',barData));  %# Find x values for bars
    Y = vertcat(barData{:});                %# Matrix of y values for bars
    hBar = bar(X,Y,'stacked');              %# Create a stacked histogram
    set(hBar,{'FaceColor'},{'g';'r'});      %# Set bar colors
    legend(cellstr(num2str(ageValues)),'Location','NorthWest');  %# Add a legend
    

    请注意,在倒数第二行中传递给函数 SET 的颜色元胞数组 {'g';'r'} 应该与 ageValues 具有相同数量的元素才能正常工作。

    这是生成的bar graph

    【讨论】:

    • +1 很好地使用了 ACCUMARRAY。我将通过不在 HISTC 调用中对值 [10 11] 进行硬编码,而是使用 uniqAge=unique(data(:,2)); 来使代码更通用。这里也有点需要传说:legend( strtrim(cellstr(num2str(uniqAge,'Age %d'))), 'Location','NorthWest')
    【解决方案2】:

    您可以使用uniquehistc 函数来获取唯一值和频率计数,然后使用bar 中的'stacked' 选项来绘制数据。请注意,在下文中,我将levelage 作为列向量。我还将代码的中心部分设为通用,而不是针对这个特定示例。

    level=[8,8,8,9,9,9,9]';              %'#SO code formatting
    age=[10,11,11,10,11,11,11]';         %'
    
    %#get unique values and frequency count
    uniqLevel=unique(level);
    freqLevel=histc(level,uniqLevel);    
    uniqAge=unique(age);
    
    %#combine data in a manner suitable for bar(...,'stacked')
    barMatrix=cell2mat(arrayfun(@(x)histc(age(level==uniqLevel(x)),uniqAge),...
        1:numel(uniqLevel),'UniformOutput',false));
    
    %#plot the stacked bars and customize
    hb=bar(barMatrix','stacked');        %'
    
    set(gca,'xticklabel',uniqLevel,'ytick',1:max(sum(barMatrix)))
    set(hb(uniqAge==10),'facecolor','green')
    set(hb(uniqAge==11),'facecolor','red')
    
    xlabel('Level')
    ylabel('Occurrence')
    legend('10','11','location','northwest')
    

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 2017-02-26
      • 2014-02-09
      • 2020-09-14
      • 1970-01-01
      • 2016-10-13
      • 2017-10-14
      相关资源
      最近更新 更多