• 数据挖掘——matplotlib


    matplotlib概述

    Mat指的是Matlab,plot指的是画图,lib即library,顾名思义,matplotlib是python专门用于开发2D图表的第三方库,使用之前需要下载该库,使用pip命令即可下载。

    pip install matplotlib
    

    1、matplotlib画图流程

    matplotlib可分为三层结构,分别为:容器层(canvas),辅助显示层和显示层,而容器显示层又可以分为画板层,画布层和绘图区。辅助显示层主要是添加网格,图例等,增加可读性。而显示层则负责是将图像显现出来。

    # 简单画图-折线图
    import matplotlib.pyplot as plt
    plt.figure()  # 容器层
    plt.plot([1, 0, 9], [4, 5, 6])   # 三个点(1,4)(0,5)(9,6)  并连线
    plt.show()  # 显示图像
    

    结果如下,依次将三点连线
    在这里插入图片描述

    2、常用操作

    (a)是否添加网格

    plt.grid(visible,linstyle,alpha)
    # visible传入布尔值,为True表示可见
    # linestyle 表示线的形状
    # alpha 表示透明系数
    

    (b) 修改刻度

    plt.xticks(ticks, [labels], **kwargs)
    # ticks:数组类型,用于设置X轴刻度间隔
    # [labels]:数组类型,用于设置每个间隔的显示标签
    # **kwargs:用于设置标签字体倾斜度和颜色等外观属性。
    

    (c )设置x,y轴说明以及标题

    plt.xlabel('name')   # 设置x轴名称
    plt.ylabel('name')   # 设置y轴名称
    plt.title('title')   # 设置标题
    

    (d)设置图例

    plt.legend(loc='best')  # loc指的为图例位置,还有其他取值,不过一般设为best即可
    

    (e) 设置多个绘图区
    如果想要在一幅图上显示多个图像,可以使用如下方法:

    figure,axes = plt.subplots(nrows,ncols)
    # 划分绘图区,参数表示几行几列,默认一行一列,即一个绘图区
    # 其返回值为一个figure对象和axes,使用axes[i]可以操作对应画图
    # 设置每个子图区和上面大部分操作相同,但是对于修改x,y轴标题和刻度的时候需要修改一下方法名
    # 修改对应的刻度使用axes[i].set_xticks(),修改x,y轴说明和标题用set_xlabel(),set_ylabel(),set_title()
    

    (f)设置图片大小

    plt.figure(figsize,dpi) 
    # figsize传入一个元组,指定figure的宽和高,单位为英寸
    # dpi指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
    

    (g)图片的保存

    plt.savefig(loc)
    # loc指存储路径,默认为当前目录
    # 注意保存必须在plt.show()之前进行,否则保存出来是一个空白图片
    

    3、常用的图形(折线图,柱状图,饼状图,直方图,散点图)

    (a) 折线图(plot)

     plt.plot(x,y,color,linestyle,label)
     """
     x:横轴数据
     y:纵轴数据
     color:颜色,可以使用RGB或者英语单词
     linestyle:线的类型
     label:标签,如果后面设置图例,需要在此设置label
     """
    

    需求:利用折线图绘制上海和北京两地上午11点到12点的气温变化,要求创建两个绘图区并显示图例,加上网格以及x轴、y轴说明,x轴时间刻度为每5分钟显示一次,y轴显示气温为0到40之间,一小格代表5摄氏度。上海温度在25-28摄氏度之间,北京温度在20-27摄氏度之间。

    import matplotlib.pyplot as plt
    import random
    plt.rcParams['font.family'] = 'STFangsong'  # 正常显示中文:仿宋体
    # 准备数据
    x = range(60)
    y_shanghai = [random.uniform(25, 28) for i in x]
    y_beijing = [random.uniform(20, 27) for i in x]
    figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=80)   # 创建两个绘图区,一行两列
    axes[0].plot(x, y_shanghai, color='red', label='上海')
    axes[1].plot(x, y_beijing, color='green', linestyle='--', label='北京')
    # 设置刻度
    time = ['11点{}分'.format(i) for i in range(0, 60, 5)]
    axes[0].set_xticks(x[::5], time)
    axes[1].set_xticks(x[::5], time)
    # 设置y轴刻度
    axes[0].set_yticks(range(0, 40, 5))
    axes[1].set_yticks(range(0, 40, 5))
    # 设置x,y轴说明
    axes[0].set_xlabel("时间")
    axes[1].set_xlabel("时间")
    axes[0].set_ylabel("温度")
    axes[1].set_ylabel("温度")
    # 设置图例,和前面plot中的label对应
    axes[0].legend()
    axes[1].legend()
    # 加入网格,透明度为0.5
    axes[0].grid(True, linestyle='--', alpha=0.5)
    axes[1].grid(True, linestyle='--', alpha=0.5)
    # 加标题
    axes[0].set_title("上海中午11点到12点气温折线图")
    axes[1].set_title("北京中午11点到12点气温折线图")
    plt.show()
    

    示意图如下所示:
    折线图实例
    (b)散点图(scatter)

    plt.scatter(x,y)
    """
    x:横轴数据
    y:纵轴数据
    散点图只在坐标系上描出对应的点,可以看出变量之间的关系
    """
    

    需求:用散点图画出房价和面积之间的关系,数据如下:房价(万元):[195.53, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9, 239.34, 140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1, 30.74, 400.02,205.35, 330.64, 283.45],对应的面积(平方米):[225.98, 247.97, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64, 163.56,120.06, 207.83, 342.75, 147.9, 53.06, 224.72, 29.51, 21.61, 483.21,245.25, 399.25, 343.35]

    import matplotlib.pyplot as plt
    plt.rcParams['font.family'] = 'STFangsong'
    # 创建画布
    plt.figure(figsize=(20, 8), dpi=80)
    # 绘制图形
    x = [225.98, 247.97, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64, 163.56,
         120.06, 207.83, 342.75, 147.9, 53.06, 224.72, 29.51, 21.61, 483.21,
         245.25, 399.25, 343.35]
    y = [195.53, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9, 239.34, 140.32,
         104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1, 30.74, 400.02,
         205.35, 330.64, 283.45]
    plt.scatter(x, y)
    plt.xlabel("房屋面积(平方米)")
    plt.ylabel("房屋价格(万元)")
    plt.xticks(range(0, 500, 50))
    plt.show()
    

    示意图如下所示:
    在这里插入图片描述
    经图像分析,房屋面积和房屋价格呈正相关。
    (c )柱状图(Bar)

    plt.bar(x,y,color)
    # x 表示x轴数据
    # y 表示y轴数据
    # color 表示颜色,可以传入一个列表
    

    需求:画出电影与对应票房的柱状图
    movie = [“头脑特工队2”,
    “沙丘:第二部分”,
    “哥斯拉大战金刚:新帝国”,
    “功夫熊猫4”,
    “猩球崛起:王国”,
    “小丑2:双重疯狂”,
    “捉鬼敢死队:冰冻帝国”,
    “鲍勃·马利:一爱”,
    “养蜂人”,
    “木法沙:狮子王”
    ]
    data = [
    850.5, # 百万美元(预测)
    720, # 百万美元(预测)
    650, # 百万美元(预测)
    600, # 百万美元(预测)
    450, # 百万美元(估计)
    800, # 百万美元(预测)
    188, # 百万美元
    177, # 百万美元
    153, # 百万美元
    690 # 百万美元(预测)
    ]

    import matplotlib.pyplot as plt
    plt.rcParams['font.family'] = 'STFangsong'
    movie = [
        "头脑特工队2",
        "沙丘:第二部分",
        "哥斯拉大战金刚:新帝国",
        "功夫熊猫4",
        "猩球崛起:王国",
        "小丑2:双重疯狂",
        "捉鬼敢死队:冰冻帝国",
        "鲍勃·马利:一爱",
        "养蜂人",
        "木法沙:狮子王"
    ]
    data = [
        850.5,  # 百万美元(预测)
        720,    # 百万美元(预测)
        650,    # 百万美元(预测)
        600,    # 百万美元(预测)
        450,    # 百万美元(估计)
        800,    # 百万美元(预测)
        188,    # 百万美元
        177,    # 百万美元
        153,    # 百万美元
        690     # 百万美元(预测)
    ]
    plt.figure(figsize=(20, 8), dpi=80)
    color = ['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g']
    plt.bar(movie, data, color=color)
    plt.grid(True, linestyle="--", alpha=0.5)
    plt.title("电影票房")
    plt.xlabel("电影名称")
    plt.ylabel("票房(百万美元)")
    plt.show()
    
    

    示意图如下所示:
    电影票房柱状图
    (d)直方图(hist)
    直方图与柱状图的区别为:直方图各个柱状之间是连续的,而柱状图是离散的。

    plt.hist(x,bins,**kwargs(density)) 
    # x为数据,bins为组数,density为频率,为True则显示为频率
    

    需求:描绘电影时长的频率分布直方图,时长数据见具体程序。

    import matplotlib.pyplot as plt
    plt.rcParams['font.family']='STFangsong'
    movie_time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127,
                  130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113,
                  150, 110, 117, 86, 95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,
                  123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103,
                  136, 118, 102, 120, 114, 105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117,
                  127, 144, 139, 139, 119, 140, 83, 110, 102, 123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109,
                  119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135, 115, 146, 137, 116, 103, 144,
                  83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141, 120,
                  117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 114, 140, 103, 130, 141, 117, 106, 114, 121,
                  114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134, 106, 144, 110, 137,
                  137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83,
                  94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]
    plt.figure(figsize=(20, 8), dpi=80)
    plt.hist(movie_time, bins=int((max(movie_time)-min(movie_time))//2), density=True)  # 频率分布直方图,所有density为True
    plt.xticks([i for i in range(min(movie_time), max(movie_time)+2, 2)])   # 加2因为range是左闭右开,防止最大值取不到,所以加2
    plt.grid(linestyle='--', alpha=0.5)
    plt.title("电影时长分布直方图")
    plt.xlabel("时长")
    plt.ylabel("频率")
    plt.show()
    

    示意图如下所示:
    电影时长频率分布直方图
    (e)饼状图

    plt.pie(x,labels,autopct,colors)
    # x:数量,根据数量自动计算百分比
    # labels:每部分名称,需要和x一一对应
    # autopct:占比指定%1.2f%%
    # colors:每部分颜色
    # 一般超过9个类的时候就不用饼图了,而使用柱形图
    

    需求:描绘电影和对应票房的饼状图。
    movie_name = [‘雷神3:诸神黄昏’, ‘正义联盟’, ‘东方快车谋杀案’, ‘寻梦环游记’, ‘全球风暴’, ‘降魔传’, ‘追捕’, ‘七十七天’, ‘密战’,‘狂兽’, ‘其它’]
    place_count = [60605, 54546, 45819, 28243, 13270, 9945, 7679, 6799, 6101, 4621, 20105]

    import matplotlib.pyplot as plt
    plt.rcParams['font.family'] = 'STFangsong'
    movie_name = ['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案', '寻梦环游记', '全球风暴', '降魔传', '追捕', '七十七天', '密战',
                  '狂兽', '其它']
    place_count = [60605, 54546, 45819, 28243, 13270, 9945, 7679, 6799, 6101, 4621, 20105]
    plt.figure(figsize=(20, 8), dpi=80)
    plt.pie(place_count, labels=movie_name, autopct="%1.2f%%", colors=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g', 'y'])
    plt.legend()
    # 将长径和短径设为相等,构成一个圆,否则为椭圆
    plt.axis('equal')
    plt.show()
    

    示意图如下所示:
    在这里插入图片描述

    4、总结

    对于各类图形的绘画,发现只是在方法名和参数上有所不同,只需要掌握折线图对应plot,散点图对应scatter,柱状图对应bar,饼图对应pie,直方图对应hist,再传入具体的参数即可。
    折线图:plt.plot(x,y) # x为横轴数据,y为纵轴数据
    散点图:plt.scatter(x,y) # x为横轴数据,y为纵轴数据
    柱状图:plt.bar(x,y) # x为横轴数据,y为纵轴数据
    饼图:plt.pie(x,labels) # x轴数据,labels为对应的标签
    直方图:plt.hist(x,bins,density) # x为数据,bins为组数,density为是否按照频率显示,默认为False

  • 相关阅读:
    推荐一款高效率前端开发神器,功能太强大了
    leetcode-06-[454]四数相加II[383]赎金信 [15] 三数之和 [18] 四数之和
    技术分享 | 无人驾驶汽车的眼睛
    MyBatis-Plus批量插入方法saveBatch
    org.springframework.beans.factory.UnsatisfiedDependencyException:
    关于android按钮颜色修改不了的原因
    java计算机毕业设计中国民航酒店分销系统源码+系统+lw+数据库+调试运行
    [笔记] FragmentVC(2021)
    Button及Button的功能扩展
    Autowired如何实现自动注入?
  • 原文地址:https://blog.csdn.net/weixin_50164178/article/details/140255261