为了研究人体的心肺功能,对 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 pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- from pandas.plotting import andrews_curves
-
- plt.rcParams['font.family'] = 'Microsoft YaHei'
- plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
-
- data = pd.read_csv(r"data/肺活量与其他指标的数据.txt", sep='\t')
-
- # (1) 绘制OXY与time和age的散布图
-
- plt.title("散布图")
- plt.scatter(data["OXY"], data["time"], label="OXY与time")
- plt.scatter(data["OXY"], data["age"], label="OXY与age")
- plt.legend()
- plt.grid(True)
- plt.show()
-
- # (2))绘制 7 项指标的散布图矩阵
-
- pd.plotting.scatter_matrix(data)
- plt.title("散布矩阵图")
- plt.show()
-
- # (3)绘制序号为 1,2,21,22 的 4 个人的轮廓图
-
- plt.figure()
- data1 = data.loc[[0, 1, 20, 21]]
- pd.plotting.parallel_coordinates(data1, "No")
- plt.title("轮廓图")
- plt.show()
-
- # (3)绘制序号为 1,2,21,22 的 4 个人的雷达图
-
- data1 = data1.set_index("No") # 数据处理
- labels = data1.columns.values # 特征值
- kinds = list(data1.index) # 成员变量
- data1 = pd.concat([data1, data1[[labels[0]]]], axis=1) # 再添加第一列,使雷达图闭合。
- contents = np.array(data1)
- nAttr = len(labels)
- angle = np.linspace(0, 2 * np.pi, nAttr, endpoint=False) # 平分雷达图
- angle = np.concatenate((angle, [angle[0]])) # 闭合
- labels = np.concatenate((labels, [labels[0]])) # 特征值闭合
- fig = plt.figure()
- ax = fig.add_subplot(111, polar=True)
- for i in range(len(kinds)):
- ax.plot(angle, contents[i], linewidth=1, label=kinds[i])
- ax.fill(angle, contents[i], alpha=0.2)
- ax.set_thetagrids(angle * 180 / np.pi, labels)
- plt.legend()
- plt.title("雷达图")
- plt.show()
-
- # (4)绘制序号为 1,2,21,2 的 4 个人的调和曲线图(放在同一张图上)
-
- pd.plotting.andrews_curves(data.loc[[0, 1, 20, 21]], "No")
- plt.title("调和曲线图")
- plt.show()