美文网首页python数据分析与机器学习实战
(十一)Matplotlib知识学习3-python数据分析与机

(十一)Matplotlib知识学习3-python数据分析与机

作者: 努力奋斗的durian | 来源:发表于2018-05-08 17:27 被阅读134次

    文章原创,最近更新:2018-05-8

    1.原数据的展示
    2.柱形图的绘制
    3.散点图的绘制
    课程来源: python数据分析与机器学习实战-唐宇迪

    为了方便大家学习,将练习所涉及的练习fandango_scores.csv文件以百度网盘共享的方式分享出来.
    链接: https://pan.baidu.com/s/1yR7qkY4SjGdCiP-hqOXQRQ 密码: wf5f

    1.原数据的展示

    fandango_scores.csv原数据在csv的展现:



    原数据是22列,每一列都是国外网站对相对应的电影的评分.

    查看一下'FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'这6列的第0行显示的数据,如下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    reviews=pd.read_csv("fandango_scores.csv")
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    
    print(norm_reviews[:1])
    
    

    输出的结果如下:

                                 FILM  RT_user_norm  Metacritic_user_nom  \
    0  Avengers: Age of Ultron (2015)           4.3                 3.55   
    
       IMDB_norm  Fandango_Ratingvalue  Fandango_Stars  
    0        3.9                   4.5             5.0  
    
    

    2.柱形图的绘制

    2.1plt.bar()函数

    想知道一个电影的集中评分,用柱形图画出来,应该怎么画呢?

    来思考一下,画一个柱形图需要什么东西呢?

    • 如果选5个媒体进行评分,每个媒体的评分值应该是多少呢?因此绘制柱形图之前,应该要把媒体对电影的评分值应该确定下来,即就是柱的高度.
    • 此外,需要将柱画在什么样的位置上?第一个柱离原点有多少远?第二个柱离第一个柱有多远?第三个柱离第二个有多远?第四个柱离第三个有多远?需要将每个柱到原点的距离定义出来.

    因此要完成上面的要求,需要用到plt.bar()函数以及plt.subplots函数

    1)plt.bar 函数签名为:
    bar(left, height, width=0.8, bottom=None, **kwargs)
    事实上,left,height,width,bottom这四个参数确定了柱体的位置和大小。默认情况下,left为柱体的居中位置(可以通过align参数来改变left值的含义),即:
    (left - width / 2, bottom)为左下角位置
    (left + width / 2, bottom + height)为右上角位置

    2) plt.subplots函数
    学习参考链接Matplotlib的子图subplot的使用
    【Matplotlib】详解图像各个部分

    Figure 和 subplot是一件非常常见的任务,于是出现了更为方便的方法(plt.subplots ),它可以创建一个新的Figure.
    并返回一个含有已创建的subplot对象的Numpy数组
    fig,axes = plt.subplots(2,3),
    这种用法,可以一下子产生2x3个子窗口,并且以numpy数组的方式保存在axes中,而fig仍然是整个图像对象,这样我们可以通过对axes进行索引来访问每个子窗口。
    看一下plt.subplots(2,3)显示的结果:


    首先要确定评分的列,将该列的数据拿出来.

    bar_positions=arange(5)+0.75,通过该段代码确定每个柱子分别离原点的距离.

    bar_heights=norm_reviews.loc[0,num_cols].values,通过该段代码确定电影的平均分,即就是当前柱子的高度.

    ax.bar(bar_positions,bar_positions,0.3),通过该段代码将柱形图依据参数进行绘制.而这里的0.3指的是柱子的宽度.

    完整的代码如下:

    import matplotlib.pyplot as plt
    from numpy import arange
    
    reviews=pd.read_csv("fandango_scores.csv")
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    num_cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    bar_heights=norm_reviews.loc[0,num_cols].values#当前柱子的高度
    bar_positions=arange(5)+0.75#分别每个柱子离原点的距离
    fig,ax=plt.subplots()
    ax.bar(bar_positions,bar_positions,0.3)
    plt.show()
    
    

    输出的结果如下:


    2.2.set_xticks、.set_xticklabels、.set_xlabe、.set_ylabel、.set_title函数

    怎么设置柱形图的x,y的名称以及标题

    需要用到到.set_xticks、.set_xticklabels、.set_xlabe、.set_ylabel、.set_title这5个函数,这5个函数具体用法如下:
    参考链接:Python--matplotlib绘图可视化知识点整理
    1).set_xticks函数&.set_xticklabels函数

    tick_positions = range(1,6)
    ax.set_xticks(tick_positions)
    

    刻度在0,1,2,3,4,5的地方生成

    ax.set_xticklabels(num_cols, rotation=45)
    

    再用set_xlabel为x轴设置每一个刻度的一个名称,名称逆时针旋转45度.


    set_xticks与set_xticklabels的结合,我们就可以任意变换我们想要的x轴标签的显示形式了,记住,set_xticks是设定标签的实际刻度,而set_xticklabels则是设定标签实际刻度显示的结果。

    3).set_xlabe以及.set_ylabel函数
    来定义x,y坐标轴标题,具体案例如下:

    ax.set_xlabel("x")
    ax.set_ylabel("sin(x),cos(x)")
    

    4).set_title函数
    设置一个标题

    注意:
    由subplots或者add_subplot添加的子窗口都是AxesSubplot对象,支持一般plt支持的大部分绘图命令。
    suplots还可以通过sharex与sharey来指定subplot应该具有相同的x轴或y轴。调节xlim与ylim会自动缩放
    各个图表的界限。

    新增的代码如下:

    tick_positions = range(1,6)
    ax.set_xticks(tick_positions)
    ax.set_xticklabels(num_cols, rotation=45)
    
    ax.set_xlabel('Rating Source')
    ax.set_ylabel('Average Rating')
    ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
    

    完整的代码如下:

    import matplotlib.pyplot as plt
    from numpy import arange
    
    
    reviews=pd.read_csv("fandango_scores.csv")
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    num_cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    bar_heights=norm_reviews.loc[0,num_cols].values#当前柱子的高度
    bar_positions=arange(5)+0.75#分别每个柱子离原点的距离
    tick_positions = range(1,6)
    fig,ax=plt.subplots()
    ax.bar(bar_positions,bar_positions,0.5)
    
    ax.set_xticks(tick_positions)
    ax.set_xticklabels(num_cols, rotation=45)
    
    ax.set_xlabel('Rating Source')
    ax.set_ylabel('Average Rating')
    ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
    plt.show()
    

    最终输出的结果如下:


    2.3旋转柱形图的x,y轴

    之前的柱形图是竖着的,如果将柱形图改成横的,又应该怎么操作?

    修改的代码如下:

    • 更改1
      修改前:bar_heights=norm_reviews.loc[0,num_cols].values
      修改后:bar_widths=norm_reviews.loc[0,num_cols].values
      只是改了变量的名称

    • 更改2
      修改前:ax.bar(bar_positions,bar_positions,0.5)
      修改后:ax.barh(bar_positions,bar_widths,0.5)
      ax.bar是柱形图竖的方向,ax.barh是柱形图横向的方向

    • 更改3
      修改前:
      ax.set_xticks(tick_positions)
      ax.set_xticklabels(num_cols, rotation=45)
      修改后:
      ax.set_yticks(tick_positions)
      ax.set_yticklabels(num_cols)

    x轴的刻度,和刻度的标签转成y轴的刻度和刻度的标签,并且将y轴刻度的标签按默认的方向放置.

    • 更改4
      修改前:
      ax.set_xlabel('Rating Source')
      ax.set_ylabel('Average Rating')
      修改后:
      ax.set_ylabel('Rating Source')
      ax.set_xlabel('Average Rating')
      x轴与y轴的标签互相调换

    完整的代码如下:

    import matplotlib.pyplot as plt
    from numpy import arange
    
    reviews=pd.read_csv("fandango_scores.csv")
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    
    bar_widths=norm_reviews.loc[0,num_cols].values#当前柱子的高度
    bar_positions=arange(5)+0.75#分别每个柱子离原点的距离
    tick_positions = range(1,6)
    fig,ax=plt.subplots()
    ax.barh(bar_positions,bar_widths,0.5)
    
    ax.set_yticks(tick_positions)
    ax.set_yticklabels(num_cols)
    
    ax.set_ylabel('Rating Source')
    ax.set_xlabel('Average Rating')
    ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
    
    plt.show()
    
    

    最终显示的结果如下:


    3.散点图的绘制

    3.1基本散点图的绘制-.scatter函数的用法

    首先介绍.scatter的用法



    以及散点的形状参数marker如下:


    分析:散点图是一个点接着一个点的.散点图的点是由x轴以及y轴交叉构成的.,因此用Fandango_Ratingvalue、RT_user_norm'这两个电影评分交叉成一个点,用.scatter函数画成散点图。

    绘制基本的散点图,具体代码如下:

    import matplotlib.pyplot as plt
    
    reviews=pd.read_csv("fandango_scores.csv")
    fig,ax=plt.subplots()
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    ax.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm'])
    
    ax.set_xlabel('Fandango')
    ax.set_ylabel('Rotten Tomatoes')
    plt.show()
    

    输出的结果如下:


    3.2拆分散点图

    散点图子图的绘制

    完整的代码如下:

    import matplotlib.pyplot as plt
    fig=plt.figure(figsize=(5,10))
    ax1=fig.add_subplot(2,1,1)
    ax2=fig.add_subplot(2,1,2)
    
    reviews=pd.read_csv("fandango_scores.csv")
    cols = ['FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
    norm_reviews = reviews[cols]
    
    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()
    

    输出的结果如下:


    相关文章

      网友评论

      本文标题:(十一)Matplotlib知识学习3-python数据分析与机

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