✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,
完整代码、论文复现、期刊合作、论文辅导及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
在数据可视化领域,饼图是一种常用的图表类型,用于展示各个部分在整体中所占比例。然而,在某些特殊场景下,我们可能需要为饼图添加一些创意元素,以增加其吸引力和趣味性。其中,心形图例就是一种常见的创意元素,它可以在饼图中呈现出一个可爱的心形。
本篇博文将介绍一种实现饼图的心形图例的算法步骤,让您能够轻松地在自己的数据可视化项目中应用这一创意元素。
步骤一:准备数据 首先,我们需要准备饼图所需的数据。假设我们有一组数据,表示不同类别的占比,例如A类占比30%,B类占比20%,C类占比50%。
步骤二:计算角度 根据数据的占比,我们可以计算出每个类别所对应的角度。在饼图中,每个类别所占的角度等于其占比乘以360度。在我们的例子中,A类占比30%,则对应的角度为30% * 360 = 108度。
步骤三:绘制饼图 根据计算得到的角度,我们可以开始绘制饼图。首先,我们需要确定饼图的中心点和半径。中心点可以选择在图表的中心位置,半径则可以根据具体需求进行调整。接下来,我们可以按照计算得到的角度,依次绘制每个类别所占的扇形区域。
步骤四:绘制心形图例 在饼图中添加心形图例需要进行一些额外的计算和绘制。首先,我们需要确定心形的大小和位置。心形的大小可以根据具体需求进行调整,位置则可以选择在饼图的中心或其他合适的位置。接下来,我们可以使用曲线和圆弧等基本图形元素,按照一定的算法绘制心形。
步骤五:填充颜色和添加标签 完成饼图和心形图例的绘制后,我们可以为每个类别的扇形区域填充不同的颜色,以增加图表的可读性和美观性。同时,我们还可以在每个扇形区域中添加标签,显示该类别的具体占比或其他相关信息。
步骤六:添加动画效果(可选) 如果需要进一步增加图表的吸引力,我们可以为饼图和心形图例添加一些动画效果。例如
📣 完整代码
clc; clear; close all
% 生成随机点(Generate random points)
X = [11 13 2.5 2.5 11];
pieHdl = pie(X);
% 修饰饼状图(Decorate pie chart)
colorList=[0.4941 0.5490 0.4118
0.3059 0.1510 0.133
0.4980 0.2157 0.280
0.8302 0.5137 0.4667
0.4275 0.1824 0.4784];
for i = 1:2:length(pieHdl)
pieHdl(i).FaceColor=colorList((i+1)/2,:);
pieHdl(i).EdgeColor=colorList((i+1)/2,:);
pieHdl(i).LineWidth=1;
pieHdl(i).FaceAlpha=.6;
end
for i = 2:2:length(pieHdl)
pieHdl(i).FontSize=11;
pieHdl(i).FontName='Times New Roman';
end
lgd=legend('FontSize',11,'FontName','Times New Roman','TextColor',[1,1,1].*.3);
pie2HeartLegend(lgd)
function pie2HeartLegend(lgd)
% =========================================================================
if nargin<1
ax = gca;
lgd = get(ax,'Legend');
end
pause(1e-6)
% 心形曲线(Heart curve)
x = -1:1/100:1;
y1 = 0.6 * abs(x) .^ 0.5 + ((1 - x .^ 2) / 2) .^ 0.5;
y2 = 0.6 * abs(x) .^ 0.5 - ((1 - x .^ 2) / 2) .^ 0.5;
XX = [x, flip(x),x(1)]./3.4+.5;
YY = ([y1, y2,y1(1)]-.2)./2+.5;
Ind = [1:(length(XX)-1);2:length(XX)];
Ind = Ind(:).';
% 获取图例图标(Get Legend Icon)
lgdEntryChild = lgd.EntryContainer.NodeChildren;
iconSet = arrayfun(@(lgdEntryChild)lgdEntryChild.Icon.Transform.Children.Children,lgdEntryChild,UniformOutput=false);
% 基础边框句柄(Base Border Handle)
newEdgeHdl = matlab.graphics.primitive.world.LineStrip();
newEdgeHdl.AlignVertexCenters = 'off';
newEdgeHdl.Layer = 'front';
newEdgeHdl.ColorBinding = 'object';
newEdgeHdl.LineWidth = .8;
newEdgeHdl.LineJoin = 'miter';
newEdgeHdl.WideLineRenderingHint = 'software';
newEdgeHdl.ColorData = uint8([38;38;38;0]);
newEdgeHdl.VertexData = single([XX;YY;XX.*0]);
newEdgeHdl.VertexIndices = uint32(Ind);
% 基础多边形面句柄(Base Patch Handle)
newFaceHdl = matlab.graphics.primitive.world.TriangleStrip();
Ind = [1:(length(XX)-1);ones(1,length(XX)-1).*(length(XX)+1);2:length(XX)];
Ind = Ind(:).';
newFaceHdl.PickableParts = 'all';
newFaceHdl.Layer = 'middle';
newFaceHdl.ColorBinding = 'object';
newFaceHdl.ColorType = 'truecoloralpha';
newFaceHdl.ColorData = uint8(255*[1;1;1;.6]);
newFaceHdl.VertexData = single([XX,.5;YY,.5;XX.*0,0]);
newFaceHdl.VertexIndices = uint32(Ind);
% 替换图例图标(Replace Legend Icon)
for i = 1:length(iconSet)
oriEdgeHdl = iconSet{i}(1);
tNewEdgeHdl = copy(newEdgeHdl);
tNewEdgeHdl.ColorData = oriEdgeHdl.ColorData;
tNewEdgeHdl.Parent = oriEdgeHdl.Parent;
oriEdgeHdl.Visible = 'off';
oriFaceHdl = iconSet{i}(2);
tNewFaceHdl = copy(newFaceHdl);
tNewFaceHdl.ColorData = oriFaceHdl.ColorData;
tNewFaceHdl.Parent = oriFaceHdl.Parent;
oriFaceHdl.Visible = 'off';
end
end