我下面有一个堆叠的酒吧地皮:-
这是使用以下方法生成的:
b = barh(1:3,rand(3,2),'stacked');
现在我有了一个3x2单元C
,每个单元元素都是一个1x3RGB数组。
C = cell(3,2);
for i = 1:3
for j = 1:2
C{i,j} = rand(1,3);
end
end
图中有6个方框和6个相应的颜色。我想在方框中填充这些指定的颜色。我想用这个方法:
b(1).Parent.Parent.Colormap = C;
..。但这不起作用。
有人能建议如何使用控制每个条形段颜色的能力来绘制自定义的堆叠条形图吗?我不认为修改MATALB的bar
命令会有帮助。
发布于 2017-08-17 11:29:21
您需要复制和操作bar
(或barh
)函数返回的图形对象。
bar(y, 'stacked')
为y
中的每一列返回一个条形图对象。图形对象具有XData
和YData
字段,它们控制条形段的位置和大小。因为来自同一列的所有部分都共享图形对象,所以不能独立地操作颜色。
例如,如果y
是2x3矩阵,则bar
返回3个图形对象。每个物体都有:
XData
,一个包含条形索引的1x2向量YData
,一个1x2向量,每个元素都是区段的高度。FaceColor
,所有这些部分共享的颜色我的代码复制了这些图形对象,因此,与具有1x2 XData
和YData
字段的3个图形对象不同,还有6个具有1x1 XData
和YData
字段的图形对象,每个都有一个唯一的FaceColor
。
从正常的bar
或barh
图开始
figure;
n_bars = 2;
n_sections = 3;
%Initialize the bar graph with default coloring
b = bar(rand(n_bars, n_sections), 'stacked');
现在,制作一个新的图形,用被操纵的颜色来保存情节。
%Make new figure with new color scheme
f = figure;
a = axes('Parent', f);
%Colors
C = rand(6, 3);
对于原始的每个图形对象,复制两个副本。
for jj = 1:n_sections
%Duplicate the bar graphics object results
section1 = copyobj(b(jj), a);
section2 = copyobj(b(jj), a);
% Remove one of the bars from each section
section1.YData(1) = 0;
section2.YData(2) = 0;
%Change the color
section1.FaceColor = C(sub2ind([n_bars, n_sections], 1, jj), :);
section2.FaceColor = C(sub2ind([n_bars, n_sections], 2, jj), :);
end
之前和之后!
发布于 2017-08-18 05:57:42
这样做的目的是为每个数据行创建一个单独的图表,否则我们就无法获得单个条形对象句柄。
ydata = rand(3,2); cdata={'r','g'; 'b','y';'c','k';'g','b'};
numplots = size(ydata,1);
h=zeros(numplots,2);
figure, hold on
for k=1:numplots,
h(k,:) = barh(nan(size(ydata)),'stacked');
set(h(k,1),'FaceColor',cdata{k,1});
set(h(k,2),'FaceColor',cdata{k,2});
tmp_ydata = get(h(k,1),'YData');
tmp_ydata(k) = ydata(k,1);
set(h(k,1),'YData',tmp_ydata);
tmp_ydata = get(h(k,2),'YData');
tmp_ydata(k) = ydata(k,2);
set(h(k,2),'YData',tmp_ydata);
end
hold off
有关详细信息,请参阅MATLAB图形学上的Mike发布的“图表的高亮部分”
发布于 2017-08-18 10:18:57
根据塞西莉亚的回答,这是一个更普遍的解决办法。
n_bars = 3;
n_sections = 4;
b = barh(rand(n_bars, n_sections), 'stacked');
f = figure;
a = axes('Parent', f);
C = rand(n_bars*n_sections, 3);
for jj = 1:n_sections
for ii=1:n_bars
section=copyobj(b(jj), a);
dummy=1:n_bars;
dummy(dummy==ii)=[];
section.YData(dummy) = 0;
section.FaceColor = C(sub2ind([n_bars, n_sections], ii, jj), :);
end
end
对于n_bars
和n_sections
的任何值,这都是可行的。如果有人可以建议矢量化或更有效的实现,请这样做。
https://stackoverflow.com/questions/45724976
复制相似问题