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

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

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

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

1.原数据的展示

对fandango_scores.csv文件,将'FILM','RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'这6列的前5行的数据提取出来.

具体代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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[:5])

输出的结果如下:

0  Avengers: Age of Ultron (2015)           4.3                 3.55   
1               Cinderella (2015)           4.0                 3.75   
2                  Ant-Man (2015)           4.5                 4.05   
3          Do You Believe? (2015)           4.2                 2.35   
4   Hot Tub Time Machine 2 (2015)           1.4                 1.70   

   IMDB_norm  Fandango_Ratingvalue  Fandango_Stars  
0       3.90                   4.5             5.0  
1       3.55                   4.5             5.0  
2       3.90                   4.5             5.0  
3       2.70                   4.5             5.0  
4       2.55                   3.0             3.5  

2.数据的分组

如截图这样的情况,数据很多,不能一一的在图例的刻度上显示,就需要对数据进行分bins处理,即就是分区域处理.比如0.0-0.5,0.5-1.0等等,对数据进行统计处理.


那应该怎么分bins处理呢?

在这里涉及到value_counts()/sort_index():

  • value_counts()
    Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
    功能:返回包含唯一值计数的对象。结果对象将按降序排列,以便第一个元素是最常出现的元素。 不包括默认的NA值,返回:计数:Serise
    • normalize : boolean, default False
      如果为True,则返回的对象将包含唯一值的相对频率。
    • sort : boolean, default True
      按值排序
    • ascending : boolean, default False
      按升序排序
    • bins : integer, optional
      而不是数值计算,把它们分成半开放的箱子,一个方便的pd.cut,只适用于数字数据
    • dropna : boolean, default True
      不包括NaN的数量。
  • sort_index()
    Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控制升序或降序,默认为升序。
    若要按值对 Series 进行排序,当使用 .order(na_last=True, ascending=True, kind='mergesort') 方法,任何缺失值默认都会被放到 Series 的末尾。
    在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数)。注意在使用sort_index对DataFrame进行排序的时候,不能直接对index和columns都含有的字段进行排序,会报错。

首先对两列的数据进行统计,并排序,完整的代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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]
fandango_distribution = norm_reviews['Fandango_Ratingvalue'].value_counts()
fandango_distribution = fandango_distribution.sort_index()

imdb_distribution = norm_reviews['IMDB_norm'].value_counts()
imdb_distribution = imdb_distribution.sort_index()

print(fandango_distribution)
print(imdb_distribution)

输出的结果如下:

2.7     2
2.8     2
2.9     5
3.0     4
3.1     3
3.2     5
3.3     4
...
4.2    12
4.3    11
4.4     7
4.5     9
4.6     4
4.8     3
Name: Fandango_Ratingvalue, dtype: int64
2.00     1
2.10     1
2.15     1
2.20     1
2.30     2
2.45     2
...
4.00     1
4.05     1
4.10     4
4.15     1
4.20     2
4.30     1
Name: IMDB_norm, dtype: int64

用ax.hist()函数对"Fandango_Ratingvalue"这一列数据进行基本的分组.

这里涉及到一个新的知识点hist()函数:

  • .hist()函数参数详解
 matplotlib.pyplot.hist(  
    x, bins=10, range=None, normed=False,   
    weights=None, cumulative=False, bottom=None,   
    histtype=u'bar', align=u'mid', orientation=u'vertical',   
    rwidth=None, log=False, color=None, label=None, stacked=False,   
    hold=None, **kwargs)  
  • x : (n,) array or sequence of (n,) arrays
    这个参数是指定每个bin(箱子)分布的数据,对应x轴
  • bins : integer or array_like, optional
    这个参数指定bin(箱子)的个数,也就是总共有几条条状图
  • normed : boolean, optional
    If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin)
    这个参数指定密度,也就是每个条状图的占比例比,默认为1
  • color : color or array_like of colors or None, optional
    这个指定条状图的颜色

对"Fandango_Ratingvalue"这一列数据进行基本的分组,代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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]

fig,ax=plt.subplots()
ax.hist(norm_reviews['Fandango_Ratingvalue'])

plt.show()

输出的结果如下:


如果将对"Fandango_Ratingvalue"这一列数据分为20组数据,又是应该怎么样分呢?

修改的地方如下:
修改前:
ax.hist(norm_reviews['Fandango_Ratingvalue'])
修改后:
ax.hist(norm_reviews['Fandango_Ratingvalue'],bins=20)

完整的代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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]

fig,ax=plt.subplots()
ax.hist(norm_reviews['Fandango_Ratingvalue'],bins=20)
plt.show()

输出的结果如下:


如果将对"Fandango_Ratingvalue"这一列数据分为20组数据,并且只对4-5之间的的数据进行分组,又是应该怎么样分呢?

修改的地方如下:
修改前:
ax.hist(norm_reviews['Fandango_Ratingvalue'],bins=20)
修改后:
ax.hist(norm_reviews['Fandango_Ratingvalue'],range=(4,5),bins=20)

完整的代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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]

fig,ax=plt.subplots()
ax.hist(norm_reviews['Fandango_Ratingvalue'],range=(4,5),bins=20)

plt.show()

输出的结果如下:

2.子图绘制

如何绘制一个画布上有4个子图?

这里有涉及到一个新的知识点:

  • .set_ylim()
    设置y轴的范围,不设置的话会自动设置合适的y值范围(可视区域最大化).
    还有类似的.set_xlim()
    设置x轴的范围

复习旧的知识点:

  • fig.add_subplot(rows,cols,num)这里是设置plot的布局(rows, cols, num)
    rows: 一页中图形的行数
    cols: 一页中图形的列数
    num: 绘制第几个图形(从1开始),从上往下,从左到右的原则
    还有一种写法: sp = figure.add_subplot(221)
  • .set_title()
    设置当前图形的Title
    比如:sp1.set_title("subtitle1", fontsize=10, color="b")
  • .figure()
    画图之前首先设置figure对象,此函数相当于设置一块自定义大小的画布,使得后面的图形输出在这块规定了大小的画布上,其中参数figsize设置画布大小

完整的代码如下:

import pandas as pd
import matplotlib.pyplot as plt

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]

fig = plt.figure(figsize=(5,20))
ax1 = fig.add_subplot(4,1,1)
ax2 = fig.add_subplot(4,1,2)
ax3 = fig.add_subplot(4,1,3)
ax4 = fig.add_subplot(4,1,4)
ax1.hist(norm_reviews['Fandango_Ratingvalue'], bins=20, range=(0, 5))
ax1.set_title('Distribution of Fandango Ratings')
ax1.set_ylim(0, 50)

ax2.hist(norm_reviews['RT_user_norm'], 20, range=(0, 5))
ax2.set_title('Distribution of Rotten Tomatoes Ratings')
ax2.set_ylim(0, 50)

ax3.hist(norm_reviews['Metacritic_user_nom'], 20, range=(0, 5))
ax3.set_title('Distribution of Metacritic Ratings')
ax3.set_ylim(0, 50)

ax4.hist(norm_reviews['IMDB_norm'], 20, range=(0, 5))
ax4.set_title('Distribution of IMDB Ratings')
ax4.set_ylim(0, 50)

plt.show()

显示的结果如下:


3.画箱形图

箱线图,又称箱形图(boxplot)或盒式图,不同于一般的折线图、柱状图或饼图等传统图表,只是数据大小、占比、趋势等等的呈现,其包含一些统计学的均值、分位数、极值等等统计量,因此,该图信息量较大,不仅能够分析不同类别数据平均水平差异(需在箱线图中加入均值点),还能揭示数据间离散程度、异常值、分布差异等等。

matplotlib库常用boxplot函数画箱线图,boxplot函数中包含n多参数,涉及到对框的颜色及形状、线段线型、均值线、异常点的形状大小等等设置,由于大多并不常用,用了几个常用参数,具体如下:

df.boxplot(data,sym='r*',vert=False,patch_artist=True,meanline=False,showmeans=True)
  • sym='r*',表示异常点的形状,
  • vert=False,表示横向还是竖向(True),,
  • patch_artist=True,(上下四分位框内是否填充,True为填充)
  • meanline=False,showmeans=True,是否有均值线及其形状,meanline=True时,均值线也像中位数线一样是条红色线段,这样容易与中位数线混淆。
    另外,还有其他参数,比如notch表示中间箱体是否缺口,whis为设置数据的范围,showcaps、showbox是否显示边框.

学习参考链接:Python-matplotlib统计图之箱线图漫谈

如何画一个基本的箱形图呢?

完整的代码如下:

import pandas as pd
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.boxplot(norm_reviews['RT_user_norm'])
ax.set_xticklabels(['Rotten Tomatoes'])
ax4.set_ylim(0, 5)

plt.show()

输出的结果如下:


如何绘制多个箱形图?

完整的代码如下:

import pandas as pd
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']
num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue']
norm_reviews = reviews[cols]

ax.boxplot(norm_reviews[num_cols].values)
ax.set_xticklabels(num_cols,rotation=90)
ax4.set_ylim(0, 5)

plt.show()

输出的结果如下:


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

推荐阅读更多精彩内容