今天,给各位介绍一个Matlab中,可以绘制平行坐标图的函数parallelplot。该函数在Matlab2020a中引入,由于我用的是Matlab2016版本,这里就不对代码进行试验了。直接把官方给的代码实例,分享给各位,以供参考。
本文主要介绍parallelplot函数的常见用法、语法说明、用表格数据创建平行坐标图、指定坐标变量和组变量、使用分 bin 数据创建平行坐标图、指定坐标和组数据、在绘图中更改数据归一化、对绘图中坐标变量的类别重新排序等。
由于我用的是Matlab2016,这里就不放帮助文本了,安装Matlab2020a以上版本的,可以运行help parallelplot自行查看帮助文本。
常见用法
parallelplot(tbl)
parallelplot(tbl,'CoordinateVariables',coordvars)
parallelplot(___,'GroupVariable',grpvar)
parallelplot(data)
parallelplot(data,'CoordinateData',coorddata)
parallelplot(___,'GroupData',grpdata)
parallelplot(___,Name,Value)
parallelplot(parent,___)
p = parallelplot(___)
语法说明
parallelplot(tbl) 根据表 tbl 创建一个平行坐标图。绘图中的每个线条代表表中的一行,绘图中的每个坐标变量对应于表中的一列。默认情况下,软件绘制所有表列。
parallelplot(tbl,’CoordinateVariables’,coordvars) 根据表 tbl 中的 coordvars 变量创建一个平行坐标图。
parallelplot(___,’GroupVariable’,grpvar) 使用 grpvar 指定的表变量对绘图中的线条进行分组。在前面语法中的任何输入参数组合后指定此选项。
parallelplot(data) 根据数值矩阵 data 创建一个平行坐标图。
parallelplot(data,’CoordinateData’,coorddata) 根据矩阵 data 中的 coorddata 列创建一个平行坐标图。
parallelplot(___,’GroupData’,grpdata) 使用 grpdata 中的数据对绘图中的线条进行分组。可在上述任一适用于数值矩阵数据的输入参数组合后指定此选项。
parallelplot(___,Name,Value) 使用一个或多个名称-值对组参数指定其他选项。例如,您可以为具有数值的坐标指定数据归一化方法。
parallelplot(parent,___) 在 parent 指定的图窗、面板或选项卡中创建平行坐标图。
p = parallelplot(___) 返回 ParallelCoordinatesPlot 对象。创建对象后,使用 p 修改该对象。
用表格数据创建平行坐标图
根据医疗患者数据表创建一个平行坐标图。
加载 patients 数据集,并基于加载到工作区中的变量子集创建一个表。使用表创建一个平行坐标图。绘图中的每个线条对应于单个患者。使用绘图观测数据中的趋势。例如,绘图表明吸烟者往往具有较高的血压值(包括舒张压和收缩压)。
load patients
tbl = table(Diastolic,Smoker,Systolic);
p = parallelplot(tbl)
输出结果为:
p =
ParallelCoordinatesPlot with properties:
SourceTable: [100x3 table]
CoordinateVariables: {'Diastolic' 'Smoker' 'Systolic'}
GroupVariable: ''
Show all properties
默认情况下,软件会沿坐标标尺随机抖动绘图线条,使其不会完全重叠。这种抖动对于可视化分类数据特别有用,因为它使您能够更轻松地区分绘图线条。例如,沿 Smoker 坐标标尺观察绘图线条;这些绘图线条并没有完全对齐到 true 或 false 刻度线。
要禁用默认抖动,请将 Jitter 属性设置为 0。
p.Jitter = 0;
指定坐标变量和组变量
根据海啸数据表创建一个平行坐标图。指定要显示的表变量及其顺序,并根据其中一个变量对绘图中的线条进行分组。
将海啸数据以表形式读入工作区中。
tsunamis = readtable('tsunamis.xlsx');
使用该表中的变量子集创建一个平行坐标图。首先,增大图窗窗口大小,以防止绘图过度拥挤。然后,要指定变量及其顺序,请使用 ‘CoordinateVariables’ 名称-值对组参数。要根据有效性对海啸事件进行分组,请将 ‘GroupVariable’ 名称-值对组参数设置为 ‘Validity’。绘图中的每个线条对应于单个海啸事件。绘图表明数据集中大多数具有 Validity 值的事件被认为是确定的海啸。
figure('Units','normalized','Position',[0.3 0.3 0.45 0.4])
coordvars = {'Year','Validity','Cause','Country'};
p = parallelplot(tsunamis,'CoordinateVariables',coordvars,'GroupVariable','Validity');
使用分 bin 数据创建平行坐标图
根据包含医疗患者数据的矩阵创建一个平行坐标图。对矩阵中一个列的值进行 bin 划分,并使用分 bin 值对绘图中的线条进行分组。
加载 patients 数据集,并根据 Age、Height 和 Weight 值创建一个矩阵。使用矩阵数据创建一个平行坐标图。为绘图中的坐标变量添加标签。绘图中的每个线条对应于单个患者。
load patients
X = [Age Height Weight];
p = parallelplot(X)
输出结果为:
p =
ParallelCoordinatesPlot with properties:
Data: [100x3 double]
CoordinateData: [1 2 3]
GroupData: []
Show all properties
p.CoordinateTickLabels = {'Age (years)','Height (inches)','Weight (pounds)'};
创建一个新分类变量,该分类变量将每个患者归入三个类别之一:short、average 或 tall。设置 bin 边界,使其包括最小和最大 Height 值。
min(Height)
输出结果为:
ans = 60
max(Height)
输出结果为:
ans = 72
binEdges = [60 64 68 72];
bins = {'short','average','tall'};
groupHeight = discretize(Height,binEdges,'categorical',bins);
现在使用 groupHeight 值对平行坐标图中的线条分组。绘图表明 short 患者体重往往低于 tall 患者。
p.GroupData = groupHeight;
指定坐标和组数据
根据包含医疗患者数据的矩阵创建平行坐标图。对于每个绘图,指定要显示的矩阵列,并根据一个单独变量对绘图中的线条进行分组。
加载 patients 数据集,并基于加载到工作区的变量中的一部分创建一个矩阵。
load patients
X = [Age Height Weight];
使用矩阵 X 中的列的子集创建一个平行坐标图。要指定列及其顺序,请使用 ‘CoordinateData’ 名称-值对组参数。通过将 Smoker 值传递给 ‘GroupData’ 名称-值对组参数,根据患者是否为吸烟者对其进行分组。绘图中的每个线条对应于单个患者。绘图表明是否为吸烟者与年龄或体重之间没有明显的关系。
coorddata = [1 3];
p = parallelplot(X,'CoordinateData',coorddata,'GroupData',Smoker)
输出结果为:
p =
ParallelCoordinatesPlot with properties:
Data: [100x3 double]
CoordinateData: [1 3]
GroupData: [100x1 logical]
Show all properties
p.CoordinateTickLabels = {'Age','Weight'};
使用 X 中列的另一个子集创建另一个平行坐标图。根据患者的性别对其进行分组。绘图表明男人的身高和体重高于女人。
coorddata2 = [2 3];
p2 = parallelplot(X,'CoordinateData',coorddata2,'GroupData',Gender)
输出结果为:
p2 =
ParallelCoordinatesPlot with properties:
Data: [100x3 double]
CoordinateData: [2 3]
GroupData: {100x1 cell}
Show all properties
p2.CoordinateTickLabels = {'Height','Weight'};
在绘图中更改数据归一化
根据停电数据表创建一个平行坐标图。更改数值坐标变量的归一化方法。
将停电数据以表形式读入工作区中。显示表的前几行。
outages = readtable('outages.csv');
head(outages)
输出结果为:
ans=8×6 table
Region OutageTime Loss Customers RestorationTime Cause
_____________ ________________ ______ __________ ________________ ___________________
{'SouthWest'} 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 {'winter storm' }
{'SouthEast'} 2003-01-23 00:49 530.14 2.1204e+05 NaT {'winter storm' }
{'SouthEast'} 2003-02-07 21:15 289.4 1.4294e+05 2003-02-17 08:14 {'winter storm' }
{'West' } 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 {'equipment fault'}
{'MidWest' } 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 {'severe storm' }
{'West' } 2003-06-18 02:49 0 0 2003-06-18 10:54 {'attack' }
{'West' } 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 {'equipment fault'}
{'West' } 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 {'equipment fault'}
创建一个名为 OutageDuration 的新变量,指示每次停电持续的时间。将 OutageDuration 转换为每次停电持续的天数。将该新变量添加到 outages 表中,并将其命名为 OutageDays。
OutageDuration = outages.RestorationTime - outages.OutageTime;
outages.OutageDays = days(OutageDuration);
使用 Loss、Customers 和 OutageDays 变量创建一个平行坐标图。由于坐标变量是数值,因此使用 ‘DataNormalization’ 和 ‘Jitter’ 名称-值对组参数将绘图中的值显示为 z 值,不使用任何抖动。
coordvars = {'Loss','Customers','OutageDays'};
p = parallelplot(outages,'CoordinateVariables',coordvars,'DataNormalization','zscore','Jitter',0);
OutageDays 变量包含一个偏离 OutageDays 均值超过 30 倍标准差的值和另一个偏离均值超过 10 倍标准差的值。将鼠标悬停在绘图中的值上以显示数据提示。每个数据提示表示与绘图中的线条对应的表行。
在 outages 表中查找具有刚才识别的 OutageDays 极值的行。您会注意到,这两次停电的 RestorationTime 值是不正常的。
outliers = outages([1011 269],:)
输出结果为:
outliers=2×7 table
Region OutageTime Loss Customers RestorationTime Cause OutageDays
_____________ ________________ ______ __________ ________________ ____________________ __________
{'NorthEast'} 2009-08-20 02:46 NaN 1.7355e+05 2042-09-18 23:31 {'severe storm' } 12083
{'MidWest' } 2008-02-07 06:18 2378.7 0 2019-08-14 16:16 {'energy emergency'} 4206.4
对绘图中坐标变量的类别重新排序
创建一个平行坐标图。对其中一个坐标变量的类别重新排序。
将停电数据以表形式读入工作区中。
outages = readtable('outages.csv');
使用表中的列的子集创建一个平行坐标图。根据导致停电的事件对绘图中的线条分组。
coordvars = [1 3 4 6];
p = parallelplot(outages,'CoordinateVariables',coordvars,'GroupVariable','Cause');
通过更新源表,更改 Cause 中事件的顺序。首先,将 Cause 转换为一个 categorical 变量,指定事件的新顺序,并使用 reordercats 函数创建一个名为 orderCause 的新变量。然后,在绘图的源表中,用新 orderCause 变量替换原来的 Cause 变量。
categoricalCause = categorical(p.SourceTable.Cause);
newOrder = {'attack','earthquake','energy emergency','equipment fault', ...
'fire','severe storm','thunder storm','wind','winter storm','unknown'};
orderCause = reordercats(categoricalCause,newOrder);
p.SourceTable.Cause = orderCause;
由于 Cause 变量包含七个以上的类别,因此绘图中的一些组具有相同的颜色。通过更改 p 的 Color 属性,为每个组分配不同颜色。
p.Color = parula(10);
转载文章,原文出处:MathWorks官网,由古哥整理发布
如若转载,请注明出处:https://iymark.com/articles/878.html