平行坐标系图
平行坐标系图(parallel coordinates chart)
是一种用来呈现多变量;
或者高维度数据的可视化技术;
用它可以很好地呈现多个变量之间的关系;
平行坐标系背景
平行坐标系由Alfred Inselberg在1985年提出并在他以后工作中得到发展;
1990年E.J.Wegman提出使用平行坐标系进行数据探索性分析和数据可视化设计;
平行坐标系图将多维数据属性空间通过条等距离的平行轴映射到二维平面上;
每一条轴线代表一个属性维;
轴线上的取值范围从对应属性的最小值到最大值均匀分布;
每一个数据项都可以依据其属性取值而用一条跨越条平行轴的折线段表示;
相似的对象就具有相似的折线走向趋势;
优点
表达数据关系非常直观,易于理解;
缺点
表达维数决定于屏幕的水平宽度;
当维数增加时,引起垂直轴靠近,辨认数据结构和关系稍显困难;
当对大数据集进行可视化时,由于折线密度增加产生大量交叠线,难以辨认;
坐标系之间依赖关系很强,平行轴的安排序列性也是影响发现数据之间关系的因素;
绘制平行坐标系图
pandas包的parallel_coordinates()函数可以实现多数据系列平行坐标系图;
要使用sklearn包的scale()函数对数据进行标注化处理;
将数据按属性/列减去其属性/列的均值;
并除以其属性/列的方差;
最终对每个属性/每列来说所有数据都聚集在0附近,方差为1;
多数据系列
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import parallel_coordinates,andrews_curves
from sklearn.preprocessing import scale
df=pd.read_csv('d:\python\out\ParallelCoordinatesD.csv')
df['Class']=[ "Class1" if d>523 else "Class2" for d in df['reading']]
df.iloc[:,range(0,df.shape[1]-1)] = scale(df.iloc[:,range(0,df.shape[1]-1)] )
fig =plt.figure(figsize=(5.5,4.5), dpi=100)
parallel_coordinates(df,'Class',color=["#45BFFC","#90C539" ],linewidth=1)
plt.grid(b=0, which='both', axis='both')
plt.legend(loc="center right",
bbox_to_anchor=(1.25, 0, 0, 1),edgecolor='none',facecolor='none',title='Group')
ax = plt.gca()
ax.xaxis.set_ticks_position('top')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
plt.show()
Andrews曲线
#Andrews曲线
#Andrews曲线将每个样本的属性值转化为傅里叶序列的系数来创建曲线。
#通过将每一类曲线标成不同颜色可以可视化聚类数据,属于相同类别的样本的曲线通常更加接近并构成了更大的结构。
#iris.csv鸢尾花数据
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('d:\python\out\iris.csv')
df.head()
from pandas.plotting import andrews_curves
plt.figure()
andrews_curves(df, 'variety')
多数据平行坐标系图
#平行坐标
#平行坐标可以看到数据中的类别以及从视觉上估计其他的统计量。
#使用平行坐标时,每个点用线段联接,每个垂直的线代表一个属性,一组联接的线段表示一个数据点。可能是一类的数据点会更加接近。
#iris.csv鸢尾花数据
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('d:\python\out\iris.csv')
df.head()
from pandas.plotting import parallel_coordinates
plt.figure()
parallel_coordinates(df, 'variety')