zoukankan      html  css  js  c++  java
  • python -- 数据可视化(二)

    python -- 数据可视化

     一、Matplotlib 绘图


     1、图形对象(图形窗口)

    mp.figure(窗口名称, figsize=窗口大小, dpi=分辨率,
                       facecolor=颜色)
    如果"窗口名称"是第一次出现,那么就创建一个新窗口,其标题栏显示该名称,如果"窗口名称"已经出现过,那么不再创建新窗口,而只是将与该名称相对应的窗口设置为当前窗口。所谓当前窗口,就是接受后续绘图操作的窗口。
    mp.title(标题文本, fontsize=字体大小)
    mp.xlabel(水平轴标签, fontsize=字体大小)
    mp.ylabel(垂直轴标签, fontsize=字体大小)
    mp.tick_params(..., labelsize=刻度标签字体大小, ...)
    mp.grid(linestyle=网格线型)
    mp.tight_layout() # 紧凑布局

    demo:

    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    x = np.linspace(-np.pi, np.pi, 1000)            # -π — π,平分为1000等份
    cos_y = np.cos(x) / 2
    sin_y = np.sin(x)
    mp.figure('Figure Object 1', figsize=(4, 3), dpi=120,
              facecolor='lightgray')                # figsize:窗口比例 ;dpi:像素 ;   facecolor:颜色
    mp.title('Figure Object 1', fontsize=16)
    mp.xlabel('x', fontsize=12)
    mp.ylabel('y', fontsize=12)
    mp.tick_params(labelsize=8)
    mp.grid(linestyle=':')
    mp.tight_layout()
    mp.figure('Figure Object 2', figsize=(4, 3), dpi=120,
              facecolor='lightgray')
    mp.title('Figure Object 2', fontsize=16)
    mp.xlabel('x', fontsize=12)
    mp.ylabel('y', fontsize=12)
    mp.tick_params(labelsize=8)
    mp.grid(linestyle=':')
    mp.tight_layout()
    mp.figure('Figure Object 1')        # 覆盖第一个窗口
    mp.plot(x, cos_y, c='dodgerblue',
            label=r'$y=frac{1}{2}cos(x)$')
    mp.legend()
    mp.figure('Figure Object 2')
    mp.plot(x, sin_y, c='orangered',
            label=r'$y=sin(x)$')        # label为备注
    mp.legend()
    mp.show()

    界面:

         


    2、条形图

    mp.bar(水平坐标, 高度, 宽度[, 底坐标], color=颜色,
        alpha=透明度, label=图例标签)

    demo:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    apples = np.array([
        30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
    oranges = np.array([
        24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])
    mp.figure('Bar', facecolor='lightgray')   # 绘图窗口
    mp.title('Bar', fontsize=20)
    mp.xlabel('Month', fontsize=14)
    mp.ylabel('Price', fontsize=14)
    mp.tick_params(labelsize=10)        # x、y label的字体大小
    mp.grid(axis='y', linestyle=':')    # 网格线,y方向,点线类型
    mp.ylim((0, 40))                    # y轴范围:0-40
    x = np.arange(len(apples))
    mp.bar(x, apples, 0.4, color='dodgerblue',
           label='Apple')                # 0.4:宽度 ;
    mp.bar(x + 0.3, oranges, 0.4, color='orangered',
           label='Orange', alpha=0.75)    # x+0.3:水平坐标,在x基础上便宜0.3
    mp.xticks(x + 0.1, [
        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])   # x+0.1:x轴偏移0.1 ;  mp.xticks(位置序列[, 标签序列])
    mp.legend()
    mp.show()

    界面:

     


    3、饼图

    mp.pie(值, 间隙, 标签, 颜色, 格式,
        shadow=是否带阴影, startangel=起始角度)

    demo:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    values = [26, 17, 21, 29, 11]
    spaces = [0.05, 0.01, 0.01, 0.01, 0.01]   # 偏移值,每个饼分图之间的距离
    labels = ['Python', 'JavaScript',
              'C++', 'Java', 'PHP']
    colors = ['dodgerblue', 'orangered',
              'limegreen', 'violet', 'gold']
    mp.figure('Pie', facecolor='lightgray')
    mp.title('Pie', fontsize=20)
    mp.pie(values, spaces, labels, colors, '%d%%',
           shadow=True, startangle=90)        # shadow:阴影 ;  startangle:角度
    # 等轴比例
    mp.axis('equal')
    mp.show()

    界面:

     


    4、等高线图

    mp.contourf(x, y, z, 阶数, cmap=颜色映射)
    mp.contour(x, y, z, 阶数, linewidths=线宽)

    demo:

    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    n = 1000
    # 网格化
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
        -x ** 2 - y ** 2)
    mp.figure('Contour', facecolor='lightgray')
    mp.title('Contour', fontsize=20)
    mp.xlabel('x', fontsize=14)
    mp.ylabel('y', fontsize=14)
    mp.tick_params(labelsize=10)
    mp.grid(linestyle=':')
    # 绘制等高线图
    mp.contourf(x, y, z, 8, cmap='jet')
    cntr = mp.contour(x, y, z, 8, colors='black',
                      linewidths=0.5)
    # 为等高线图添加高度标签
    mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
              fontsize=10)
    mp.show()

    界面:

     


     5、热成像图

    # origin ↓↓↓: 
    #    hight: 缺省,原点在左上角
    #    low:原点在左下角
    mp.imshow(矩阵, cmap=颜色映射, origin=纵轴方向)
    
    
    #demo:
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    n = 1000
    # 网格化
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
        -x ** 2 - y ** 2)
    mp.figure('Hot', facecolor='lightgray')
    mp.title('Hot', fontsize=20)
    mp.xlabel('x', fontsize=14)
    mp.ylabel('y', fontsize=14)
    mp.tick_params(labelsize=10)
    mp.grid(linestyle=':')
    # 绘制热成像图
    mp.imshow(z, cmap='jet', origin='low')
    mp.colorbar().set_label('z', fontsize=14)
    mp.show()

    界面:

     


    6、极坐标系

    mp.gca(projection='polar')
    水平坐标 -> 极角
    垂直坐标 -> 极径
    mp.plot(水平坐标, 垂直坐标, ...)
    mp.plot(极角, 极径, ...)

    demo:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    t = np.linspace(0, 2 * np.pi, 1001)  # 1001个点,1000等分
    r_spiral = 0.8 * t  # 阿基米德螺旋线
    r_rose = 5 * np.sin(6 * t)  # 六元玫瑰线
    mp.figure('Polar', facecolor='lightgray')
    mp.gca(projection='polar')  # 设置极坐标系
    mp.title('Polar', fontsize=20)
    mp.xlabel(r'$	heta$', fontsize=14)
    mp.ylabel(r'$
    ho$', fontsize=14)
    mp.tick_params(labelsize=10)
    mp.grid(linestyle=':')
    # 函数值   = f (自变量)
    # 垂直坐标 = f (水平坐标)
    # 极径     = f (极角)
    mp.plot(t, r_spiral, c='dodgerblue',
            label=r'$
    ho=0.8	heta$')
    mp.plot(t, r_rose, c='orangered',
            label=r'$
    ho=5sin(6	heta)$')
    mp.legend()
    mp.show()

    界面:

     


    7、三维曲面

    from mpl_toolkits.mplot3d import axes3d    #3d
    ax = mp.gca(projection='3d') # class axes3d 指定
    ax.set_xlabel(...)
    ...
    ax.plot_surface(x, y, z, rstride=行跨距, cstride=列跨距,
        cmap=颜色映射)   # 用于绘制表面图
    ax.plot_wireframe(x, y, z, rstride=行跨距, cstride=列跨距,
        linewidth=线宽, color=颜色)     # 用于绘制三维线框图

    demo: 

     1)三维表面图

    import numpy as np
    import matplotlib.pyplot as mp
    from mpl_toolkits.mplot3d import axes3d
    n = 1000
    # 网格化
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
        -x ** 2 - y ** 2)
    mp.figure('3D Surface')
    # 创建三维坐标系
    ax = mp.gca(projection='3d')  # 返回axes3d类的对象
    mp.title('3D Surface', fontsize=20)
    ax.set_xlabel('x', fontsize=14)
    ax.set_ylabel('y', fontsize=14)
    ax.set_zlabel('z', fontsize=14)
    mp.tick_params(labelsize=10)
    # 绘制三维表面图
    ax.plot_surface(x, y, z, rstride=10, cstride=10,
                    cmap='jet')
    mp.show()

    界面:

     

    2)三维线框图

    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    from mpl_toolkits.mplot3d import axes3d
    n = 1000
    # 网格化
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
        -x ** 2 - y ** 2)
    
    mp.figure('3D Wireframe')
    # 创建三维坐标系
    ax = mp.gca(projection='3d')  # 返回axes3d类的对象
    mp.title('3D Wireframe', fontsize=20)
    ax.set_xlabel('x', fontsize=14)
    ax.set_ylabel('y', fontsize=14)
    ax.set_zlabel('z', fontsize=14)
    mp.tick_params(labelsize=10)
    # 绘制三维线框图
    ax.plot_wireframe(x, y, z, rstride=30, cstride=30,
                      linewidth=0.5, color='dodgerblue')
    mp.show()

    界面:

     


     二、numpy进阶

    1、读取文件

    # 逻辑上可被解释为二维数组的文本文件:
    # 数据项1<分隔符>数据项2<分隔符>...<分隔符>数据项n ...
    numpy.loadtxt(
        文件路径,
        delimiter=分隔符(默认空格),
        usecols=列序列(默认读取所有列),
        unpack=是否展开列(默认为False),
        dtype=元素类型(默认为float),
        converters=转换器字典(默认不做转换))
    # unpack=False: 一个二维数组
    # unpack=True: 多个一维数组

    demo1:

    import numpy as np
    # 读取aapl.csv中的某些列数据
    dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
            '../../data/aapl.csv',   # 文件路径
            delimiter=',', 
            usecols=(1, 3, 4, 5, 6),   # 读取1,3,4,5,6 列的数据,从0计数
            unpack=True,    # 展开成多个一维数组
            dtype='M8[D], f8, f8, f8, f8',    # 每列读取出来的元素类型不一样
            ) 

     demo2:画制 K线

     K线介绍:

     

    # -*- coding: utf-8 -*-
    import datetime as dt
    import numpy as np
    import matplotlib.pyplot as mp
    import matplotlib.dates as md
    
    def dmyToymd(dmy):
        # 将"日-月-年"格式转为"年-月-日"格式
        dmy = str(dmy, encoding='utf-8')   # dmy:字节问题,通过str utf8编码,将其转换为字符串格式
        date = dt.datetime.strptime(dmy, "%d-%m-%Y").date()   # 将字符串格式的对象的dmy,转换成日期对象,且指定为date类型,不包括具体时间
        ymd = date.strftime("%Y-%m-%d")    # 将日期对象重新转换成字符串格式并返回
        return ymd
    
    
    # 读取文件数据
    # dates:日期 , opening_prices:开盘价, highest_prices:最高价 , lowest_prices:最低价 , closing_prices:收盘价
    dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
        "../data/aapl.csv",
        delimiter = ",",
        usecols = (1,3,4,5,6),       # 读取1 ,3 ,4 ,5 ,6列的数据
        unpack = True,
        dtype = "M8[D], f8, f8, f8, f8",    # 1列日期格式 Y-M-D,
        converters = {1:dmyToymd}        # 将读取到的第一列数据传入:dmyToymd函数中,执行过dmyToymd后再将值传回来,赋值给dates
    )
    
    # 画图
    mp.figure("Candlestick", facecolor="lightgray")
    mp.title("Candlestick", fontsize=20)
    mp.xlabel("Date", fontsize=14)
    mp.ylabel("Price", fontsize=14)
    ax = mp.gca()            # 拿到当前坐标轴
    ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))        # 设置水平坐标以星期(WeekdayLocator)为周期,并且设置每个星期的星期一(byweekday=md.MO)为主刻度
    ax.xaxis.set_minor_locator(md.DayLocator())        # 设置水平坐标每一天为次刻度
    ax.xaxis.set_major_formatter(md.DateFormatter("%Y-%m-%d"))  # 设置水平坐标主刻度标签格式。 md.DateFormatter("%d %b %Y"):国际通用格式
    
    mp.tick_params(labelsize=10)            # 设置刻度线label大小
    mp.grid(linestyle=":")            # 设置网格及其格式
    
    dates = dates.astype(md.datetime.datetime)        # 将dates转换成matplotlib能识别的日期格式 ,不然会报错
    # 阳线掩码,收盘价高于开盘价
    rise = closing_prices - opening_prices >= 0.01
    # 阴线掩码,收盘价低于开盘价
    fall = opening_prices - closing_prices >= 0.01
    # 填充色
    fc = np.zeros(dates.size, dtype='3f4')
    fc[rise], fc[fall] = (1, 1, 1), (0, 0.5, 0)        # 填充色→ 阳线:白色 ,阴线:绿色
    # 边缘色
    ec = np.zeros(dates.size, dtype='3f4')
    ec[rise], ec[fall] = (1, 0, 0), (0, 0.5, 0)        # 边缘颜色→ 阳线:红色 ,阴线:绿色
    # 柱状图,先画上下影线,再画中间方块
    mp.bar(dates, highest_prices - lowest_prices, 0,
           lowest_prices, color=fc, edgecolor=ec)
    mp.bar(dates, closing_prices - opening_prices, 0.8,
           opening_prices, color=fc, edgecolor=ec)
    # 自动调整水平坐标轴的日期标签
    mp.gcf().autofmt_xdate()
    mp.show()

     获取到的 aapl.csv 数据:

      

     运行效果:

     



  • 相关阅读:
    CentOS 7下PXE+Kickstart无人值守安装操作系统
    利用pentestbox打造ms17-010移动"杀器"
    XSS测试代码
    sublime Text3基本配置记录+python
    CTF中那些脑洞大开的编码和加密
    信息安全相关资源
    RIP 实验
    python输出有色记录
    下载Chrome商店和Youtube资源
    mysql使用问题记录
  • 原文地址:https://www.cnblogs.com/Eric15/p/11224964.html
Copyright © 2011-2022 走看看