推荐一种好看的数据图,附源代码~

文摘   2024-07-20 08:00   北京  
点击上方“博硕科研绘图”,关注我的公众号。
设为“星标”,原创文章第一时间推送。
资源获取,技术援助请私信~


问题:手术前,我采集了n个患者的m个医学指标,手术后,我又采集了这n个患者的m个医学指标,我要观测手术前后哪些医学指标发生了显著变化

需求:明确表示出每位患者的手术前后的医学指标变化,同时能表示出每个指标在统计学上是否变化显著。

分析:对于这种离散数据,用折线图连接n个患者的某个指标的数据,观察手术前后折线图的位置关系,如果手术后的折线位于手术前折线的上方,则可以明显判断出手术影响该指标的程度,这也是很多人能想到的方式,然而,当指标变化并不一致升高或降低时,线条就会显得杂乱,而且,患者与患者之间的数据不具有相关关系,这种将离散数据连接为趋势线的方式存在不妥

所以我想到了一种图表形式非常适合这种数据。先上图。

没错,就是这种多边形图,这里只展示了n=6|m=3时的情况,这种图从视觉效果上看要比折线图漂亮很多,而且数据的连接并不反映任何数据趋势,而是形成包络图形,通过观察包络图形的面积可以很容易判断数据的趋势

当n很大时,这种多边形图可以演化为圆形,m很大时,可以通过增加子图的方式处理,如下图所示。

这种图可以很好地展示我们的离散数据,前面提到,还需要展示数据变化的显著性特征,所以,我们可以将上图改进一下,将排版设计为2*2、2*3、3*3,我们要留出一个空位用来表示数据的统计学结果


如图d便是对数据统计学结果的表达,这里用到了玫瑰图的表达形式,与abc图具有了统一的风格。这种玫瑰图是我在visio里面绘制的,每个扇形我都添加了圆角,整体看上去更加柔和


后来,为了将玫瑰图以更加简单的方式绘制出来,我特意在Matlab中写了一个绘制这种图形的函数。程序可以根据数据的长度将圆形切为相应的块数,在设计扇形时,可以设定扇形开始位置的角度,以及扇形的内偏置角度(从图d可以看出,扇形与刻度线有一定的偏置角度)。以下是函数和主程序的调用格式,主函数需要输入的参数有:数据、开始角度、偏置角度


函数:

function plotRoseAll(data, theta, Inward_theta)    % data: 一行数据,用于确定每个扇形的半径    % theta: 第一个扇形的初始位置角度(度)    % Inward_theta: 扇形向内偏移的角度(度)        N = length(data); % 数据长度,对应扇形的个数    Begin_theta = zeros(1, N);        % 计算每个扇形的起始角度    for i = 1:N        Begin_theta(i) = theta - 360 / N * (i - 1);    end        Number = 1000; % 确定扇形的边界点细化个数
for i = 1:N % 计算每个扇形的角度范围 Begin = Begin_theta(i) - Inward_theta; End = Begin - (360 - 2 * N * Inward_theta) / N; % 生成弧线数据点 thetaSpan = linspace(Begin, End, Number); R = ones(1, Number) * data(i); % 以数据项为半径的圆弧 % 扇形的边界点 r = [0 data(i)]; Begin_point = [Begin, Begin]; End_point = [End, End]; % 绘制该扇形 polarplot(thetaSpan * pi / 180, R, 'b') % 绘制圆弧 hold on polarplot(Begin_point * pi / 180, r, 'b'); % 绘制起始半径 polarplot(End_point * pi / 180, r, 'b'); % 绘制结束半径 end
% 图形设置 title('Rose Plot'); grid on;end

主程序:

plotRoseAll(data, theta, Inward_theta)


数据图输出后,可以将结果复制到Visio中进行再次编辑,主要是线条的连接组合和图形的配色,圆角也可以在Visio中设置



如果你觉得我的分享对你有帮助的话,欢迎大家在这里点赞、在看、分享。当然,也欢迎大家在这里打赏。互动越多,更新越快哦~

声明:本公众号的所有原创内容,在未经允许的情况下,不得用于任何商业用途,违者必究。

博硕科研绘图
在读博士的科研经历,专注分享论文写作和科研画图的相关知识。
 最新文章