多元统计分析——各类图的具体应用(数据可视化)

1. 轮廓图
1.1 基本介绍
在二维直角坐标系中,将 n 次观测值可画出 n 条折线构成轮廓图,其中横坐标表示各个变量,纵坐标表示与变量取值成正比的数值。

 

作图步骤
(1) 作直角坐标系,横坐标取 p 个点表示 p 个变量 .
(2) 对给定的一次观测值,在 p 个点上的纵坐标(即高度)和它对应的变取值成正比.
(3) 连接 p 个高度的顶点得一折线,则一次观测值的轮廓为一条多角折线形
1.2 实现代码
pandas.plotting.parallel_coordinates(frame, class_column)
frame DataFrame 类型的数据
class_column :字符串类型,指定哪一列包含类的名字。 Column name
containing class names.
1.3. 代码示例
pd_data=pd.read_csv("iris.csv")                                
plt.figure()
parallel_coordinates(pd_data,'Specie
s')
plt.show()       
                                                            
2. 雷达图
2.1 基本介绍
雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。轴的相对位置和角度通常是无信息的。 雷达图也称为网络图,蜘蛛图,星图,蜘蛛网图,不规则多边形,极坐标图或 Kiviat图。它相当于平行坐标图,轴径向排列。

 

作图步骤
(1) 作一圆,并把圆周分为 p 等分 .
(2) 连接圆心和各分点,把这 p 条半径依次定义为各变量的坐标轴,并标以适当的刻度.
(3) 对给定的一次观测值,把 p 个变量值分别点在相应的坐标轴上,然后连接成一个 p 边形 .
2.3. 代码示例
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif']=['SimHei']
labels=np.array([' 综合 ',' 第一周 ',' 第二周 ',' 第三周 ',' 第四周 ',' 第五周 '])
nAttr=6
Python=np.array([88.7,85,90,95,70,96])
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
Python=np.concatenate((Python,[Python[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(facecolor="white")
plt.subplot(111,polar=True)
plt.plot(angles,Python,'bo-',color='g',linewidth=2)
plt.fill(angles,Python,facecolor='g',alpha=0.2)
plt.thetagrids(angles*180/np.pi,labels)
plt.figtext(0.52,0.95,'python 成绩分析图 ',ha='center') plt.grid(True)
plt.savefig('dota_radar.png')
plt.show()

 

3. 调和曲线图
3.1 简单介绍
在数学上,较为完美的多维数据图表示方法可能是 D.F.Andcews 1972 年提出的三角多项式表示法。其思想是把多维空间中的一个点对应于二维平面上的一条曲线。

 

 

3.2 实验代码
pandas.plotting.andrews_curves(frame, class_column)
frame DataFrame 类型的数据
class_column :字符串类型,指定哪一列包含类的名字。 Column name containing
class names.
3.3 代码示例
from pandas.plotting import andrews_curves
import pandas as pd
import matplotlib.pyplot as plt
pd_data=pd.read_csv("iris.csv")
plt.figure()
andrews_curves(pd_data,'Species')
plt.show()

 

4. 散布矩阵图
4.1 相关介绍
对角线部分:
核密度估计图( Kernel Density Estimation ),就是用来看某一个 变量分布情况,横轴对应着该变量的值,纵轴对应着该变量的密度(可以理解为出现频次)。
非对角线部分:两个 变量之间分布的关联散点图。将任意两个变量进行配对,以其中一个为横坐标,另一个为纵坐标,将所有的数据点绘制在图上,用来衡量两个变量的关联度(Correlation

 

4.2 实现代码
from pandas.plotting import scatter_matrix
scatter_matrix(frame, alpha=0.5, figsize=None, marker='.')
frame pandas dataframe 对象
alpha , 图像透明度,一般取 (0,1]
figsize ,以英寸为单位的图像大小,一般以元组 (width, height) 形式设置
marker Matplotlib 可用的标记类型,如 ’.’ ’,’ ’o’ 等。
4.3 代码示例
from pandas.plotting import scatter_matrix
import pandas as pd
import matplotlib.pyplot as plt
pd_data=pd.read_csv("iris.csv")
plt.figure()
scatter_matrix (pd_data,figsize=(10,10))
plt.show()
二、实验作业
为了研究人体的心肺功能 , 31 个成年男子测量了肺活量 (OXY),并且记录了他们的年龄(age) 、体重 ( weight), 以及简单训练后的测试数据: 1.5 英里的时间 (time) 、休息时的脉搏 ( pulse) 、跑步时的脉搏( pulse)和跑步时记录的最大脉搏 ( pulse), 7 项指标 ( 数据见表 1.2)
(1) 分别绘制 OXY time age 的散布图 , 从图中可得出什么结论?
(2) 绘制 7 项指标的散布图矩阵 , 从这里能否直观看出一些结论
(3) 绘制序号为 1,2,21,22 4 个人的轮廓图和雷达图 ;
(4) 绘制序号为 1,2,21,2 4 个人的调和曲线图 ( 放在同一张图上 )
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
f=open('肺活量与其他指标的数据.txt')
data = pd.read_table(f,index_col='No')

#(1)绘制 OXY 与 time 和 age 的散布图
time = data['time']
OXY = data['OXY']
age = data['age']
plt.scatter(time,OXY) #绘制OXY与time的散布图
plt.title('OXY和time')
plt.show()
plt.scatter(age,OXY) #绘制OXY与age的散布图
plt.title('OXY和age')
plt.show()
#结论:年龄和肺活量的关系不大

#(2)绘制 7 项指标的散布图矩阵
pd.plotting.scatter_matrix(data)
#rpulse与mpulse之间,age与time之间关系明显

# (3)绘制序号为 1,2,21,22 的 4 个人的轮廓图和雷达图
plt.style.use('ggplot')
sample = data.loc[[1,2,21,22]]
sample = pd.DataFrame(sample, dtype=np.float)         #使用ggplot绘图
sample = sample.apply(lambda x:(1.1*x-x.min())/(1.2*x.max()-1.02*x.min()))   #遍历DataFrame
angles = np.linspace(0,2*np.pi,7,endpoint=False)     # 将极坐标根据长度进行等分
labels = np.array(['age', 'weight', 'time', 'spulse', 'rpulse', 'mpulse', 'OXY'])
score = [sample.loc[1].tolist(),sample.loc[2].tolist(),sample.loc[21].tolist(),sample.loc[22].tolist()]
score_a = np.concatenate((score[0], [score[0][0]]))# 使雷达图数据封闭
score_b = np.concatenate((score[1], [score[1][0]]))
score_c = np.concatenate((score[2], [score[2][0]]))
score_d = np.concatenate((score[3], [score[3][0]]))
angles = np.concatenate((angles, [angles[0]]))    #数组的拼接
labels = np.concatenate((labels, [labels[0]]))
fig = plt.figure(figsize=(8, 6), dpi=100)  # 设置图形大小
ax = plt.subplot(111, polar=True)
ax.plot(angles, score_a, color='g')   #绘制雷达图
ax.plot(angles, score_b, color='b')
ax.plot(angles, score_c, color='r')
ax.plot(angles, score_d, color='y')
ax.set_thetagrids(angles*180/np.pi, labels)# 设置雷达图中每一项的标签显示
ax.set_theta_zero_location('N')# 设置雷达图的0度起始位置
ax.set_rlim(0, 1)# 设置雷达图的坐标刻度范围
ax.set_rlabel_position(270)
ax.set_title("肺活量指标数据")
plt.legend(["1号", "2号","2-1号","2-2号"], loc='best')
plt.show()
pd.plotting.parallel_coordinates(sample, 'age')    #轮廓图
plt.legend(["1号", "2号","2-1号","2-2号"], loc='best')
plt.show()

#(4)绘制序号为 1,2,21,2 的 4 个人的调和曲线图
pd.plotting.andrews_curves(sample, 'age')
plt.legend(["1号", "2号","2-1号","2-2号"], loc='best')
plt.show()

结果示例

 

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值