1、绘制柱状图
柱状图由一系列高度不等的纵向条纹表示数据分布的情况,数据集一般是二维数据集。例如:鸢尾属植物数据集包括了三类不同的鸢尾属植物,利用柱状图来表示不同鸢尾属植物花萼长度均值分布。
例1 绘制不同鸢尾属植物花萼长度均值分布柱状图
案例代码见课程资源(unit3\case06.py)
# 导入numpy库
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
# 获取不同类别花萼长度数组
def calyx_length(data,category):
xindex,yindex = np.where(data==category)
calyx = [float(data[i][0]) for i in xindex]
return calyx
# 程序入口
if __name__ == '__main__':
# 从数据集文件读取第1列特征数据
data = np.genfromtxt('iris.data',delimiter=',',dtype='str')
# 提取不同类别花萼长度
setosa = calyx_length(data,"Iris-setosa")
versicolor = calyx_length(data,"Iris-versicolor")
virginica = calyx_length(data,"Iris-virginica")
# 计算花萼长度均值
mean = [np.mean(setosa),np.mean(versicolor),np.mean(virginica)]
fig, ax = plt.subplots()
# 设置Y轴刻度显示格式
yticks = mtick.FormatStrFormatter('%.2fcm')
ax.yaxis.set_major_formatter(yticks)
# 获取x数据
x = np.arange(3)
# 设置X轴刻度显示格式
plt.xticks(x, ('setosa', 'versicolor', 'virginica'))
# 绘制柱状图
plt.bar(x,mean)
#柱状图上显示具体数据
for x_text,y_text,label in zip(x,mean,mean):
plt.text(x_text,y_text,label,ha='center',va='bottom')
plt.show()代码解读
程序从文件iris.data读取鸢尾属植物数据集,然后分别调用calyx_length()函数从数据集提取Iris-setosa、Iris-versicolor、Iris-virginica类别的花萼长度,计算每个类别花萼长度的均值,调用pyplot模块的bar()函数绘制柱状图。

2、 折线图
折线图适合单个二维数据集和多个二维数据集的比较。在二维数据集中,一个维度的数据一般表示时间、类别等类型,另外一个维度表示与时间、类别对应的数据值,反映数据随时间变化的趋势、或不同类别数据的比较。
数据集30-70cancerChdEtcnew.csv存储了不同国家30岁至70岁死于心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的概率,区间为2000年至2016年。
该数据集由四个维度构成:
(Location,Period,sex,probability)
维度Location记录了样本所属国家,维度Period记录了样本时间,维度Indicator记录了样本的说明,维度sex记录了样本所属群体的性别,probability记录样本发生的概率。
例2 绘制China样本数据折线图
案例代码见课程资源(unit3\case07.py)
# 导入numpy库
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
# 提取数据集部分数据
def get_subdata(data,name):
xindex,yindex = np.where(data==name)
calyx = [list(data[i]) for i in xindex]
return calyx
# 按年分组
def get_group(data):
key_set = set()
# 提取年份
for item in data:
key_set.add(item[1])
year_list = list(key_set)
# 列表排序
year_list.sort()
return year_list
# 定义绘图函数
def plotter(ax, year, data, param_dict):
x,y = [],[]
for item in data:
if item[1] == year:
x.append(item[2])
y.append(float(item[3]))
# 绘制曲线
out = ax.plot(x,y, **param_dict)
ax.scatter(x,y)
return out
# 程序入口
if __name__ == '__main__':
# 定义曲线颜色列表
colors = ['#1f77b4',
'#ff7f0e',
'#2ca02c',
'#d62728',
'#9467bd',
'#8c564b',
'#e377c2',
'#7f7f7f',
'#bcbd22',
'#17becf']
# 读取数据集30-70cancerChdEtcnew.csv
data = np.genfromtxt('30-70cancerChdEtcnew.csv',delimiter=',',dtype='str')
# 从数据集提取China数据
china_data = get_subdata(data,"China")
# 提取China数据的年份
year_group = get_group(china_data)
fig, ax = plt.subplots(1, 1)
yticks = mtick.FormatStrFormatter('%.2f')
ax.yaxis.set_major_formatter(yticks)
yticks_value = MultipleLocator(1.5)
ax.yaxis.set_major_locator(yticks_value)
# 循环绘制不同年份折线
# sex维度为X轴,probability维度为Y轴
colorindex = 0
for year in year_group:
plotter(ax,year,china_data,{'color': colors[colorindex],'label':year})
colorindex = colorindex + 1
if colorindex > 9:
colorindex = 0
#显示图例
plt.legend()
plt.show()代码解读
程序从30-70cancerChdEtcnew.csv数据文件中提取China数据,对China数据进行分析,分析China在2000年至2016年间,30岁至70岁不同性别死于心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的发展趋势。
分析结果以折线统计图给出,每条折线描述了不同年份内Both sexes、Male、Female,死于心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的趋势数据线。

观察统计图发现,人们因心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的概率逐年降低,Male因上述疾病死亡的概率远高于Female。
3、 散点图
散点图是二维数据在直角坐标系平面上的分布图,多用于回归分析,发现因变量随自变量而变化的大致趋势,并根据趋势选择合适的函数进行拟合,建立变量间的函数模型。
数据集SOCR-HeightWeight.csv记录了25,000个18岁的不同人的身高(英寸)和体重(磅),建立用于确定人的身高或体重的预测模型。
例3 绘制数据集散点图
案例代码见课程资源(unit3\case08.py)
# 导入numpy库
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
# 数据集归一化处理
def normalization(data):
# 获取数据集的最大值和最小值
max, min = data.max(), data.min()
# max - min作为基数对数据归一化处理
result = (data - min)/(max - min)
return result
# 程序入口
if __name__ == '__main__':
# 从数据集文件读取2、3列
data = np.genfromtxt('SOCR-HeightWeight.csv',delimiter=',',skip_header=1,dtype='float',usecols=[1,2])
x = normalization(data[::,0])
y = normalization(data[::,1])
fig, ax = plt.subplots(1, 1)
# 绘制散点图
ax.scatter(x,y, s=20, c=x)
plt.show()代码解读
程序从SOCR-HeightWeight.csv数据文件中提取第1和第2列数据,第1列数据是人的身高,第2列数据是人的体重。程序对读取的数据进行了归一化处理,将全部数据映射到区间[0,1]。

观察人的身高和体重散点图发现,除去一些特殊的数据点外,身高和体重有近似的线性关系,即体重和身高是线性关系。