您的位置:首页 > 编程语言 > Python开发

python数据可视化--Matplotlib

2020-03-17 12:14 906 查看

文章目录

  • 二、折线图实战
  • 三、散点图实战
  • 四、柱状图实战
  • 五、饼状图实战
  • 一、Matplotlib基础

    1、Matplotlib介绍

    Matplotlib是python最著名的绘图库,由各种可视化类构成。
    Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
    我们可以提前先看一个柱状效果图:

    import numpy as np
    import matplotlib.pyplot as plt    #  导入库N = 5
    menMeans = (20,35,30,35,27)          #数据值
    womenMeans = (25,32,34,20,25)
    menStd =(2,3,4,1,2)
    womenStd = (3,5,2,3,3)
    ind = np.arange(N)       #将X轴分为组
    width = 0.35            #柱状图的宽度
    p1=plt.bar(ind,menMeans,width,yerr=menStd)
    p2=plt.bar(ind,womenMeans,width,bottom=menMeans,yerr=womenStd)  # p2在p1柱状图上累加
    plt.ylabel("Scores")     #  y轴标签
    plt.title("Scores by group and gender")   #  图表标题
    plt.xticks(ind,("G1","G2","G3","G4","G5"))    #  x轴分组标签
    plt.yticks(np.arange(0,81,10))
    plt.legend((p1[0],p2[0]),("Men","Women"))    #  图例
    plt.show()

    显示如下:

    2、快速绘图

    1、Matplotlib中函数库通过如下语句载入:

    import matplotlib.pyplot as plt    #  导入库

    2、调用figure创建一个绘图对象,通过figsize参数可以指定绘图对象的宽和高,也可以不创建绘图对象直接调用plot函数直接绘图,matplotlib会自动创建一个绘图对象。

    plt.figure(figsize=(8,4))

    3、plot函数调用方式灵活,使用关键字参数指定各种属性:

    • label:给所绘制的曲线定义名字一个,此名字在图示(legend)中显示。只要在字符串前后添加“$”符号,matplotlib就会使用内嵌的latex引擎绘制的数学公式。
    • color:指定曲线的颜色
    • linewidth:指定曲线的宽度
    • 参数“b–”指定曲线的颜色和线型

    可通过一系列函数设置对象的各个属性:

    • xlabel、ylabel:设置x、y轴的文字

    • title:设置图标的标题

    • ylim:设置y轴的范围

    • legend:图例显示

    • plt.show():显示出绘图对象

    • 可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式可以设置png:,dpi:分辨率

    plt.savefig("test.png",dpi=120)

    快速绘图示例:

    import numpy as np
    import matplotlib.pyplot as plt    #  导入库#
    x = np.linspace(0,10,500)   #数据准备  x为500个数,数据密集,图像光滑
    y = np.sin(x)
    z = np.cos(x**2)
    
    plt.figure(figsize=(8,6))   #设置绘图的宽、高
    #  设置曲线属性
    plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
    plt.plot(x,z,"b--",label="$cos(x^2)$",linewidth=2)
    plt.xlabel("Time(s)")    #  x轴文字
    plt.ylabel("Volt")       #  y轴文字
    plt.title("Pyplot First Example")   # 图表标题
    plt.ylim(-1.2,1.2)      #y值范围
    plt.legend()            #图例显示  label
    plt.show()
    #plt.savefig("test1.png",dpi=120)  #在同目录下生成png文件


    4、 matplotlib基础图标如下:



    5、

    • 可以用子图来将图样(plot)放在均匀的坐标网络中。
    • plt.subplot(nrows,ncols,plot_number),用subplot函数时,需要指明网格的行列数量,以及你希望将图样放在哪一个网络区域中。
      下面将以上两个图例整合到一张图:
    import numpy as np
    import matplotlib.pyplot as plt    #  导入库#
    
    x = np.linspace(0,10,500)   #数据准备
    y = np.sin(x)
    z = np.cos(x**2)
    
    N = 5
    menMeans = (20,35,30,35,27)          #数据值
    womenMeans = (25,32,34,20,25)
    menStd =(2,3,4,1,2)
    womenStd = (3,5,2,3,3)
    ind = np.arange(N)       #将X轴分为组
    width = 0.35            #柱状图的宽度
    
    plt.subplot(2,1,1)
    plt.bar(ind,menMeans,width,yerr=menStd,label="Men")
    plt.bar(ind,womenMeans,width,bottom=menMeans,yerr=womenStd,label="Women")  # p2在p1柱状图上累加
    plt.ylabel("Scores")     #  y轴标签
    plt.title("Scores by group and gender")   #  图表标题
    plt.xticks(ind,("G1","G2","G3","G4","G5"))    #  x轴分组标签
    plt.yticks(np.arange(0,81,10))
    plt.legend(loc="upper right", fontsize = 8, borderaxespad= 0.3)    #设置图例位置、大小、图例边框的内边距
    
    plt.subplot(2,1,2)
    plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
    plt.plot(x,z,"b--",label="$cos(x^2)$",linewidth=2)
    """
    1.tight_layout命令:主要用于自动调整绘图区的大小及间距,
    使所有的绘图区及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。
    2、tight_layout命令还有三个关键字参数:pad、w_pad、h_pad。
    pad用于设置绘图区边缘与画布边缘的距离大小
    w_pad用于设置绘图区间水平距离的大小
    h_pad用于设置绘图区间垂直距离的大小
    """
    plt.tight_layout(pad=2, w_pad=3.0, h_pad=3.0)
    plt.show()
    # plt.savefig("test1.png",dpi=120)    #在同目录下生成png文件

    结果所示:

    二、折线图实战

    • 折线图通常来表示数据随时间或有序类别变化的趋势。
    • plot()函数的第一个参数表示横坐标数据。第二个参数表示纵坐标数据(如果只有一个则表示纵坐标),第三个参数表示颜色、线型和标记样式。
    • 颜色常用的有(r/g/b/m//y/k/w)
    • 线型常用的有(-/–/-.)
    • 标记样式常用的有(./,/o/v/^/s/*/D/d/x/</>/h/H/1/2/3/4/_/|)

    绘制多条曲线、曲线颜色、线型、标记等参数设置

    import matplotlib.pyplot as plt    #  导入库
    #随机取得数据
    yy = [1,2,3,4,5,3,1,2,7,8]
    xx = [2,3,4,6,7,8,6,4,3,3]
    zz = [2,2,3,6,8,3,2,7,8,6]
    #  设置属性linewidth,linestyle等关键词不能出错
    plt.plot(yy,color="r",linewidth=5,linestyle=":",label="Data 1")
    plt.plot(xx,color="g",linewidth=2,linestyle="--",label="Data 2")
    plt.plot(zz,color="b",linewidth=0.5,linestyle="-",label="Data 3")
    plt.legend(loc=2)                   #设置图例位置
    plt.xlabel("X轴名称",fontproperties="simhei")    #注意设置中文字体fontproperties="simhei"
    plt.ylabel("Y轴名称",fontproperties="simhei")
    plt.title("折线图美化示例",fontproperties="simhei")
    plt.ylim(0,10)   #  y轴范围
    plt.show()
    

    显示如下:

    折线图实战案例1:
    已知某小吃店2018年每个月份的营业额如下表所示。请用matplotlib扩展库编写程序绘制折线图对该小吃店全年营业额进行可视化,并用红色点划线连接每个月份的数据,并在每个月份的数据处使用三角形标记。

    代码如下:

    import matplotlib.pyplot as plt    #  导入库
    month = list(range(1,13))  #range左闭右开
    money = [5.2,2.7,5.8,5.7,7.3,9.2,18.7,15.6,20.5,18.0,7.8,6.9]
    plt.plot(month,money,"b--^")   #  横纵坐标、颜色、线型、标记
    
    plt.xlabel("月份",fontproperties="simhei",fontsize=14)
    plt.xlabel("营业额(万元)",fontproperties="simhei",fontsize=14)
    plt.title("小吃店2018年营业额变化趋势图",fontproperties="simhei",fontsize=18)
    
    plt.tight_layout()   #紧缩四周空白,扩大绘图区域可用面积
    plt.show()
    

    三、散点图实战

    • 在matplotlib中使用函数matplotlib.pyplot.scatter绘制散点图
    matplotlib.pyplot.scatter(x,y,s=None,c=None,maker=None,norm=None,vmin=None,
    vmax=None,alpha=None,linewidths=None,verts=None,
    edgecolor=None,hold=None,data=None,)
    • 常用的参数有:x,y组成了三点的坐标;s为散点的面积;c为散点的颜色(默认蓝色“b”)kmarker为散点的标记lalpha为散点的透明度(0与1之间,0完全透明,1完全不透明);linewidths为散点边缘的线宽;如果marker为None,则verts的值构建散点标记,edgecolors为散点边缘颜色

    绘制普通散点图

    import numpy as np
    import matplotlib.pyplot as plt
    
    #10个点
    N=10
    x = np.random.rand(N)
    y = np.random.rand(N)
    plt.scatter(x,y)
    plt.show()


    更改散点大小

    import numpy as np
    import matplotlib.pyplot as plt
    
    #10个点
    N=10
    x = np.random.rand(N)
    y = np.random.rand(N)
    
    # 每个点设置随机大小
    area=(30*np.random.rand(N))**1.5
    
    plt.scatter(x,y,s=area)
    plt.show()


    更改散点颜色、透明度

    import numpy as np
    import matplotlib.pyplot as plt
    
    #10个点
    N=10
    x = np.random.rand(N)
    y = np.random.rand(N)
    
    # 每个点设置随机大小
    area=(30*np.random.rand(N))**1.5
    #  颜色随机
    color=np.random.rand(N)
    
    plt.scatter(x,y,s=area,c=color,alpha=0.6) #alpha设置透明度
    plt.show()


    更改散点形状

    import numpy as np
    import matplotlib.pyplot as plt
    
    #10个点
    N=10
    x = np.random.rand(N)
    y = np.random.rand(N)
    
    # 每个点设置随机大小
    area=(30*np.random.rand(N))**1.5
    #  颜色随机
    color=np.random.rand(N)
    
    plt.scatter(x,y,s=area,c=color,alpha=0.6,marker="^") #alpha设置透明度   marker设置散点形状
    plt.show()


    一张图绘制两组数据散点图,增加图例

    import numpy as np
    import matplotlib.pyplot as plt
    
    #10个点
    N=10
    x1 = np.random.rand(N)
    y1 = np.random.rand(N)
    x2 = np.random.rand(N)
    y2 = np.random.rand(N)
    
    # 每个点设置随机大小
    area=(30*np.random.rand(N))**1.5
    #  颜色随机
    color=np.random.rand(N)
    
    plt.scatter(x1,y1,s=area,c=color,alpha=0.6,marker="^",label="circle") #alpha设置透明度   marker设置散点形状
    plt.scatter(x2,y2,s=area,c=color,alpha=0.6,marker="o",label="triangle")   #label设置图例
    plt.legend(loc="best")
    plt.show()

    显示如下:

    四、柱状图实战

    在matplotlib中使用函数matplotlib.pyplot.barr绘制散点图
    主要参数:

    • x:包含所有柱子的下表的列表
    • height:y轴的数值序列,也是柱状图的高度,一般就是我们需要展示的数据
    • width:为柱状图的宽度,一般为0.8即可
    • align:柱子的对齐方式,有两个可选值:center和edge。center表示每根柱子是根据下标来对对齐,edge则表示每根柱子全部以下标为起点,然后显示到下标的右边。如不指定该参数,默认center

    可选参数:

    • color:每根柱子的颜色,可指定一个固定值或者一个列表
    • edgecolor:每根柱子边框的颜色
    • linewidth:每根柱子边框宽度。如无设置,默认无边框
    • tick_label:每根柱子上显示的标签,默认无标签
    • xerr:每根柱子顶部在横轴方向的线段长度
    • yerr:每根柱子顶部在纵轴方向的线段长度
    • ecolor:设置xerr和yerr的线段颜色,可指定一个或列表

    简单柱状图

    import matplotlib.pyplot as plt
    name_list = ["Monday","Tuesday","Friday","Sunday"]
    num_list = [2,0.6,6,9]
    
    plt.bar(range(len(num_list)),num_list,color="rgbc",tick_label=name_list)   #  x轴分组,y值,柱子颜色,柱子下标
    plt.show()


    条形柱状图
    将plt.bar改为plt.barh

    import matplotlib.pyplot as plt
    name_list = ["Monday","Tuesday","Friday","Sunday"]
    num_list = [2,0.6,6,9]
    
    plt.barh(range(len(num_list)),num_list,color="rgbc",tick_label=name_list)   #  x轴分组,y值,柱子颜色,柱子下标
    plt.show()


    堆叠柱状图

    import matplotlib.pyplot as plt
    name_list = ["Monday","Tuesday","Friday","Sunday"]
    num_list = [2,0.6,6,9]
    num_list1 = [3,1,2,1]
    
    plt.bar(range(len(num_list)),num_list,color="r",tick_label=name_list,label="boy")   #  x轴分组,y值,柱子颜色,柱子下标
    plt.bar(range(len(num_list)),num_list1,color="b",tick_label=name_list,bottom=num_list,label="girl")
    plt.legend(loc="best")   #显示图例
    plt.show()


    并列柱状图

    import matplotlib.pyplot as plt
    name_list = ["Monday","Tuesday","Friday","Sunday"]
    num_list = [2,0.6,6,9]
    num_list1 = [3,1,2,1]
    x=list(range(len(num_list)))
    total_width = 0.8  #  并列柱状图总宽度
    n= 2   # 并列n个柱子
    width = total_width/n   # 每根柱子宽度
    plt.bar(x,num_list,width=width,color="r",tick_label=name_list,label="boy")   #  x轴分组,y值,柱子颜色,柱子下标
    for i in range(len(x)):   #   为第二个柱状图划分x轴组
    x[i] = x[i] + width
    plt.bar(x,num_list1,width=width,color="b",tick_label=name_list,label="girl")
    plt.legend(loc="best")   #显示图例
    plt.show()


    柱状图实战

    代码如下:

    import matplotlib.pyplot as plt
    import pandas as pd
    import  matplotlib.font_manager as fm
    data = pd.DataFrame({"月份":[1,2,3,4,5,6,7,8,9,10,11,12],
    "男装":[51,32,58,57,30,46,38,38,40,53,58,50],
    "女装":[70,30,48,73,82,80,43,25,30,49,79,60],
    "餐饮":[60,40,46,50,57,76,70,33,70,61,49,45],
    "化妆品":[110,75,130,80,83,95,87,89,96,88,86,89],
    "金银首饰":[143,100,89,90,78,129,100,97,108,152,96,87]})
    data.plot(x="月份",kind="bar")   #  绘制柱状图,指定月份为x轴
    plt.xlabel("月份",fontproperties="simhei")
    plt.ylabel("营业额(万元)",fontproperties="simhei")
    myfont=fm.FontProperties(fname="C:\Windows\Fonts\STFANGSO.TTF")  #Matplotlib的字体管理   将字体路径复制到这里
    plt.legend(prop=myfont)
    plt.show()

    显示如下:

    五、饼状图实战

    饼状图显示一个系列中各的大小与各项总和的比例。可自动根据数据的百分比画饼。
    绘制饼状图的基本语法:

    • 创建数组x的饼图,每个占面积由x/sum(x)决定。
    • 若sum(x)<1,则x数组不会被标准化,x值即为面积占比。:该情况会出现1-sum(x)的空面积
    • 若sum(x)>1,则由x[i]/sum(x)算出每一个占比,饼图360度区域军备填充。

    参数设置:

    • x:(创建饼状图的数据,每一块)的比例,如果sum(x)>1会使用sum(x)归一化;
    • explode:(每一块)离开中心距离,一个list或数组
    • label:为每个占比图添加标签
    • color:array_like,optional,default:None;若无则用currently active cycle中的颜色添加
    • autopct:控制饼图内百分比设置,可以使用format字符串或者format function;可以是 整数(“%d%%”)、浮点数(“%1.3f%%”)、字符串(“%s%%”)、函数
    • label distance:float,optional,default:1.1;label标记的绘制位置,相对于半径的比例,默认值为1.1,如<1则绘制在饼图内侧
    • pctdistance:float,optional,default:0.6;类似于label distance,指定autopct的位置刻度,默认0.6
    • shadow:bool,optional,default:False;为饼状图画阴影(Ture)
    • startangle:float,optional,default:None;起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
    • radius:float,optional,default:None;饼图的半径,若为None时,默认为1
    • counterclock:bool,optional,default:Ture;指定分数方向,逆时针(Ture)或顺时针
    • wedgeprops:bool,optional,default:None;描述每个图的边界线宽度值,参数形式“wedgeprops={“linewidth”:3}”边界线宽度为3
    • textprops:dict,optional,default:None;传递给文本对象的字典参数
    • center:list of float,optional,default:(0,0);图标的中心为,默认(0,0),也可以是两个标量的序列(sequence of 2 scalars)

    饼状图实战1:

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    
    labels = 'A','B','C','D'
    sizes = [10,20,30,40]
    explode = (0, 0.1, 0, 0)
    colors=['r', 'g','b','c']
    #       数据、标签、离中心点距离、颜色、百分比设置
    plt.pie(sizes, labels = labels, explode = explode, colors = colors, autopct = '%1.2f%%')
    plt.title('简单饼状图')
    plt.legend(loc="upper right", fontsize = 8, borderaxespad= 0.3)   #设置图例位置、大小、图例边框的内边距
    plt.show()

    饼状图实战2:


    编写代码如下:

    from itertools import groupby
    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"]=["SimHei"]
    #  每门课程的成绩用字典存储
    scores = {"操作系统":[89,70,49,87,92,84,73,62,78,81,90,65,77,82,81,79,80],
    "高等数学":[70,74,80,60,50,87,68,77,95,80,79,74,69,64,82,81],
    "英语":[83,87,69,55,80,89,96,81,83,90,54,70,79,66,85,82],
    "python编程":[90,60,82,79,88,92,85,87,89,71,45,50,80,81,87,93]}
    #  自定义分组函数,在下面的groupby()函数中使用
    def splitScore(score):
    if score >= 85:
    return "优"
    elif score >= 70:
    return "良"
    elif score >= 60:
    return "及格"
    else:
    return "不及格"
    #  统计每门课程中优、及格、不及格
    #  ratios的格式为{"课程名称":{“优”:3,“及格”:5,“不及格”:1},...}
    ratios = dict()
    for subject,subjectScore in scores.items():
    ratios[subject]={}
    #groupby函数需要对原始分数进行排序才能正确分类
    for category,num in groupby(sorted(subjectScore),splitScore):
    ratios[subject][category] = len(tuple(num))
    #  创建4个子图
    #  依次在4个子图中绘制每门课程的饼状图
    for index,subjectData in enumerate(ratios.items()):
    #  选择子图
    plt.subplot(2,2,index+1)   # index不能为0,则+1
    subjectName,subjectRatio = subjectData
    plt.pie(list(subjectRatio.values()),
    labels=list(subjectRatio.keys()),
    autopct="%1.1f%%")
    plt.xlabel(subjectName)
    plt.tight_layout(pad=2, w_pad=3.0, h_pad=3.0)
    plt.show()

    结果如下:

    • 点赞 1
    • 收藏
    • 分享
    • 文章举报
    走了又走 发布了13 篇原创文章 · 获赞 2 · 访问量 476 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: