文章目录
- 结果展示
- 数据准备
- 五个饼图绘制
- 下方文本设置
- 图例设置
- 大小设置
- 完整代码
结果展示
数据准备
依次准备好每个 饼状图上方的标题,下方的自定义文本,每个扇形图旁边的数据,以及要设置的颜色。
% 数据准备:标题、文本、数据、标签、颜色
name = [1 2 3 4 5];
texts = {'Blue(6)','Blue(5)-Red(1)','Blue(4)-Red(2)','Blue(3)-Red(3)','Red(6)'};
data = {[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6]
};
labels = {{'16.67%', ' ', ' ',' ',' ',' '},{'16.67%', '16.67%', ' ', ' ',' ',' '},{'33.33%', ' ', ' 16.67%', ' ',' ',' '},{'50%', ' ', ' ', ' 16.67%',' ',' '},{'16.67%', ' ', ' ',' ',' ',' '}
};
colors = {[1 0 0; 0 0 1; 0 0 1; 0 0 1; 0 0 1; 0 0 1],
};
五个饼图绘制
将每个饼图设置为子图就可以正确实现
figure('Position', [100 100 1500 500]); % x, y, width, height
for i = 1:5% 绘图subplot(1,5,i);colormap(colors{1});pie(data{i}, labels{i});title(['Scale of the fan chart: ', num2str(name(i))],'FontSize', 16);%------循环未结束
end
下方文本设置
得到当前坐标轴的值,然后计算文本应该放置的位置
figure('Position', [100 100 1500 500]); % x, y, width, height
for i = 1:5% 绘图subplot(1,5,i);colormap(colors{1});pie(data{i}, labels{i});title(['Scale of the fan chart: ', num2str(name(i))],'FontSize', 16);%------下方文本设置ax = gca;xlims = ax.XLim;ylims = ax.YLim;x_center = mean(xlims);text_pos_y = ylims(1) + (ylims(2) - ylims(1)) * 0.05 - 0.25; % 从底部向上偏移5%text(x_center, text_pos_y, texts{i}, 'HorizontalAlignment', 'center', 'FontSize', 12);%------循环未结束
end
图例设置
为了将图例放到正中央,在第三个饼图设置图例即可
for i = 1:5% 绘图subplot(1,5,i);colormap(colors{1});pie(data{i}, labels{i});title(['Scale of the fan chart: ', num2str(name(i))],'FontSize', 16);% 计算文本放置的位置ax = gca;xlims = ax.XLim;ylims = ax.YLim;x_center = mean(xlims);text_pos_y = ylims(1) + (ylims(2) - ylims(1)) * 0.05 - 0.25; % 从底部向上偏移5%text(x_center, text_pos_y, texts{i}, 'HorizontalAlignment', 'center', 'FontSize', 12);% 添加 legend 只有在 i=3 的时候if i == 3legend('MS\_B','','MS\_N','Orientation','horizontal',...'FontSize',16,'Location','best');end%-----循环未结束
end
大小设置
为了实现从左到右饼图大小依次增大,这里设置axis
坐标轴的大小。设置的scale
尺寸需要从大到小,这是因为在MATLAB中使用axis函数来设置坐标轴的显示范围时,你所观察到的现象是由于axis函数如何定义坐标轴的显示区域造成的。当你在绘制一个饼图(或任何图表)后,使用axis([-scales(i), scales(i), -scales(i), scales(i)])
,你实际上是在定义x轴和y轴的最小值和最大值。
对于一个饼图来说,它通常会自动适应坐标轴的范围,以便完整地显示所有的扇形部分。因此,如果你给axis一个更大的范围,那么整个饼图看起来就会相对于坐标轴变小,因为它需要适应这个更大的空间。反之,如果axis
的范围被设置得更小,饼图为了适应这个更小的空间,其视觉效果上会显得更大。
在你的例子中,scales
数组中的值较小,意味着你正在告诉MATLAB使用一个相对较小的坐标轴范围。这会导致饼图看起来更大,因为它必须完全适应在这个小范围内。
例如,如果你有一个scales
值为1,那么axis([-1, 1, -1, 1])
将会设定一个非常小的显示区域,饼图必须在这个区域内完全显示,因此它会显得比默认情况下大。而如果scales
值为10,那么axis([-10, 10, -10, 10])
将创建一个很大的显示区域,饼图在这个大区域内会显得相对较小。
所以,如果你想通过改变axis
的范围来放大或缩小饼图的视觉效果,你确实可以通过减小或增加axis
的范围来实现这一点。但是要注意,过小的范围可能会导致饼图的某些部分被裁剪掉,因为饼图的直径可能超出了你所设定的范围。同样,过大的范围虽然不会裁剪掉任何部分,但可能会让饼图看起来过于微小且不明显。
scales = [5 4 3 2 1]; %坐标轴比例因子反向设置才是从左到右依次增大
for i = 1:5% 绘图subplot(1,5,i);colormap(colors{1});pie(data{i}, labels{i});title(['Scale of the fan chart: ', num2str(name(i))],'FontSize', 16);% 计算文本放置的位置ax = gca;xlims = ax.XLim;ylims = ax.YLim;x_center = mean(xlims);text_pos_y = ylims(1) + (ylims(2) - ylims(1)) * 0.05 - 0.25; % 从底部向上偏移5%text(x_center, text_pos_y, texts{i}, 'HorizontalAlignment', 'center', 'FontSize', 12);% 添加 legend 只有在 i=3 的时候if i == 3legend('MS\_B','','MS\_N','Orientation','horizontal',...'FontSize',16,'Location','best');end% 设置坐标轴范围以调整饼状图大小axis([-scales(i), scales(i), -scales(i), scales(i)]);% saveas(gcf, [num2str(i), '.png']);
end
完整代码
这样代码部分就设置完成了,我本来想给每个饼图设置一个颜色的,但是由于colormap
会将每个饼图特别设定的颜色给覆盖,所以只能生成figure图窗之后单独给每个扇形单独设置颜色,后期更改颜色,得到的就是如文章顶部的图片。
完整代码如下所示:
% 比例因子
scales = [5 4 3 2 1]; %坐标轴比例因子反向设置才是从左到右依次增大
name = [1 2 3 4 5];
texts = {'Blue(6)','Blue(5)-Red(1)','Blue(4)-Red(2)','Blue(3)-Red(3)','Red(6)'};
data = {[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6],[1/6 1/6 1/6 1/6 1/6 1/6]
};
labels = {{'16.67%', ' ', ' ',' ',' ',' '},{'16.67%', '16.67%', ' ', ' ',' ',' '},{'33.33%', ' ', ' 16.67%', ' ',' ',' '},{'50%', ' ', ' ', ' 16.67%',' ',' '},{'16.67%', ' ', ' ',' ',' ',' '}
};
colors = {[1 0 0; 0 0 1; 0 0 1; 0 0 1; 0 0 1; 0 0 1],
};figure('Position', [100 100 1500 500]); % x, y, width, heightfor i = 1:5% 绘图subplot(1,5,i);colormap(colors{1});pie(data{i}, labels{i});title(['Scale of the fan chart: ', num2str(name(i))],'FontSize', 16);% 计算文本放置的位置ax = gca;xlims = ax.XLim;ylims = ax.YLim;x_center = mean(xlims);text_pos_y = ylims(1) + (ylims(2) - ylims(1)) * 0.05 - 0.25; % 从底部向上偏移5%text(x_center, text_pos_y, texts{i}, 'HorizontalAlignment', 'center', 'FontSize', 12);% 设置坐标轴范围以调整饼状图大小axis([-scales(i), scales(i), -scales(i), scales(i)]);% 添加 legend 只有在 i=3 的时候if i == 3legend('MS\_B','','MS\_N','Orientation','horizontal',...'FontSize',16,'Location','best');end% saveas(gcf, [num2str(i), '.png']);
end