• Python数据分析与机器学习4-Matplotlib


    一. Matplotlib介绍

    官网: https://matplotlib.org/
    中文官网: https://www.matplotlib.org.cn/intro/

    Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

    Matplotlib 可以用来绘制各种静态,动态,交互式的图表。

    Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。

    Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

    plt常用参数有:
    image.png

    image.png

    plt常画图例有:
    image.png

    如果不熟悉语法,可以在官网查找:
    https://matplotlib.org/stable/search.html?q=figure#
    image.png

    二. 数据源介绍

    2.1 UNRATE.csv

    这个数据集是美国历年的失业率数据集
    image.png

    2.2 fandango_score_comparison.csv

    电影评分的数据集
    image.png

    三. 实操

    3.1 折线图

    3.1.1 单个折线图

    代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    unrate = pd.read_csv('E:/file/unrate.csv')
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    # 选择前12行
    first_twelve = unrate[0:12]
    
    # 指定x轴和y轴的值
    plt.plot(first_twelve['DATE'], first_twelve['VALUE'])
    # 调整x轴数值显示角度
    plt.xticks(rotation=90)
    # 指定x轴、y轴及标题的 标签
    plt.xlabel('Month')
    plt.ylabel('Unemployment Rate')
    plt.title('Monthly Unemployment Trends, 1948')
    # 开始画图
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    测试记录:
    image.png

    我们从上图可以看到,x轴只显示了6个月份,其实有12个月份,其实这是被优化后的结构。

    在网上找了一堆,后面发现可以调整x轴显示数值。

    解决方法:
    了解xticks()函数中参数的含义,利用其[labels]参数解决X轴标签显示不全的现象,xticks()函数参数解释如下

    xticks()中有3个参数:
    xticks(locs, [labels], **kwargs)
    locs参数是一个数组,用于设置X轴刻度间隔
    [labels]参数也是一个数组,用于设置每个间隔的显示标签
    **kwargs可用于设置标签字体倾斜度和颜色等

    调整后的代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    unrate = pd.read_csv('E:/file/unrate.csv')
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    # 选择前12行
    first_twelve = unrate[0:12]
    
    # 指定x轴和y轴的值
    plt.plot(first_twelve['DATE'], first_twelve['VALUE'])
    
    # 指定x轴、y轴及标题的 标签
    plt.xlabel('Month')
    plt.ylabel('Unemployment Rate')
    plt.title('Monthly Unemployment Trends, 1948')
    
    # 指定x轴的值,全部输出
    time_list = first_twelve['DATE'].tolist()
    label_list=[]
    for i in range(0,len(time_list),1):
        label_list.append(time_list[i])
    
    # 调整x轴数值显示角度
    plt.xticks(label_list,rotation=90)
    
    # 开始画图
    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

    测试记录:
    image.png

    3.1.2 多个折线图

    代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    unrate = pd.read_csv('E:/file/unrate.csv')
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    
    # 提取时间中的月份
    unrate['MONTH'] = unrate['DATE'].dt.month
    
    # 计算具有指定长宽比的图形的宽度和高度
    fig = plt.figure(figsize=(6,3))
    
    # 我们分别提取 1948年和1949年的数据,然后用颜色标记出来
    plt.plot(unrate[0:12]['MONTH'], unrate[0:12]['VALUE'], c='red')
    plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    测试记录:
    image.png

    3.1.3 多个折线图(使用循环)

    代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    unrate = pd.read_csv('E:/file/unrate.csv')
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    
    # 提取时间中的月份
    unrate['MONTH'] = unrate['DATE'].dt.month
    
    # 计算具有指定长宽比的图形的宽度和高度
    fig = plt.figure(figsize=(10,6))
    
    # 定义每条线的颜色
    colors = ['red', 'blue', 'green', 'orange', 'black']
    
    # 通过循环实现
    for i in range(5):
        start_index = i*12
        end_index = (i+1)*12
        subset = unrate[start_index:end_index]
        label = str(1948 + i)
        plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i], label=label)
        
    plt.legend(loc='best')
    #print help(plt.legend)
    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

    测试记录:
    image.png

    3.2 子图操作

    通过如下操作,可以实现在同一个画板里面画出多张图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8NkuicU3-1657072173630)(https://upload-images.jianshu.io/upload_images/2638478-16b70ccf4b564c71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

    代码:

    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax1 = fig.add_subplot(3,2,1)
    ax2 = fig.add_subplot(3,2,2)
    ax2 = fig.add_subplot(3,2,6)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试记录:
    image.png

    3.3 条形图

    柱状图(bar chart): 用长方形(柱子)的长度表示数值的统计图表,又称为条形图。柱状图常用来对比两个以上的数值,适用于较小的数据集。

    Matplotlib创建柱状图的接口:bar(x, height, width, bottom, align, color)
    (1)x: 柱子的x轴坐标
    (2)height: 柱子高度,y轴坐标
    (3)width: 柱子宽度,默认0.8
    (4)bottom: 柱子底部的y轴坐标,默认为0
    (5)align: 柱子与x轴坐标的对齐方式,默认’center’
    (6)color: 柱子颜色
    (7)orientation: 柱子方向,‘horizontal’ or ‘vertical’

    3.3.1 例1

    代码:

    import matplotlib.pyplot as plt
    import pandas as pd
    from numpy import arange
    
    reviews = pd.read_csv('E:/file/fandango_scores.csv')
    num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[num_cols]
    
    # 指定的值,第0行和指定的5个列
    bar_heights = norm_reviews.loc[0, num_cols].values
    #print (bar_heights)
    bar_positions = arange(5) + 0.75
    #print (bar_positions)
    
    # 使用变量ax来表示单个的a轴
    fig, ax = plt.subplots()
    # matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
    ax.bar(bar_positions, bar_heights, 0.5)
    
    ax.set_xlabel('Rating Source')
    ax.set_ylabel('Average Rating')
    ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
    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

    测试记录:
    image.png

    3.3.2 例2

    代码:

    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示中文
    plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
    
    X_data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
    Y_data = [13, 16, 17, 21, 23, 28, 25, 21, 17, 15, 14, 10]
    
    plt.style.use('ggplot')       #添加网格线
    plt.title("柱状图标题")       #柱状图标题
    plt.xlabel("X轴名称")         #X轴名称
    plt.ylabel("Y轴名称")         #Y轴名称
    
    plt.bar(X_data, Y_data, color="blue") #绘制柱状图
    
    for i in range(len(Y_data)):
        plt.text(i, Y_data[i] + 0.5, "%s" % Y_data[i], va='center')  #显示y轴数据
    
    plt.savefig('柱状图2.jpg')    # 保存到本地文件夹,当前路径下
    plt.show()                    # 显示柱状图
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    测试记录:
    image.png

    3.4 散点图

    散点图也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。

    通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。

    数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。那些离点集群较远的点我们称为离群点或者异常点。

    image.png

    散点图的绘制,使用的是 plt.scatter 方法,这个方法有以下参数:

    1. x,y :分别是x轴和y轴的数据集。两者的数据长度必须一致。
    2. s :点的尺寸。如果是一个具体的数字,那么散点图的所有点都是一样大小,如果是一个序
      列,那么这个序列的长度应该和x轴数据量一致,序列中的每个元素代表每个点的尺寸。
    3. c :点的颜色。可以为具体的颜色,也可以为一个序列或者是一个 cmap 对象。
    4. marker :标记点,默认是圆点,也可以换成其他的。
    5. 其他参数参考:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=matplotlib%20pyplot%20scatter#matplotlib.pyplot.scatter

    代码:

    import matplotlib.pyplot as plt
    import pandas as pd
    from numpy import arange
    
    reviews = pd.read_csv('E:/file/fandango_scores.csv')
    num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[num_cols]
    
    
    #Switching Axes
    fig = plt.figure(figsize=(5,10))
    ax1 = fig.add_subplot(2,1,1)
    ax2 = fig.add_subplot(2,1,2)
    ax1.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm'])
    ax1.set_xlabel('Fandango')
    ax1.set_ylabel('Rotten Tomatoes')
    ax2.scatter(norm_reviews['RT_user_norm'], norm_reviews['Fandango_Ratingvalue'])
    ax2.set_xlabel('Rotten Tomatoes')
    ax2.set_ylabel('Fandango')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    测试记录:
    image.png

    3.5 盒图

    盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的。它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。也可以往盒图里面加入平均值(mean)。如上图。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”。上四分位数到最大值之间建立一条延伸线,这个延伸线成为“胡须(whisker)”。
    由于现实数据中总是存在各式各样地“脏数据”,也成为“离群点”,于是为了不因这些少数的离群数据导致整体特征的偏移,将这些离群点单独汇出,而盒图中的胡须的两级修改成最小观测值与最大观测值。这里有个经验,就是最大(最小)观测值设置为与四分位数值间距离为1.5个IQR(中间四分位数极差)。即

    IQR = Q3-Q1,即上四分位数与下四分位数之间的差,也就是盒子的长度。
    最小观测值为min = Q1 - 1.5IQR,如果存在离群点小于最小观测值,则胡须下限为最小观测值,离群点单独以点汇出。如果没有比最小观测值小的数,则胡须下限为最小值。
    最大观测值为max = Q3 -1.5
    IQR,如果存在离群点大于最大观测值,则胡须上限为最大观测值,离群点单独以点汇出。如果没有比最大观测值大的数,则胡须上限为最大值。

    代码:

    import matplotlib.pyplot as plt
    import pandas as pd
    from numpy import arange
    
    reviews = pd.read_csv('E:/file/fandango_scores.csv')
    num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[num_cols]
    
    fig, ax = plt.subplots()
    ax.boxplot(norm_reviews[num_cols].values)
    ax.set_xticklabels(num_cols, rotation=90)
    ax.set_ylim(0,5)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试记录:
    image.png

    参考:

    1. https://study.163.com/course/introduction.htm?courseId=1003590004#/courseDetail?tab=1
    2. https://www.yisu.com/zixun/606180.html
    3. https://www.pudn.com/news/6228cca69ddf223e1ad0fba4.html
    4. https://blog.csdn.net/weixin_44327634/article/details/123748554
  • 相关阅读:
    Linux系统编程-文件
    Matplotlib网格制作
    Spring进行AOP操作:什么是AspectJ?基于AspectJ实现AOP操作
    golang-bufio 缓冲写
    和小白一起学正则表达式
    计算机毕设(附源码)JAVA-SSM基于的企业人事管理系统
    Istio Arch-2
    初识设计模式 - 适配器模式
    02Linux各目录及每个目录的详细介绍
    3.2 自定义函数
  • 原文地址:https://blog.csdn.net/u010520724/article/details/125633477