本示例说明了如何将文件作为表格导入到MATLAB中,如何从表格数据创建平行坐标图以及如何修改图的外观。
平行坐标图对于可视化具有多列的表格或矩阵数据很有用。输入数据的行对应于图中的线,输入数据的列对应于图中的坐标。您可以对图中的线进行分组,以更好地查看数据趋势。
将文件导入为表格
加载样本文件TemperatureData.csv
,其中包含2015年1月至2016年7月的每日平均温度。将文件读入表格,并显示前几行。
tbl = readtable('TemperatureData.csv');
head(tbl)
ans=8×4 table
Year Month Day TemperatureF
____ ___________ ___ ____________
2015 {'January'} 1 23
2015 {'January'} 2 31
2015 {'January'} 3 25
2015 {'January'} 4 39
2015 {'January'} 5 29
2015 {'January'} 6 12
2015 {'January'} 7 10
2015 {'January'} 8 4
创建基本平行坐标图
从表的前几行创建一个平行坐标图。绘图中的每一行对应于表中的一行。默认情况下,parallelplot
以表中显示的顺序显示表中所有坐标变量。软件将在其相应的坐标标尺下方显示坐标变量名称。
该图显示表的前八行提供了2015年1月前八天的温度数据。例如,第八天平均是八天中最冷的一天。
parallelplot(head(tbl))
为了帮助您解释图,MATLAB默认会随机抖动图线,以使它们不太可能沿着坐标标尺完美重叠。例如,尽管前八个观测值具有相同的Year
和Month
值,但该图并未将与2015
沿Year
坐标标尺、January
刻度线沿Month
绘制为重合的样子。尽管抖动会影响所有坐标变量,但在分类坐标标尺上抖动通常更明显,因为抖动取决于刻度线之间的距离。您可以通过设置该Jitter
属性来控制图中的抖动量。
请注意,Year
坐标标尺上的某些刻度线是无意义的十进制值。为确保坐标标尺上的刻度线仅与有意义的值相对应,请使用categorical
函数将变量转换为分类变量。
tbl.Year = categorical(tbl.Year);
现在从整个表格创建一个平行坐标图。将ParallelCoordinatesPlot
对象分配给变量p
,并p
在创建后用于修改图。例如,使用Title
属性为绘图添加标题。
p = parallelplot(tbl)
p =
ParallelCoordinatesPlot with properties:
SourceTable: [565x4 table]
CoordinateVariables: {'Year' 'Month' 'Day' 'TemperatureF'}
GroupVariable: ''
Show all properties
p.Title = 'Temperature Data';
为图线分组
按照Year
值,通过设置GroupVariable
属性,根据值将图中的线分组。默认情况下,MATLAB在图上添加图例。您可以通过将LegendVisible
属性设置为'off'
来删除图例。
p.GroupVariable = 'Year';
交互式重新排列坐标变量
以交互方式重新排列坐标变量,以更轻松地比较它们,并确定要保留在图中的变量。
在图形窗口中打开图。单击坐标刻度标签,然后将关联的坐标标尺拖到您选择的位置。该软件界面以黑色矩形勾勒出所选坐标标尺的轮廓。例如,您可以单击Month
坐标刻度标签并将坐标标尺拖到右侧。然后,您可以轻松比较Month
和TemperatureF
值。
当您重新排列交互坐标变量,该软件会更新图中相关联的CoordinateTickLabels
,CoordinateVariables
以及CoordinateData
属性。
选择坐标变量的子集
在p.SourceTable
中显示坐标变量的子集,并通过设置p
的CoordinateVariables
属性来指定其在图中的顺序。
特别地,从图中删除变量Day
,并将源表的第四列中的TemperatureF
变量,作为图中的第二个坐标显示出来。
p.CoordinateVariables = [1 4 2];
或者,可以通过使用变量名称的字符串或单元格数组、或所选变量中包含true
的元素的逻辑向量来设置CoordinateVariables
属性。
修改坐标变量中的类别
显示Month
类别的子集,并在图中沿着坐标标尺更改类别顺序。
由于某些月份仅具有一年的数据,因此请删除源表中与这些唯一月份相对应的行。更改源表后,MATLAB会立即更新绘图。
uniqueMonth = {'September','October','November','December','August'};
uniqueMonthIdx = ismember(p.SourceTable.Month,uniqueMonth);
p.SourceTable(uniqueMonthIdx,:) = [];
通过更新源表,沿着Month
坐标标尺按时间顺序排列月份。
categoricalMonth = categorical(p.SourceTable.Month);
newOrder = {'January','February','March','April','May','June','July'};
orderMonth = reordercats(categoricalMonth,newOrder);
p.SourceTable.Month = orderMonth;
使用合并值将绘图线分组
为了更好地可视化每个月的温度范围,使用discretize
来对温度数据进行分组,并使用合并后的值对图中的线进行分组。检查源表中的最低和最高温度。设置分箱边界值,使其包含这些值。
min(p.SourceTable.TemperatureF)
ans = -3
max(p.SourceTable.TemperatureF)
ans = 80
binEdges = [-3 10:10:80];
bins = {'00s+/-','10s','20s','30s','40s','50s','60s','70s+'};
groupTemperature = discretize(p.SourceTable.TemperatureF,binEdges,'categorical',bins);
将分箱的温度添加到源表中。根据合并的温度数据对图中的线进行分组。
p.SourceTable.GroupTemperature = groupTemperature;
p.GroupVariable = 'GroupTemperature';
由于GroupTemperature
包括七个以上类别,因此某些组在图中具有相同的颜色。通过设置Color
属性为每个组分配不同的颜色。
p.Color = jet(8);%设置jet调色板
注:本文根据MATLAB官网内容修改而成。
我推荐给你以下的视频教程,特点是没有PPT,不掺水,直接编程环境下的实操课程: 用100分钟了解MATLAB编程
知乎 - 安全中心www.1data.pro《MATLAB编程360》视频课程:
MATLAB编程360 - 网易云课堂study.163.comstudy.163.com