美文网首页
python进阶-04-Matplotlib

python进阶-04-Matplotlib

作者: 西海岸虎皮猫大人 | 来源:发表于2020-03-15 17:23 被阅读0次
    1 概述

    2D绘图库,可生成直方图\功率图\条形图\散点图等
    数据可视化

    安装

    Anaconda已集成了Matplotlib无需安装
    安装:

    pip install Matplotlib
    

    或者官网->PyPI->下载whl文件

    绘制基础

    title 设置图标名称
    xlabel x轴名称
    ylabel y轴名称
    xticks x轴刻度
    yticks y轴刻度
    plot 绘制线性图标
    ...
    详见文档

    绘制直线
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # 准备绘制的两个点
    # (1,2) (4,8)
    # 调用绘制方法plot
    plt.plot([1, 4], [2, 8])
    plt.show()
    
    绘制折线
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # 准备绘制点
    x = [1, 2, 3, 4, 5]
    y = [1, 4, 9, 16, 25]
    plt.plot(x, y)
    plt.show()
    

    2 设置样式

    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # 准备绘制点
    x = [1, 2, 3, 4, 5]
    y = [1, 4, 9, 16, 25]
    # 设置宽度
    plt.plot(x, y, linewidth=5)
    # 添加x轴\y轴名称
    plt.xlabel('x')
    plt.xlabel('y=x^2')
    # 解决中文标题乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    # 设置标题
    plt.title('多个点设置折线图')
    plt.show()
    

    3 绘制曲线

    绘制一元二次方程

    y = x^2


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # 准备绘制点
    x = range(-100, 100)
    y = [i**2 for i in x]
    plt.plot(x, y)
    # 保存图片,默认格式png
    plt.savefig('result')
    # 指定jpg格式
    # plt.savefig('result.jpg')
    plt.show()
    

    异常:
    保存为jpg时报错

    ValueError: Format 'jpg' is not supported (supported formats: eps, pdf, pgf, png, ps, raw, rgba, svg, svgz)
    
    绘制正弦和余弦曲线
    sin_cos.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成0-10 100个等差数
    x = np.linspace(0, 10, 100)
    sin_y = np.sin(x)
    # 绘制
    plt.plot(x, sin_y)
    
    cos_y = np.cos(x)
    plt.plot(x, cos_y)
    
    # 保存图片
    plt.savefig('sin_cos')
    plt.show()
    

    3 subplot的使用

    将画布分区域,将图画到指定的区域


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 0-10 100数的等差数列
    x = np.linspace(0, 10, 100)
    sin_y = np.sin(x)
    # 画布分为两行两列,画到第一个区
    plt.subplot(2,2,1)
    # 修改x轴\y轴的坐标范围
    plt.xlim(-5, 20)
    plt.ylim(-2, 2)
    plt.plot(x, sin_y)
    
    plt.subplot(2,2,3)
    cos_y = np.cos(x)
    plt.plot(x, cos_y)
    
    plt.show()
    

    4 散点图

    scatter函数可绘制随机点


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    sin_y = np.sin(x)
    # 绘制正弦曲线
    # plt.plot(x, sin_y)
    # 绘制散点图
    plt.scatter(x, sin_y)
    # 使用plot绘制散点图,plot绘制图形的速度优于scatter
    # 如果点的形式(大小\颜色)有差别,则使用scatter
    # plt.plot(x, sin_y, 'o')
    plt.show()
    
    设置点的大小和颜色
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 绘制10种大小 100种颜色的散点图
    # 执行多次每次获取的随机数相同
    np.random.seed(0)
    # 100个随机数,范围[0.0, 1,0)
    x = np.random.rand(100)
    y = np.random.rand(100)
    
    # 10种大小
    # size = np.random.rand(10)*1000
    size = np.random.rand(100)*1000
    # 100种颜色
    color = np.random.rand(100)
    # alpha表示透明度
    plt.scatter(x, y, s=size, c=color, alpha=0.7)
    plt.show()
    
    异常

    当大小size的个数小于点的个数时报错

    ValueError: s must be a scalar, or the same size as x and y
    

    5 绘制不同样式不同颜色的线条

    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    # 绿色短横线,加图例
    plt.plot(x, x+0, '--g', label='--g')
    # 红色点横线
    plt.plot(x, x+1, '-.r')
    # 蓝色点横线
    plt.plot(x, x+2, ':b')
    # 其他样式参考文档
    
    # 添加图例,默认位置左上角,可通过loc参数指定位置,其他参数参考文档
    # 右下角
    plt.legend(loc = "lower right")
    
    plt.show()
    

    6 绘制柱状图

    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # x表示不同年份
    x = [1980, 1985, 1990, 1995]
    x_label = ['1980年', '1985年', '1990年', '1995年']
    # y表示各年份销量
    y = [1000, 3000, 4000, 5000]
    # 绘制柱状图, width参数是原宽度的3倍
    plt.bar(x, y, width=3)
    # 修改x坐标的值
    plt.xticks(x, x_label)
    # 解决中文乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    # x轴 y轴添加名称
    plt.xlabel('年份')
    plt.ylabel('销量')
    # 标题
    plt.title('年份销量对比图')
    plt.show()
    
    

    7 barh函数

    barh水平绘制柱状图


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np![result.png](https://img.haomeiwen.com/i5880229/71fcdc6d74ee5f1d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    # 1-4
    x = np.arange(5)
    # -5-5 5个随机数
    y = np.random.randint(-5, 5, 5)
    # 画布分为1行2列, 第一个区域画bar
    plt.subplot(1,2,1)
    # color设置颜色
    plt.bar(x, y, color='blue')
    # 水平0位置加线条
    plt.axhline(0, color='blue', linewidth=2)
    plt.subplot(1,2,2)
    # barh将x\y轴对调
    plt.barh(x, y, color='red')
    # 垂直0位置加线条
    plt.axvline(0, color='red', linewidth=2)
    
    plt.show()
    
    对不同的柱设置不同颜色
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    # 1-4
    x = np.arange(5)
    # -5-5 5个随机数
    y = np.random.randint(-5, 5, 5)
    
    # color设置颜色
    v_bar = plt.bar(x, y, color='blue')
    
    # y大于0时设置为蓝色,小于0时设置为绿色
    for bar, height in zip(v_bar,y):
        if height < 0:
            bar.set(color='green')
    
    # 保存图片
    plt.savefig('result')
    plt.show()
    

    8 柱状图实例

    统计票房
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 准备数据
    # 电影名称
    real_names = ['千与千寻', '玩具总动员4', '黑衣人:全球追缉']
    real_nums1 = [7548, 4013,  1673]
    real_nums2 = [5453, 1840,  1080]
    real_nums3 = [4348, 2345,  1890]
    
    x = np.arange(len(real_names))
    width=0.3
    
    plt.bar(x, real_nums1, alpha=0.5, width=0.3, label=real_names[0])
    plt.bar([i+width for i in x], real_nums2, alpha=0.5, width=width, label=real_names[1])
    plt.bar([i+2*width for i in x], real_nums3, alpha=0.5, width=width, label=real_names[2])
    # 解决中文标题乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    x_label = ['第{}天'.format(i+1) for i in x]
    # 设置x坐标的值
    plt.xticks([i+width for i in x], x_label)
    
    # 添加纵坐标
    plt.ylabel('票房数')
    # 添加图例
    plt.legend()
    # 添加标题
    plt.title('三天内电影票房数')
    plt.show()
    
    

    9 饼状图

    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    
    # 男女人数及比例
    man = 71351
    woman = 68187
    man_perc = man/(woman+man)
    woman_perc = woman/(woman+man)
    # 添加名称
    labels = ['男', '女']
    # 解决中文标题乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    # 设置颜色
    colors = ['blue', 'red']
    # 绘制饼图 explode饼图分裂 autopct显示百分比 labels名称 colors颜色
    paches, texts, autotexts = plt.pie([man_perc, woman_perc], labels=labels, colors=colors, explode=(0, 0.05), autopct='%0.1f%%')
    # 设置字体颜色
    for text in autotexts:
        text.set_color('white')
    # 设置字体大小
    for text in texts+autotexts:
        text.set_fontsize(20)
    # 保存图片
    plt.savefig('result')
    plt.show()
    

    10 直方图

    直方图关注的是分布的状态,不关注具体的某个值


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成1000个标准正态分布随机数
    x = np.random.randn(1000)
    
    # 绘制直方图
    # plt.hist(x)
    # 绘制直方图 修改柱宽 10个柱装在一起
    plt.hist(x, bins=100)
    
    # 保存图片
    plt.savefig('result')
    plt.show()
    

    normal指定期望\方差\均值


    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成1000个 期望0 均值0.8
    x = np.random.normal(0, 0.8, 1000)
    y = np.random.normal(-2, 1, 1000)
    z = np.random.normal(3, 2, 1000)
    
    kwargs=dict(bins=100, alpha=0.5)
    # 绘制直方图
    plt.hist(x, **kwargs)
    plt.hist(y, **kwargs)
    plt.hist(z, **kwargs)
    
    # 保存图片
    plt.savefig('result')
    plt.show()
    

    11 等高线图 | 三维图

    等高线图
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(-10, 10, 100)
    y = np.linspace(-10, 10, 100)
    # 计算x/y相交的点
    X, Y = np.meshgrid(x, y)
    # 计算Z
    Z = np.sqrt(X**2+Y**2)
    # 绘制等高线图
    plt.contour(X, Y, Z)
    # 颜色填充
    # plt.contourf(X, Y, Z)
    # 保存图片
    plt.savefig('result')
    plt.show()
    
    三维图
    result.png
    # coding=utf-8
    import matplotlib.pyplot as plt
    # 导入3D包
    from mpl_toolkits.mplot3d import Axes3D
    
    # 创建X Y Z
    X = [1, 1, 2, 2]
    Y = [3, 4, 4, 3]
    Z = [1, 100, 1, 1]
    
    figure=plt.figure()
    ax = Axes3D(figure)
    ax.plot_trisurf(X, Y, Z)
    # 保存图片
    plt.savefig('result')
    plt.show()
    

    异常:
    图形无法拖动旋转,提示

    UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.
    

    相关文章

      网友评论

          本文标题:python进阶-04-Matplotlib

          本文链接:https://www.haomeiwen.com/subject/nnuyehtx.html