您绝对可以用您喜欢的任何颜色为饼图(和 3D 饼图)着色,而且它们不需要与最初用于创建饼图的数据相关联。
根据您的解释,我不确定您要应用什么颜色,或者您将如何确定饼图给定部分的颜色,但我可以为您提供一种简单的方法来将任何颜色应用到饼图的一部分。这样您就可以将问题分解为 3 个步骤:
- 生成您的通用饼图(已在您的示例代码中完成)
- 根据您的算法计算段的颜色
- 将这些颜色应用到饼图的相关部分(我进来的地方)
工作原理:
当您生成 3D 饼图时,Matlab 首先计算分配给每个段的比例(在您的情况下全部等于),然后生成图形输出。对于那个 matlab 生成 四个图形对象 每个饼图段:
- 3 个补丁对象(用于显示给定段的顶部、底部和侧面)
- 1个文本对象(用于段的文本标签)
解决方案只是检索图形对象的句柄,以便为它们分配颜色。
由于在您的情况下,句柄的集合很重要,我们还将稍微重新安排它,以便为给定的段轻松分配颜色,如下所示:
set( HandleCollection( FigureNumber , SegmentNumber) , desiredColor )
首先,我稍微修改一下您的示例,因为我们需要在创建图形对象时检索它们的句柄(这种方式更容易)。所以这里是:
x= [1 1 1 1 1 1 1 1 1 1 1 1] ;
nPieChart = 3 ; %// only 3 figures in this example, but any number can work
nSegments = length(x) ; %// number of segment for each pie chart
hPie = zeros( nSegments*4 , nPieChart ) ; %// initialise the handle matrix
% // Create your pie charts
for F=1:nPieChart
labels= {'Segment 1', 'Segment 2', 'Segment 3', 'Segment 4', 'Segment 5', 'Segment 6', 'Segment 7', 'Segment 8', 'Segment 9', 'Segment 10', 'Segment 11', 'Segment 12'};
figure;
hPie(:,F) = pie3(x,labels) ;
colormap gray;
title({['Floor n°=' num2str(F)];'Floor height=83.33mm';'Segment angle=30'});
end
我将 x 的定义排除在循环之外,因此我能够预先分配矩阵 hPie 的大小,该矩阵将包含句柄(并且还因为如果 x 永远不会改变,无需在每次循环迭代时重新计算它。(顺便说一下,如果 labels 没有从一个数字变为另一个数字,这同样适用于)。
现在我们有一个很好的句柄集合,让我们以更方便的方式重新排序它们。首先我们提取文本标签的所有句柄(我们希望将它们分开,因为它们具有与补丁对象不同的属性):
idx_textHandles = 4:4:nSegments*4 ;
hLabels = hPie( idx_textHandles , : ).' ;
最后一个 .' 运算符用于转置矩阵,以便我们可以通过 ( figureNumber , segmentNumber ) 访问 hLabels 表。 对我来说,在作业中将数字编号放在段号之前似乎更直观。
接下来,我们去除刚刚保存的文本句柄的hPie 矩阵,然后重新整形,使尺寸为 (m,n,p),其中:
m = 数字的数量
n = 每个饼图中的段数
p = 3(定义段的补丁对象的 3 个句柄)
hPie( idx_textHandles , : ) = [] ;
hSegment = permute( reshape( hPie , 3 , nSegments , nPieChart ) , [3 2 1] ) ;
就是这样!您现在只需一行代码即可通过设置补丁对象的'FaceColor' 属性为给定段分配颜色。例如指令:
set( hSegment( 2 , 5 , : ) , 'FaceColor','r' )
会将图形#2 的#5 段着色为红色。您可以使用任何预定义的颜色或通常的 [RVB] 三元组。您还可以设置给定段的文本。所以:
set( hLabels( 3 , 2) , 'String','HELLO')
set( hSegment( 3 , 2 , : ) , 'FaceColor', [.75 .75 .75] )
将图 #3 的部分 #2 着色为浅灰色,并将其文本标签设置为“HELLO”。
mmmh 等等!如果你是懒惰的键盘,或者只是像我一样,你对这种类型的矩阵分配感到困扰(nFig, Nsegment, :)。毕竟,矩阵的最后一维总是必须是如果我们想为整个段着色,则完全分配,因此每次都必须指定 : 很烦人......
没问题……多写一行代码,以后事情会更简单:
hdlSegments = num2cell( hSegment, [nSegments nPieChart] ) ;
酷,我们在分配中去掉了这些尾随的:,现在我们可以简单地分配一种颜色,指定图形编号,然后是段编号。例如:
set( hdlSegments{ 3 , 6 } , 'FaceColor','m')
将为图#3 的#6 段的面设置漂亮的洋红色。
请注意,现在我们必须使用 {} 而不是 (),因为我们现在访问的是元胞数组,而不是简单的数值数组。 p>
不够短?极其懒惰的键盘? ...好的最后一个提示,以进一步减少语法。一种简单的方法是编写一个函数来分配 3 个补丁对象的 'facecolor' 属性,但是代码很短,几乎浪费了一个新文件……你可以在一行中完成:
colorSegment = @(fig,seg,color) set( hdlSegments{fig,seg} ,'FaceColor',color)
你好,现在你可以输入:
colorSegment( 3 , 4 , [0 0 1] )
并看到图#3 的#4 部分变为漂亮的蓝色。 当然,如果你这样做是因为你键盘懒惰,你可以给函数起一个更短的名字。