zoukankan      html  css  js  c++  java
  • pandas补充(其二)与matplotlib补充

    今日内容概要

    • pandas补充知识(2)
    • matplotlib补充知识

    今日内容详细

    pandas补充

    数据汇总

    # 数据透视表
    pd.pivot_table(data,values-None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
    
    data:指定需要构造透视表的数据集
    values:指定需要拉入“数值”框的字段列表
    index:指定需要拉入“行标签”框的字段列表
    columns:指定需要拉入“列标签”框的字段列表
    aggfunc:指定数值的统计函数,默认为统计均值,也可以指定
    numpy模块中的其他统计函数
    
    fill_value:指定一个标量,用于填充缺失值
    margins:bool类型参数,是否需要显示行或列的总计值,默认为False
    dropna:bool类型参数,是否需要删除整列为缺失值的字段,默认为True
    margins_name:指定行或列的总计名称,默认为All
      
    data06 = pd.read_csv(r'diamonds.csv')
    data06.head()
    
    pd.pivot_table(data06, index = 'color', values='price', aggfunc='mean')
    pd.pivot_table(data06, index = 'color', columns='clarity', values='price', aggfunc='size')
    

    分组与聚合

    import numpy as np
    # 通过groupby方法,指定分组变量
    grouped = data06.groupby(by = ['color','cut'])
    # 对分组变量进行统计汇总
    result = grouped.aggregate({'color':np.size, 'carat':np.min, 
                                'price':np.mean, 'table':np.max})
    
    
    
    # 调整变量名的顺序
    result = pd.DataFrame(result, columns=['color','carat','price','table'])
    
    
    # 数据集重命名
    result.rename(columns={'color':'counts',
                           'carat':'min_weight',
                           'price':'avg_price',
                           'table':'max_table'}, 
                  inplace=True)
    

    练习题

    # 分析NBA各球队冠军次数及球员FMVP次数
    res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')  ### 返回的是一个列表  列表中是当前页面的所有表格数据
    type(res)
    res
    
    # 获取有效数据
    champion = res[0]
    champion
    
    # 针对冠军字段分组
    champion.groupby('冠军').groups
    
    # 获取分组之后的各分组大小
    champion.groupby('冠军').size()
    # 获取各组冠军次数
    champion.groupby('冠军').size().sort_values(ascending=False)  # 升序
    
    # 分组字段可以一次性取多个
    champion.groupby(['冠军', 'FMVP']).size()
    

    数据的合并

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
    
    objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 
    axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列
    join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 
    join_axes:合并数据后,指定保留的数据轴 
    ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引
    keys:为合并后的数据添加新索引,用于区分各个数据部分
      
      
    # 构造数据集df1和df2
    df1 = pd.DataFrame({
      'name':['张三','李四','王二'], 
      'age':[21,25,22], 
      'gender':['男','女','男']}
    )
    df2 = pd.DataFrame({
      'name':['丁一','赵五'], 
      'age':[23,22], 
      'gender':['女','女']}
    )
    # 数据集的纵向合并
    pd.concat([df1,df2] , keys = ['df1','df2'])  # 加keys参数可以在合并之后看到数据来源
    
    pd.concat([df1,df2] , keys = ['df1','df2']).reset_index() 
    
    
    pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1', axis = 1).rename(columns = {'level_0':'Class'})
    
    
    
    # 如果df2数据集中的“姓名变量为Name”
    df2 = pd.DataFrame({
      'Name':['丁一','赵五'], 
      'age':[23,22], 
      'gender':['女','女']}
    )
    # 数据集的纵向合并
    pd.concat([df1,df2])
    # concat行合并,数据源的变量名称完全相同(变量名顺序没有要求)
    

    数据的连接

    pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))
    
    """
    emp
    	id 	name age dep_id
    dep
    	id  dep_name dep_desc
    select * from emp inner join dep on emp.dep_id = dep.id;
    """
    left:指定需要连接的主表
    right:指定需要连接的辅表
    how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer(union) 
    on:指定连接两张表的共同字段
    left_on:指定主表中需要连接的共同字段
    right_on:指定辅表中需要连接的共同字段 
    left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False 
    right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False 
    sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False 
    suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
      
      
    # 构造数据集
    df3 = pd.DataFrame({
      'id':[1,2,3,4,5],
      'name':['张三','李四','王二','丁一','赵五'],
      'age':[27,24,25,23,25],
      'gender':['男','男','男','女','女']})
    df4 = pd.DataFrame({
      'Id':[1,2,2,4,4,4,5], 
      'score':[83,81,87,75,86,74,88], 
      'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']})
    df5 = pd.DataFrame({
      'id':[1,3,5],
      'name':['张三','王二','赵五'],
      'income':[13500,18000,15000]})
    
    # 首先df3和df4连接
    merge1 = pd.merge(left = df3, 
                      right = df4, 
                      how = 'left', 
                      left_on='id', 
                      right_on='Id')
    # 再将连接结果与df5连接
    merge2 = pd.merge(left = merge1, 
                      right = df5, 
                      how = 'left')
    

    matplotlib补充

    简介

    是一个强大的python绘图和数据可视化工具包,数据可视化也是我们数据分析重要环节之一,可以帮助我们分析出很多价值信息,也是数据分析的最后一个可视化阶段
    

    下载

    # python纯开发环境下
    pip3 install matplotlib
    # anaconda环境下
    conda install matplotlib
    '''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''
    

    导入

    import matplotlib.pyplot as plt
    

    课程目标

    1. 离散型数据的可视化 
    2. 连续性数据的可视化 
    3. 关系型数据的可视化 
    4. 多图形的组合
    

    饼图的绘制

    饼图属于最传统的统计图形之一,几乎随处可见,例如大型公司的屏幕墙、各种年度论坛的演示稿以及各大媒体发布的数据统计报告等;
    饼图是将一个圆分割成不同大小的楔(扇)形,而圆中的每一个楔形代表了不同的类别值,通常根据楔形的面积大小来判断类别值的差异;
    pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
    
    x:指定绘图的数据 
    explode:指定饼图某些部分的突出显示,即呈现爆炸式
    labels:为饼图添加标签说明,类似于图例说明 
    colors:指定饼图的填充色 
    autopct:自动添加百分比显示,可以采用格式化的方法显示 
    pctdistance:设置百分比标签与圆心的距离 
    labeldistance:设置各扇形标签(图例)与圆心的距离
      
    # 导入第三方模块
    import matplotlib.pyplot as plt
    # 解决中文乱码情况
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 构造数据
    edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
    labels = ['中专','大专','本科','硕士','其他']
    explode = [0,0.1,0,0,0]
    # 绘制饼图                                                                              plt.axes(aspect='equal')  # 如果python版本较低可能是扁的需要加该代码   
    plt.pie(x = edu,  # 绘图数据
            labels=labels,  # 添加教育水平标签
            autopct='%.1f%%',  # 设置百分比的格式,这里保留一位小数
            explode = explode
           )
    # 显示图形
    plt.show()
    

    条形图的绘制

    虽然饼图可以很好地表达离散型变量在各水平上的差异,但其不擅长对比差异不大或水平值过多的离散型变量,因为饼图是通过各扇形面积的大小来比价差异的,面积的比较有时并不直观;对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,反之亦然;
    
    bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
    
    x:传递数值序列,指定条形图中x轴上的刻度值 
    height:传递数值序列,指定条形图y轴上的高度
    指定条形图的宽度,默认为0.8 
    bottom:用于绘制堆叠条形图 
    color:指定条形图的填充色 
    edgecolor:指定条形图的边框色 
    tick_label:指定条形图的刻度标签 
    label:指定条形图的标签,一般用以添加图例
      
     
    '''垂直条形图'''
    import pandas as pd
    # 读入数据
    GDP = pd.read_excel(r'Province GDP 2017.xlsx')
    
    # 设置绘图风格(不妨使用R语言中的ggplot2风格)
    plt.style.use('ggplot')
    # 绘制条形图
    plt.bar(x = range(GDP.shape[0]), # 指定条形图x轴的刻度值
            height = GDP.GDP, # 指定条形图y轴的数值
            tick_label = GDP.Province, # 指定条形图x轴的刻度标签
            color = 'steelblue', # 指定条形图的填充色
           )
    # 添加y轴的标签
    plt.ylabel('GDP(万亿)')
    # 添加条形图的标题
    plt.title('2017年度6个省份GDP分布')
    # 为每个条形图添加数值标签
    for x,y in enumerate(GDP.GDP):
        plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
    # 显示图形    
    plt.show()
    
    
    '''水平条形图'''
    # 对读入的数据做升序排序
    GDP.sort_values(by = 'GDP', inplace = True)
    # 绘制条形图
    plt.barh(y = range(GDP.shape[0]), # 指定条形图y轴的刻度值
            width = GDP.GDP, # 指定条形图x轴的数值
            tick_label = GDP.Province, # 指定条形图y轴的刻度标签
            color = 'steelblue', # 指定条形图的填充色
           )
    # 添加x轴的标签
    plt.xlabel('GDP(万亿)')
    # 添加条形图的标题
    plt.title('2017年度6个省份GDP分布')
    # 为每个条形图添加数值标签
    for y,x in enumerate(GDP.GDP):
        plt.text(x+0.1,y,'%s' %round(x,1),va='center')
    # 显示图形    
    plt.show()
    
    
    '''交叉条形图'''
    HuRun = pd.read_excel('HuRun.xlsx')
    # Pandas模块之水平交错条形图
    HuRun_reshape = HuRun.pivot_table(index = 'City', columns='Year',
    values='Counts').reset_index()
    # 对数据集降序排序
    HuRun_reshape.sort_values(by = 2016, ascending = False, inplace = True)
    HuRun_reshape.plot(x = 'City', y = [2016,2017], kind = 'bar', 
    color = ['steelblue', 'indianred'], 
                                  # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签
                       	rot = 0, 
                       	width = 0.8, title = '近两年5个城市亿万资产家庭数比较')
    
    # 添加y轴标签
    plt.ylabel('亿万资产家庭数')
    plt.xlabel('')
    plt.show()
    

    直方图的绘制

    直方图一般用来观察数据的分布形态,横坐标代表数值的均匀分段,纵坐标代表每个段内的观
    测数量(频数);
    
    一般直方图都会与核密度图搭配使用,目的是更加清晰地掌握数据的分布特征;
    
    plt.hist(x, bins=10, normed=False, orientation='vertical', color=None, label=None)
    x:指定要绘制直方图的数据。 
    bins:指定直方图条形的个数。
    normed:是否将直方图的频数转换成频率
    orientation:设置直方图的摆放方向,默认为垂直方向 
    color:设置直方图的填充色 
    edgecolor:设置直方图边框色 
    label:设置直方图的标签,可通过legend展示其图例
      
      
      
    Titanic = pd.read_csv('titanic_train.csv')
    
    # 检查年龄是否有缺失(如果数据中存在缺失值,将无法绘制直方图)
    any(Titanic.Age.isnull())
    # 不妨删除含有缺失年龄的观察
    Titanic.dropna(subset=['Age'], inplace=True)
    # 绘制直方图
    plt.hist(x = Titanic.Age, # 指定绘图数据
             bins = 20, # 指定直方图中条块的个数
             color = 'steelblue', # 指定直方图的填充色
             edgecolor = 'black' # 指定直方图的边框色
             )
    # 添加x轴和y轴标签
    plt.xlabel('年龄')
    plt.ylabel('频数')
    # 添加标题
    plt.title('乘客年龄分布')
    # 显示图形
    plt.show()
    

    箱线图的绘制

    箱线图是另一种体现数据分布的图形,通过该图可以得知数据的下须值(Q1-1.5IQR)、下四 分位数(Q1)、中位数(Q2)、均值、上四分位(Q3)数和上须值(Q3+1.5IQR),更重 要的是,箱线图还可以发现数据中的异常点;
    
    plt.boxplot(x, vert=None, whis=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
    
    x:指定要绘制箱线图的数据 
    vert:是否需要将箱线图垂直摆放,默认垂直摆放
    whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差 
    patch_artist:bool类型参数,是否填充箱体的颜色;默认为False 
    meanline:bool类型参数,是否用线的形式表示均值,默认为False 
    showmeans:bool类型参数,是否显示均值,默认为False 
    showcaps:bool类型参数,是否显示箱线图顶端和末端的两条线(即上下须),默认为True showbox:bool类型参数,是否显示箱线图的箱体,默认为True
    showfliers:是否显示异常值,默认为True 
    boxprops:设置箱体的属性,如边框色,填充色等
    labels:为箱线图添加标签,类似于图例的作用 
    filerprops:设置异常值的属性,如异常点的形状、大小、填充色等 
    medianprops:设置中位数的属性,如线的类型、粗细等 
    meanprops:设置均值的属性,如点的大小、颜色等 
    capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等 
    whiskerprops:设置须的属性,如颜色、粗细、线的类型等
      
      
    Sec_Buildings = pd.read_excel('sec_buildings.xlsx')
    # 绘制箱线图
    plt.boxplot(x = Sec_Buildings.price_unit, # 指定绘图数据
                patch_artist=True, # 要求用自定义颜色填充盒形图,默认白色填充
                showmeans=True, # 以点的形式显示均值
                boxprops = {'color':'black','facecolor':'steelblue'},# 设置箱体属性,如边框色和填充色
                # 设置异常点属性,如点的形状、填充色和点的大小
                flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3,'markeredgecolor':'red'}, 
                # 设置均值点的属性,如点的形状、填充色和点的大小
                meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4}, 
                # 设置中位数线的属性,如线的类型和颜色
                medianprops = {'linestyle':'--','color':'orange'}, 
                labels = [''] # 删除x轴的刻度标签,否则图形显示刻度标签为1
               )
    # 添加图形标题
    plt.title('二手房单价分布的箱线图')
    # 显示图形
    plt.show()
    

    折线图的绘制

    对于时间序列数据而言,一般都会使用折线图反映数据背后的趋势。通常折线图的横坐标指代
    日期数据,纵坐标代表某个数值型变量,当然还可以使用第三个离散变量对折线图进行分组处
    理;
    
    plt.plot(x, y, linestyle, linewidth, color, marker,markersize, markeredgecolor, markerfactcolor,markeredgewidth, label, alpha)
    
    x:指定折线图的x轴数据 
    y:指定折线图的y轴数据
    linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认为实线 line指定折线的宽度 
    marker:可以为折线图添加点,该参数是设置点的形状 
    markersize:设置点的大小
    markeredgecolor:设置点的边框色 
    markerfactcolor:设置点的填充色 
    markeredge设置点的边框宽度 
    label:为折线图添加标签,类似于图例的作用
      
      
    %matplotlib  # 以弹框的形式显示图形
    # 数据读取
    wechat = pd.read_excel(r'wechat.xlsx')
    # 绘制单条折线图
    plt.plot(wechat.Date, # x轴数据
             wechat.Counts, # y轴数据
             linestyle = '-', # 折线类型
             linewidth = 2, # 折线宽度
             color = 'steelblue', # 折线颜色
             marker = 'o', # 折线图中添加圆点
             markersize = 6, # 点的大小
             markeredgecolor='black', # 点的边框色
             markerfacecolor='brown') # 点的填充色
    # 获取图的坐标信息
    ax = plt.gca()
    # 设置日期的显示格式  
    date_format = mpl.dates.DateFormatter("%m-%d")  
    ax.xaxis.set_major_formatter(date_format) 
    # 设置x轴每个刻度的间隔天数
    xlocator = mpl.ticker.MultipleLocator(7)
    ax.xaxis.set_major_locator(xlocator)
    # 添加y轴标签
    plt.ylabel('人数')
    # 添加图形标题
    plt.title('每天微信文章阅读人数趋势')
    # 显示图形
    plt.show()
    
    
    # 绘制两条折线图
    # 导入模块,用于日期刻度的修改
    import matplotlib as mpl
    # 绘制阅读人数折线图
    plt.plot(wechat.Date, # x轴数据
             wechat.Counts, # y轴数据
             linestyle = '-', # 折线类型,实心线
             color = 'steelblue', # 折线颜色
             label = '阅读人数'
             )
    # 绘制阅读人次折线图
    plt.plot(wechat.Date, # x轴数据
             wechat.Times, # y轴数据
             linestyle = '--', # 折线类型,虚线
             color = 'indianred', # 折线颜色
             label = '阅读人次'
             )
    # 获取图的坐标信息
    ax = plt.gca()
    # 设置日期的显示格式  
    date_format = mpl.dates.DateFormatter("%m-%d")  
    ax.xaxis.set_major_formatter(date_format) 
    # 设置x轴显示多少个日期刻度
    # xlocator = mpl.ticker.LinearLocator(10)
    # 设置x轴每个刻度的间隔天数
    xlocator = mpl.ticker.MultipleLocator(7)
    ax.xaxis.set_major_locator(xlocator)
    # 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
    plt.xticks(rotation=45)
    
    # 添加y轴标签
    plt.ylabel('人数')
    # 添加图形标题
    plt.title('每天微信文章阅读人数与人次趋势')
    # 添加图例
    plt.legend()
    # 显示图形
    plt.show()
    

    散点图的绘制

    如果需要研究两个数值型变量之间是否存在某种关系,例如正向的线性关系,或者是趋势性的
    非线性关系,那么散点图将是最佳的选择;
    
    scatter(x, y, s=20, c=None, marker='o', alpha=None, linewidths=None, edgecolors=None) 
    x:指定散点图的x轴数据
    y:指定散点图的y轴数据 
    s:指定散点图点的大小,默认为20,通过传入其他数值型变量,可以实现气泡图的绘制 
    c:指定散点图点的颜色,默认为蓝色,也可以传递其他数值型变量,通过cmap参数的色阶表示数值大小
    marker:指定散点图点的形状,默认为空心圆
    alpha:设置散点的透明度
    linewidths:设置散点边界线的宽度
    edgecolors:设置散点边界线的颜色
      
    # 读入数据
    iris = pd.read_csv(r'iris.csv')
    # 绘制散点图
    plt.scatter(x = iris.Petal_Width, # 指定散点图的x轴数据
                y = iris.Petal_Length, # 指定散点图的y轴数据
                color = 'steelblue' # 指定散点图中点的颜色
               )
    
    # 添加x轴和y轴标签
    plt.xlabel('花瓣宽度')
    plt.ylabel('花瓣长度')
    # 添加标题
    plt.title('鸢尾花的花瓣宽度与长度关系')
    # 显示图形
    plt.show()
    

    气泡图的绘制

    气泡图的实质就是通过第三个数值型变量控制每个散点的大小,点越大,代表的第三维数值越
     高,反之亦然;
    气泡图的绘制,使用的仍然是scatter函数,区别在于函数的s参数被赋予了具体的数值型变量;
    

    热力图的绘制

    热力图也称为交叉填充表,图形最典型的用法就是实现列联表的可视化,即通过图形的方式展
    现两个离散变量之间的组合关系;
    
    # matplotlib绘制热力图不太方便需要借助于seaborn模块
    sns.heatmap(data, cmap=None, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor ='white)
                
    data:指定绘制热力图的数据集 
    cmap:指定一个colormap对象,用于热力图的填充色
    annot:指定一个bool类型的值或与data参数形状一样的数组,如果为True,就在热力图的每个单元上显示数值 
    fmt:指定单元格中数据的显示格式
    annot_kws:有关单元格中数值标签的其他属性描述,如颜色、大小等 
    linewidths:指定每个单元格的边框宽度 
    linecolor:指定每个单元格的边框颜色
                
    import numpy as np
    import seaborn as sns
    # 读取数据
    Sales = pd.read_excel(r'Sales.xlsx')
    # 根据交易日期,衍生出年份和月份字段
    Sales['year'] = Sales.Date.dt.year
    Sales['month'] = Sales.Date.dt.month
    # 统计每年各月份的销售总额(绘制热力图之前,必须将数据转换为交叉表形式)
    Summary = Sales.pivot_table(index = 'month', columns = 'year', values = 'Sales', aggfunc = np.sum)
    Summary
    # 绘制热力图
    sns.heatmap(data = Summary, # 指定绘图数据
                cmap = 'PuBuGn', # 指定填充色
                linewidths = .1, # 设置每个单元格边框的宽度
                annot = True, # 显示数值
                fmt = '.1e' # 以科学计算法显示数据
                )
    #添加标题
    plt.title('每年各月份销售总额热力图')
    # 显示图形
    plt.show()
    

    组合图的绘制

    工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果;
    plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)
    
    shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3) 
    loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0) 
    rowspan:指定某个子图需要跨几行
    colspan:指定某个子图需要跨几列
    
    """
    # 设置大图框的长和高 plt.figure(figsize = (12,6))
    # 设置第一个子图的布局
    ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
    # 设置第二个子图的布局
    ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
    # 设置第三个子图的布局
    ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
    # 设置第四个子图的布局
    ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
    """
    
    # 读取数据
    Prod_Trade = pd.read_excel(r'Prod_Trade.xlsx')
    # 衍生出交易年份和月份字段
    Prod_Trade['year'] = Prod_Trade.Date.dt.year
    Prod_Trade['month'] = Prod_Trade.Date.dt.month
    
    # 设置大图框的长和高
    plt.figure(figsize = (12,6))
    # 设置第一个子图的布局
    ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
    # 统计2012年各订单等级的数量
    Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
    Class_Percent = Class_Counts/Class_Counts.sum()
    # 将饼图设置为圆形(否则有点像椭圆)
    ax1.set_aspect(aspect = 'equal')
    # 绘制订单等级饼图
    ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
    # 添加标题
    ax1.set_title('各等级订单比例')
    
    # 设置第二个子图的布局
    ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
    # 统计2012年每月销售额
    Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({'Sales':np.sum})
    # 绘制销售额趋势图
    Month_Sales.plot(title = '2012年各月销售趋势', ax = ax2, legend = False)
    # 删除x轴标签
    ax2.set_xlabel('')
    
    # 设置第三个子图的布局
    ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
    # 绘制各运输方式的成本箱线图
    sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
    # 添加标题
    ax3.set_title('各运输方式成本分布')
    # 删除x轴标签
    ax3.set_xlabel('')
    # 修改y轴标签
    ax3.set_ylabel('运输成本')
    
    # 设置第四个子图的布局
    ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
    # 2012年客单价分布直方图
    sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012], bins = 40, norm_hist = True, ax = ax4, hist_kws = {'color':'steelblue'}, kde_kws=({'linestyle':'--', 'color':'red'}))
    # 添加标题
    ax4.set_title('2012年客单价分布图')
    # 修改x轴标签
    ax4.set_xlabel('销售额')
    
    # 调整子图之间的水平间距和高度间距
    plt.subplots_adjust(hspace=0.6, wspace=0.3)
    # 图形显示
    plt.show()
    

    总结

    数据可视化工具
    	1.matplotlib
    	2.seaborn
    	3.echarts/highcharts
    
    为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
  • 相关阅读:
    程序员修炼之道:从小工到专家有感2
    3月13日
    第一次结对作业(2)
    3月12日
    3月11日
    第一次结对作业
    3月10日
    11月6日
    10月28日
    10月7日
  • 原文地址:https://www.cnblogs.com/abudrSatan1998/p/13849669.html
Copyright © 2011-2022 走看看