Matlab绘图工具箱Gramm

Gramm工具箱教程

Gramm工具箱用于matlab绘图,特别是多组数据之间对比的图,内含线性拟合、95%置信区间绘制等常规统计,就不用再去为编写脚本语句。Gramm包含多种常用图表的examples.m和gramm cheat sheet,仅只用找到自己想绘制的图形,然后将对应examples语句改写即可,方便快捷。

下载

https://github.com/piermorel/gramm

使用

  1. 运行examples.m,查看想要绘制的类似图形。

例如我想绘制例子中的第四个子图
在这里插入图片描述

  1. 找到相应的源代码

从说明文档里知道这个图叫做Repeated trajectories
在examples.m查找Repeated trajectories即可定位到相应代码
%% Methods for visualizing repeated trajectories:

% gramm supports 2D inputs for X and Y data (as 2D array or cell of
% arrays), which is particularly useful for representing repeated
% trajectories. Here for example we generate 50 trajectories, each of
% length 40. The grouping data is then given per trajectory and not per
% data point. Here the color grouping variable is thus given as a 1x50
    % cellstr.

%We generate 50 trajectories of length 40, with 3 groups
N=50;
nx=40;
cval={'A' 'B' 'C'};
cind=randi(3,N,1);
c=cval(cind);
x=linspace(0,3,nx);
y=arrayfun(@(c)sin(x*c)+randn(1,nx)/10+x*randn/5,cind,'UniformOutput',false);

clear g
g(1,1)=gramm('x',x,'y',y,'color',c);
g(1,2)=copy(g(1));
g(2,1)=copy(g(1));
g(2,2)=copy(g(1));

g(1,1).geom_point();
g(1,1).set_title('geom_point()');

g(1,2).geom_line();
g(1,2).set_title('geom_line()');

g(2,1).stat_smooth();
g(2,1).set_point_options('base_size',3);
g(2,1).set_title('stat_smooth()');


g(2,2).stat_summary();
g(2,2).set_title('stat_summary()');

g.set_title('Visualization of repeated trajectories ');

figure('Position',[100 100 800 550]);
g.draw();

  1. 我们来读一下这段代码(看我的注释)

% gramm supports 2D inputs for X and Y data (as 2D array or cell of
% arrays), which is particularly useful for representing repeated
% trajectories. Here for example we generate 50 trajectories, each of
% length 40. The grouping data is then given per trajectory and not per
% data point. Here the color grouping variable is thus given as a 1x50
% cellstr.
Gramm支持2D的输入数据(可以用2D数组或者cell类型,
任君挑选,从array和cell的区别大家应该能猜到为什么提供两种,
而不是固定一种,对的,就是数据长度或数据类型的原因,
具体大家可以回去看array和cell基础,很多编程语言开头都会讲的),特别是用来表征轨迹的重复性。作者生成了个50次repeated轨迹的数据,数据长40,数据按照每次轨迹来分组,并且制定Color grouping variable是一个1*50的字符串cell类型

**在Gramm中,大家要明确group这个概念。grouping data和color grouping variable等
都是很重要的参数(包括其他可以用来group的参数)。大家把握gramm的目的就好,
gramm是为了分组对比而生的(还有其他功能,例如分组完成统计)。这个group会导致
可以绘制多(两)张之间形成对比,也可以在一张图片里按照颜色绘制多条曲线(或其
他形状)**

%We generate 50 trajectories of length 40, with 3 groups
N=50;           % 50次轨迹
nx=40;          % number of x的缩写
cval={'A' 'B' 'C'};     % cval,color of value的缩写
cind=randi(3,N,1);      % color of index的缩写, randi是matlab自带函数,作用是产生均匀分布的伪随机整数序列,这里的randi(3,N,1)等同于randi(3,[N,1]),就是要产生一个最大值为3的50*1的均匀分布随机整数数,这里就是1,2,3会随机产生,总共会有50个,大家可以用sum(cind==3),sum(cind==2),sum(cind==1)来查看每次运行产生的情况,每次应该都是不一样的。


c=cval(cind);  %按照cind的索引取cval的值,那cval有50个值,1,2,3就是代表要取cval第1个值,就是A,以此类推就是B,C,最后把这50个值返回给c
x=linspace(0,3,nx); %linspace是很多语言的内置函数,用来线性的空格,这里是从0到3,中间给40个坑,为什么是3呢?
y=arrayfun(@(c)sin(x*c)+randn(1,nx)/10+x*randn/5,cind,'UniformOutput',false);

%内联函数,类似的还有cellfun,structfun等等,跟lamda函数的用法是一样的,
就是一种不需要去申明函数名称的匿名用法,优点是简便,不然得像常规函数
一样去申明。Apply a function to each element of an array,在这里就是说
有个以c为因变量的函数sin(x*c)+randn(1,nx)/10+x*randn/5,其中c的值从cind里取,
每取一个就带到函数里去求函数值,这里cind有50个值,得到的y也就
有50个值(只是这50个值,是由50个cell值组成的,因为函数内的randn(1,nx)产生
的是40个均值为1的正态分布值);UniformOutput为false,在help arrayfun里的
解释是说结果值可以是cell类型等任意类型,如果这个值是true,返回值只能
是array型,我们跟着作者的步伐走就行,不纠结到底用true还是false,
咱们就用false。
以上,就把2D数据值及其group都准备好了,接下来就是要条用Gramm了

clear g    %清除工作空间中的object g
g(1,1)=gramm('x',x,'y',y,'color',c);
g(1,2)=copy(g(1));
g(2,1)=copy(g(1));
g(2,2)=copy(g(1));  %这上面貌似是2*2的矩阵形式来组织整个object g

g(1,1).geom_point();  %绘制点图,就是将x,y的值按照2D形式画在图片上,
geom_point()按照group(A B C)来分组显示各组的数据点
g(1,1).set_title('geom_point()');

g(1,2).geom_line();  %绘制线图,就是在点图的基础上,把每次trajectory的40个点连起来
g(1,2).set_title('geom_line()');

g(2,1).stat_smooth();  %绘制平滑图,在线图的基础上,进行平滑操作
g(2,1).set_point_options('base_size',3);
g(2,1).set_title('stat_smooth()');


g(2,2).stat_summary();  %绘制统计图,mean&95% CI,我特地试了下
stat_summary("type","std"),半透明区域很大,见下图
看来标准差跟置信区间差的不是一点点啊。
g(2,2).set_title('stat_summary()');

g.set_title('Visualization of repeated trajectories '); %整个g的标题

figure('Position',[100 100 800 550]);  %这里指定了屏幕[left bottom width height],貌似单位应该是inch,不确定
g.draw();  %绘画呈现

在这里插入图片描述

  1. 绘制自己的图

如文章开头所说,我想单独绘制第4张图。
数据方面跟这个例子里的不一样,我的每次trajectory的数据点个数是不一样的,有的是40个点,有的是38个点,有的是36个点等等,而且这些还是同组内部就存在不同。我的数据会分为4组,pre-sci和4wks,8wks和12wks
,每组里面还分为hip, knee和ankle三组数据,到底怎么样展示才更有显著性呢?

我打算先按照一个时期分三组(hip、knee和ankle)的形式来绘制:

A. 解决每次trajector点数不一样的问题

我有30次的trajectory,我先画Line图,然后把每条line都重采样成(那个时期,例如pre-sci一次可能要48个点)最大值,重采样的函数resample,写个简单循环就能完成30次的数据都统一长度,而且这种拉伸数据对于步态数据是合理的。

B. 编程
在组织好原始数据之后,可以确定
N = 30;
nx = 65;
cval={‘Hip’ ‘Knee’ ‘Ankle’};
cind=repmat(cval,1,N);

x=linspace(0,3,nx);

Y = y’; %因为我的数据是列排布,源程序是行排布,按照源程序走

clear g
g = gramm(‘x’,x,‘y’,Y,‘color’,cind);
g.stat_summary();

g.set_title('12 wks '); %整个g的标题

figure(‘Position’,[100 100 800 550]);
g.draw();

得到:
在这里插入图片描述

C 改进
存在的问题:

  1. 我想要的是上中下三条分开的曲线
  2. 曲线没有平滑,显得实验次数过少,要么增实验trial,要么就平滑,我选择平滑

针对上面两个问题,改进方法如下:
上中下排列
仿照Grouping option in gramm得第(3,1)个图添加g.facet_grid(cind,[]) %按cind里的group行排列画布
平滑
g.state_summary(‘type’, ‘fitnormalci’)
在这里插入图片描述

Enjoy it!
Alt

  • 18
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值