如果我的数据如下所示:
X = [ 1 2 2 3 4 5 5]
Y = [10 9 -5 11 12 -3 7]
谁能告诉我如何在 Matlab 中将其绘制为条形字符?因为我只是使用 bar(X, Y),所以它表示 XData 不能没有重复值。理想的情况是在同一个X位置,有两个Y值。非常感谢!!
如果我的数据如下所示:
X = [ 1 2 2 3 4 5 5]
Y = [10 9 -5 11 12 -3 7]
谁能告诉我如何在 Matlab 中将其绘制为条形字符?因为我只是使用 bar(X, Y),所以它表示 XData 不能没有重复值。理想的情况是在同一个X位置,有两个Y值。非常感谢!!
根据您的问题,我认为您想绘制一个聚集条形图。为此,您必须在 MATLAB 中使用矩阵。当你说矩阵bar(A)
在哪里时A
,每一列A
都被视为一个数据系列,并将根据自然数绘制成簇。因此,鉴于您的行数据X
和Y
,您应该这样做:
A=[X;Y]'; %note the single quote for transpose
bar(A)
这是您的数据的输出(X 蓝色,Y 红色):
改为使用barh()
。
我想这就是你要找的:
barh(Y,X), xlabel('X'), ylabel('Y')
您必须将数据拆分为 2 个系列:对于y
. 然后你可以在同一个图上绘制两者。
请注意,由于bar
函数使用条形的相对宽度,因此它取决于x
数据系列中值之间的最小距离。如果这些数字在 2 个数据系列中不同,则必须更正条形宽度。
ipos = y>=0;
ineg = y<0;
dpos = min(diff(sort(x(ipos))));
dneg = min(diff(sort(x(ineg))));
w = 0.8;
bar(x(ipos),y(ipos),w);
hold on
bar(x(ineg), y(ineg), w*dpos/dneg, 'facecolor','r');
hold off
如果每个值超过 2 个x
,则可能需要使用另一种方法通过多次迭代来删除唯一值。在这种情况下,某些值可能会重叠,因此y
请先排序。
xx = x;
yy = y;
cla
hold on
w = 0.8;
while ~isempty(xx)
[xu, idx] = unique(xx);
yu = yy(idx);
xx(idx) = [];
yy(idx) = [];
d = min(diff(sort(xu)));
bar(xu,yu,w/d);
end
hold off
clear xx yy xu yu d