Logo

郎哥编程

绘制统计图

2021-03-10 34

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()函数绘制柱状图。

01.png

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,死于心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的趋势数据线。

02.png

观察统计图发现,人们因心血管疾病、癌症、糖尿病或慢性呼吸系统疾病的概率逐年降低,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]。

03.png

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


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论