• Python数据分析实战(3)Python实现数据可视化


    一、数据可视化介绍

    数据可视化是指将数据放在可视环境中、进一步理解数据的技术,可以通过它更加详细地了解隐藏在数据表面之下的模式、趋势和相关性。

    Python提供了很多数据可视化的库:

    二、matplotlib和pandas画图

    1.matplotlib简介和简单使用

    matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合
    交互式地进行制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
    文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。如果需要绘制某种类型的图,只需要在这个页面中进行简单的浏览、复制、粘贴,就能实现画图。
    https://matplotlib.org/gallery.html中有大量的缩略图案例可以使用。

    matplotlib画图的子库:

    • pyplot子库
      提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
    • pylab模块
      其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。

    使用matplotlib快速绘图导入库和创建绘图对象如下:

    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(8,4))
    
    • 1
    • 2
    • 3

    创建绘图对象时,同时使它成为当前的绘图对象。
    通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;
    dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。
    因此本例中所创建的图表窗口的宽度为8 * 80 = 640像素。

    也可以不创建绘图对象直接调用plot方法绘图,matplotlib会自动创建一个绘图对象。
    如果需要同时绘制多幅图表的话,可以给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

    pyplot画图简单使用如下:

    import numpy as np
    import matplotlib.pyplot as plt # 首先载入matplotlib的绘图模块pyplot,并且重命名为plt
    
    x = np.linspace(0, 10, 1000)  
    
    y = np.sin(x)
    z = np.cos(x**2)
    
    plt.figure(figsize=(8,4))   #2 创建绘图对象
    
    plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
    plt.plot(x,z,"b--",label="$cos(x^2)$") 
    
    plt.xlabel("Time(s)") 
    plt.ylabel("Volt")
    plt.title("PyPlot First Example")
    plt.ylim(-1.2,1.2)
    plt.legend()
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    显示:
    python plt pyplot simple

    其中:

    plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
    plt.plot(x,z,"b--",label="$cos(x^2)$")
    
    • 1
    • 2

    第一行将x、y数组传递给plot之后,用关键字参数指定各种属性:

    • label
      给所绘制的曲线取一个名字,用于在图示(legend)中显示;
      在字符串前后添加$符号,就会使用内置的latex引擎绘制数学公式。
    • color
      指定曲线的颜色:颜色可以用英文单词,或者以#字符开头的三个16进制数,例如#ff0000表示红色,或者用值在0到1范围之内的三个元素的元组表示,例如(1.0, 0.0, 0.0)也表示红色。
    • linewidth
      指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw
    • 曲线样式
      第三个参数b--指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式,其中b表示蓝色,–表示线型为虚线。
      在IPython中输入plt.plot?可以查看格式化字符串以及各个参数的详细说明。
    plt.xlabel("Time(s)") 
    plt.ylabel("Volt")
    plt.title("PyPlot First Example")
    plt.ylim(-1.2,1.2)
    plt.legend()
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    • xlabel、ylabel
      分别设置X、Y轴的标题文字。
    • title
      设置子图的标题。
    • xlim、ylim
      分别设置X、Y轴的显示范围。
    • legend
      显示图示,即图中表示每条曲线的标签(label)和样式的矩形区域。

    最后调用plt.show()显示出绘图窗口。

    一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图Axes)。可以使用subplot函数快速绘制有多个轴的图表。
    subplot函数的调用形式如下:

    subplot(numRows, numCols, plotNum)
    
    • 1

    subplot将整个绘图区域等分为numRows行和numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。
    如果numRows、numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)subplot(3,2,3)是相同的。
    subplot在plotNum指定的区域中创建一个轴对象,如果新创建的轴和之前创建的轴重叠,之前的轴将被删除。

    如下:

    for idx, color in enumerate("rgbyck"):
        plt.subplot(320+idx+1, facecolor=color)
    plt.show()
    
    • 1
    • 2
    • 3

    显示:
    python plt pyplot subplot

    可以看到:
    创建3行2列共6个轴,通过facecolor参数给每个轴设置不同的背景颜色。

    如果希望某个轴占据整个行或者列的话,可以如下:

    plt.subplot(221) # 第一行的左图
    plt.subplot(222) # 第一行的右图
    plt.subplot(212) # 第二整行
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    显示:
    python plt pyplot subplot whole

    再举一个创建子图的例子:

    plt.figure(1) # 创建图表1
    plt.figure(2) # 创建图表2
    ax1 = plt.subplot(211) # 在图表2中创建子图1
    ax2 = plt.subplot(212) # 在图表2中创建子图2
     
    x = np.linspace(0, 3, 100)
    for i in range(5):
        plt.figure(1) # 选择图表1
        plt.plot(x, np.exp(i*x/3))
        plt.sca(ax1) # 选择图表2的子图1   Set the current Axes instance to ax.
        plt.plot(x, np.sin(i*x))
        plt.sca(ax2) # 选择图表2的子图2
        plt.plot(x, np.cos(i*x))
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    显示:
    python plt pyplot subplot for

    首先通过figure()创建了两个图表,它们的序号分别为1和2;
    然后在图表2中创建了上下并排的两个子图,并用变量ax1和ax2保存。
    在循环中:
    先调用figure(1)让图表1成为当前图表,并在其中绘图。
    然后调用sca(ax1)sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。
    当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两个子图之间切换,逐步在其中添加新的曲线即可。

    其中,twinx()可以为图增加纵坐标轴,使用如下:

    x = np.arange(1, 21, 0.1)
     
    y1 = x * x
    y2 = np.log(x)
     
    plt.plot(x, y1)
     
    # 添加一条y轴的坐标轴
    plt.twinx()
    plt.plot(x, y2)
     
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    显示:
    python plt pyplot twinx

    进一步使用如下:

    import numpy as np
    import matplotlib.pyplot as plt
     
    x = np.arange(1, 20, 1)
    y1 = x * x
    y2 = np.log(x)
     
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    ax1.plot(x, y1, label = "$y1 = x * x$", color = "r")
    ax1.legend(loc = 0)
    # 设置对应坐标轴的名称
    ax1.set_ylabel("y1")
    ax1.set_xlabel("Compare y1 and y2")
     
    # 设置x轴刻度的数量
    ax = plt.gca()
    ax.locator_params("x", nbins = 20)
     
    # 添加坐标轴,并在新添加的坐标轴中画y2 = log(x)图像
    ax2 = plt.twinx()
    ax2.set_ylabel("y2")
    ax2.plot(x, y2, label = "$y2 = log(x)$")
    ax2.legend(loc = 0)
     
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    显示:
    python plt pyplot twinx detail

    2.matplotlib常见作图类型

    画图在工作中在所难免,尤其在进行数据探索时显得尤其重要,matplotlib常见的一些作图种类如下:

    • 散点图
    • 条形图
    • 饼图
    • 三维图

    先导入库和基础配置如下:

    from __future__ import division
    from numpy.random import randn
    import numpy as np
    import os
    import matplotlib.pyplot as plt
    np.random.seed(12345)
    plt.rc('figure', figsize=(10, 6))
    from pandas import Series, DataFrame
    import pandas as pd
    np.set_printoptions(precision=4)
    
    get_ipython().magic(u'matplotlib inline')
    get_ipython().magic(u'pwd')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    打印:

    'XXX\3_Visualization_Of_Data_Analysis\basicuse'
    
    • 1

    基础画图如下:

    # matplotlib创建图表
    plt.plot([1,2,3,2,3,2,2,1])
    plt.show()
    
    plt.plot([4,3,2,1],[1,2,3,4])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    显示:
    python plt pyplot type basic

    画三角函数曲线如下:

    # 画简单的图形
    from pylab import *
    x=np.linspace(-np.pi,np.pi,256,endpoint=True)
    c,s=np.cos(x),np.sin(x)
    plot(x,c, color="blue", linewidth=2.5, linestyle="-", label="cosine")
    plot(x,s,color="red", linewidth=2.5, linestyle="-", label="sine")
    show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    显示:
    python plt pyplot type sincos

    画散点图如下:

    # 散点图
    from pylab import *
    n = 1024
    X = np.random.normal(0,1,n)
    Y = np.random.normal(0,1,n)
    scatter(X,Y)
    show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    显示:
    python plt pyplot type scatter

    画条形图如下:

    #条形图
    from pylab import *
    n = 12
    X = np.arange(n)
    Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
    Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
    bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    for x,y in zip(X,Y1):
     text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
    ylim(-1.25,+1.25)
    show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    显示:
    python plt pyplot type bar

    饼图如下:

    #饼图
    from pylab import *
    n = 20
    Z = np.random.uniform(0,1,n)
    pie(Z)
    show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    显示:
    python plt pyplot type pie

    画立体图如下:

    #画三维图
    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    from pylab import *
    fig=figure()
    ax=Axes3D(fig)
    x=np.arange(-4,4,0.1)
    y=np.arange(-4,4,0.1)
    x,y=np.meshgrid(x,y)
    R=np.sqrt(x**2+y**2)
    z=np.sin(R)
    ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot')
    show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    显示:
    python plt pyplot type Axes3D

    画其他简单图形如下:

    #更多简单的图形
    x = [1,2,3,4]
    y = [5,4,3,2]
    
    plt.figure()
    plt.subplot(2,3,1)
    plt.plot(x, y)
    
    plt.subplot(232)
    plt.bar(x, y)
    
    plt.subplot(233)
    plt.barh(x, y)
    
    plt.subplot(234)
    plt.bar(x, y)
    y1 = [7,8,5,3]
    plt.bar(x, y1, bottom=y, color = 'r')
    
    plt.subplot(235)
    plt.boxplot(x)
    
    plt.subplot(236)
    plt.scatter(x,y)
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    显示:
    python plt pyplot type other

    3.使用pandas画图

    pandas中画图的主要类型包括:

    • 累和图
    • 柱状图
    • 散点图
    • 饼图
    • 矩阵散点图

    先导入所需要的库:

    from __future__ import division
    from numpy.random import randn
    import numpy as np
    import os
    import matplotlib.pyplot as plt
    np.random.seed(12345)
    from pandas import Series, DataFrame
    import pandas as pd
    %matplotlib inline
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在pandas中,有行标签、列标签和分组信息等,如果使用matplotlib画图,可能需要一大堆的代码,现在调用Pandas的plot()方法即可简单实现。

    画简单线图如下:

    #线图 
    s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
    s.plot()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    显示:
    python pandas type line series

    pandas.Series.plot()的常见参数及说明如下:

    参数说明
    参数 说明
    label 用于图例的标签
    ax 要在其上进行绘制的matplotlib subplot对象,如果没有设置,则使用当前matplotlib subplot
    style 将要传给matplotlib的风格字符串,例如'ko-'
    alpha 图表的填充不透明(0-1)
    kind 可以是'line''bar''barh''kde'
    logy 在Y轴上使用对数标尺
    use_index 将对象的索引用作刻度标签
    rot 旋转刻度标签(0-360)
    xticks 用作X轴刻度的值
    yticks 用作Y轴刻度的值
    xlim X轴的界限
    ylim Y轴的界限
    grid 显示轴网格线

    Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象,从而能够在网络布局中更为灵活地处理subplot的位置。DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。

    画多列线图如下:

    df = DataFrame(np.random.randn(10, 4).cumsum(0),
                   columns=['A', 'B', 'C', 'D'],
                   index=np.arange(0, 100, 10))
    df.plot()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    显示:
    python pandas type line dataframe

    相对于Series,DataFrame还有一些用于对列进行灵活处理的选项,例如要将所有列都绘制到一个subplot中还是创建各自的subplot等,具体如下:

    参数说明
    subplots 将各个DataFrame列绘制到单独的subplot中
    sharex 如果subplots=True,则共用同一个X轴,包括刻度和界限
    sharey 如果subplots=True,则共用同一个Y轴,包括刻度和界限
    figsize 表示图像大小的元组
    title 表示图像标题的字符串
    legend 添加—个subplot图例(默认为True)
    sort_columns 以字母表顺序绘制各列,默认使用前列顺序

    画简单累和图如下:

    #线图 CUM
    plt.close('all')
    
    s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
    s.plot()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    显示:
    python pandas type cumsum series

    画多列的类和图如下:

    df = DataFrame(np.random.randn(10, 4).cumsum(0),
                   columns=['A', 'B', 'C', 'D'],
                   index=np.arange(0, 100, 10))
    df.plot()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    显示:
    python pandas type cumsum dataframe

    当提升了数据规模之后,累和图如下:

    s = pd.Series([2, np.nan, 5, -1, 0])
    print(s)
    
    print(s.cumsum())
    
    #画累和图
    ts=pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
    ts=ts.cumsum()
    ts.plot()
    plt.show()
    df=pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=list('ABCD'))
    
    # cumulative意为累计、累积,这个函数可以返回一个累计值,经常会遇到月累计、年累计这种指标,会用这个函数
    df=df.cumsum()
    df.plot()
    plt.show()
  • 相关阅读:
    js大文件上传(切片)
    前端大文件上传(切片)
    vue大文件上传(切片)
    网页大文件上传(切片)
    web大文件上传(切片)
    FCKEditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
    umeditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
    百度web编辑器 实现ctrl+v粘贴图片并上传、word粘贴带图片
    百度编辑器 实现ctrl+v粘贴图片并上传、word粘贴带图片
    百度ueditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
  • 原文地址:https://www.cnblogs.com/kaixn/p/13643203.html
Copyright © 2020-2023  润新知