1

我有一个tb看起来像这样的数据表,我想把它变成一个条形图。

N         X       P   
________  ______  ______

0          5      15.314   
0         10      36.288   
0         13      7.1785   
1          5      18.182   
1         10      40.997   
1         13      8.9741   
2          5       17.65   
2         10      40.095   
2         13       9.276

我希望条形图看起来像这样,但不需要重新排列表格。最简单的方法是什么?

图1

目前,我的代码看起来像这样,但我希望应该有一种更简单的方法来操作它:

y = [tb.P(tb.X==5)' ; tb.P(tb.X==10)' ; tb.P(tb.X==13)'];
b = bar(y);
xlab = arrayfun(@num2str, Xlist, 'uniformoutput', false);
set(gca,'xticklabel',xlab);
leg = arrayfun(@num2str, Nlist, 'uniformoutput', false);;
legend(b,leg)

这样做的正确方法是什么?

4

2 回答 2

1

我不知道这对你来说是否更简单,但你也可以这样做:

dat = sortrows(tb,[2 1]);
y = reshape(dat.P,numel(unique(dat.X)),[]).';
b = bar(y);
set(gca,'xticklabel',unique(dat.X));
legend(b,num2str(unique(dat.N)))

如果您有 Matlab 2017a,您还可以将此示例与分类数据一起使用,以将调用中的 x 轴值设置为bar.

于 2017-06-07T18:18:33.917 回答
1

unique使用and可以更轻松地做到这一点accumarray

[nValues, ~, nIndex] = unique(tb.N);
[xValues, ~, xIndex] = unique(tb.X);
bar(accumarray([xIndex nIndex], tb.P));
set(gca, 'XTickLabel', xValues);
legend(int2str(nValues));
于 2017-06-07T20:40:41.823 回答