(十一)Matplotlib知识学习3-python数据分析与机器学习实战(学习笔记)

文章原创,最近更新: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()

输出的结果如下:


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容