Python数据分析【1】:matplotlib库详细教程

Python数据分析:matplotlib库详细教程

  • 一、基本介绍
    • 1. 数据分析
    • 2. 环境安装
  • 二、matplotlib
    • 1. 基本介绍
    • 2. 基本要点
    • 3. 散点图/直方图/柱状图
    • 4. 画图工具

一、基本介绍

1. 数据分析

为什么要学习数据分析?
① 从一堆数据里面找到数据规律
② 岗位需求
③ 是Python数据科学的基础
④ 是机器学习课程的基础

数据分析:采用适当的方法对收集来的大量数据进行分析,帮助人们作出判断,以便采取适当行动。

数据分析流程
提出问题→准备数据→分析数据→获得结论→成果可视化

2. 环境安装

环境:anaconda
**‘清华大学开源软件镜像站’**下载

工具:jupyter notebook—编程/文档/笔记/展示软件
启动命令:jupyter notebook
Python数据分析【1】:matplotlib库详细教程_第1张图片

import requests
response=requests.get('http://www.baidu.com')
response.status_code
response.test

二、matplotlib

1. 基本介绍

功能
① 能将数据可视化,更直观的呈现;
② 使数据更加客观,更具说服力。

定义
最流行的Python底层绘图库,主要做数据可视化图表,模仿MATLAB构建

2. 基本要点

axis轴:指的是x或y轴
坐标点:

问题:假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别[15,13,14.5,17,20,25,26,27,22,18,15,14]

from matplotlib import pyplot as plt
#导入pyplot
x=range(2,26,2)
#数据在x轴的位置,是一个可迭代对象
y=[15,13,14.5,17,20,25,26,27,22,18,15,14]
#数据在y轴的位置,是一个可迭代对象
plt.plot(x,y)
#传入x和y,通过plot绘制出折线图
plt.show()
#在执行程序的时候展示图形

Python数据分析【1】:matplotlib库详细教程_第2张图片
我可以做得更好
① 设置图片大小(高清无码大图)
保存到本地
描述信息,比如x轴和y轴表示什么,这个图表示什么
④ 调整x或者y的刻度的间距
线条的样式(比如颜色,透明度等)
标记出特殊的点(比如告诉别人最高点和最低点在哪里)
⑦ 给图片添加一个水印(防伪,防盗)

from matplotlib import pyplot as plt

fig=plt.figure(figsize=(20,8),dpi=80)
#①figsize-图片大小,dpi-图片像素

x=range(2,26,2)
y=[15,13,14.5,17,20,25,26,27,22,18,15,14]

plt.plot(x,y)
plt.xticks(range(2,25))
#④绘制x轴的刻度,plt.xticks(步长)
#步长k=[i/2 for i in range(4,49)]-稀疏变密集
#步长k=[m:n:2]-密集变稀疏
plt.yticks(range(min(y),max(y)+1))

plt.savefig('./ti.png')
#②保存到当前路径下,也可以保存为svg矢量图格式,放大不会有锯齿

plt.show()

问题:如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?

from matplotlib import pyplot as plt
import random
x=range(0,120)
y=[random.randint(20,35) for i in range(120)]
fig=plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
plt.show()

Python数据分析【1】:matplotlib库详细教程_第3张图片
设置中文显示
为什么无法显示中文?
答:matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字

那如何修改matplotlib的默认字体?
通过matplotlib下的font_manager可以解决

from matplotlib import font_manager
my_font=font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')
plt.xticks(x[::5],_x_ticks[::5],rotation=90,fontproperties=my_font)

③描述信息

#④描述信息
plt.xlabel('时间',fontproperties=my_font)
plt.ylabel('温度 单位(℃)',fontproperties=my_font)
plt.title('10点到12点每分钟的气温变化情况',fontproperties=my_font)

问题:假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势。
要求:
-y轴表示个数
-x轴表示岁数,比如11岁,12岁等

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname=fname='/Ssystem/Library/Fonts/Pingfang.ttc')
plt.rcParams['font.sans-serif']=['SimHei']
y=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,31)

#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
#设置刻度
_xtick_lables=['{}岁'.format(i) for i in x]
plt.xticks(x,_xtick_lables,fontproperties=my_font)
plt.yticks(range(0,9))

#绘制网格
plt.grid(alpha=0.4)
#alpha:透明度

#展示
plt.show()

问题:假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌各自从11岁到30岁每年交的女(男)朋友的数量如列表a,请在一个图中绘制出该数据的折线图,以便比较自己和同桌20年间的差异,同时分析分析自己每年交女(男)朋友的数量走势
a=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
要求:
-y轴表示个数
-x轴表示岁数,比如11岁,12岁等

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname=fname='/Ssystem/Library/Fonts/Pingfang.ttc')
plt.rcParams['font.sans-serif']=['SimHei']
y1=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
x=range(11,31)

#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y1,label='自己',color='orange',linestyle=':')
plt.plot(x,y2,label='同桌',color='cyan',linestyle='-.')

#设置刻度
_xtick_lables=['{}岁'.format(i) for i in x]
plt.xticks(x,_xtick_lables,fontproperties=my_font)
plt.yticks(range(0,9))

#绘制网格
plt.grid(alpha=0.4,,linestyle=':')
#alpha:透明度

#添加图例
plt.legend(prop=my_font,loc='upper left')

#展示
plt.show()

源码:Ctrl+鼠标左键
颜色:可以上网查‘颜色代码

总结前面我们都做了什么?

  1. 绘制了折线图(plt.plot)
  2. 设置了图片的大小和分辨率(plt.figure)
  3. 实现了图片的保存(plt.savefig)
  4. 设置了xy轴上的刻度和字符串(xticks)
  5. 解决了刻度稀疏和密集的问题(xticks)
  6. 设置了标题,xy轴的label(title,xlable,ylable)
  7. 设置了字体(font_manager, fontProperties,matplotlib.rc)
  8. 在一个图上绘制多个图形(plt多次plot即可)
  9. 为不同的图形添加图例

其他折线图模板:可以详见matplotlib官方网站的代码
Python数据分析【1】:matplotlib库详细教程_第4张图片

3. 散点图/直方图/柱状图

(1) 四种图形介绍
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况(变化)

直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
特点:绘制连续的数据,展示一组或多组数据的分布状况(统计)

条形图:排列在工作表的列或行中的数据可以绘制到条形图。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计)

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律

(2) 绘制条形图
问题1:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?

① 绘制竖着的柱形图:

from matplotlib import pyplot as plt

#数据
a=['战狼2','速度与激情8','功夫瑜伽','西游伏妖篇','变形金刚5:\n最后的骑士','摔跤吧!爸爸','加勒比海盗5:\n死无对证','金刚:\n咕噜岛','极限特工:\n终极回归','生化危机6:\n终章','乘风破浪','神偷奶爸3','智取威虎山','大闹天竺','金刚狼3:\n殊死一战','蜘蛛侠:\n英雄归来','悟空传','银河护卫队2','情圣','新木乃伊']

b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] #单位:亿
# 数据来源:http://58921.com/alltime/2017

#设置图形大小
plt.figure(figsize=(20,15),dpi=80)
#绘制条形图
plt.bar(a,b,width=0.3)
#plt.bar(range(len(a)),b,width=0.3)
#设置字符串到x轴
plt.xticks(range(len(a)),a,fontproperties='SimHei',rotation=90)
#保存图片
plt.savefig('./movie.png')
plt.show()

Python数据分析【1】:matplotlib库详细教程_第5张图片

② 绘制横着的条形图:

from matplotlib import pyplot as plt

#数据
a=['战狼2','速度与激情8','功夫瑜伽','西游伏妖篇','变形金刚5:最后的骑士','摔跤吧!爸爸','加勒比海盗5:死无对证','金刚:咕噜岛','极限特工:终极回归','生化危机6:终章','乘风破浪','神偷奶爸3','智取威虎山','大闹天竺','金刚狼3:殊死一战','蜘蛛侠:英雄归来','悟空传','银河护卫队2','情圣','新木乃伊']

b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] #单位:亿
# 数据来源:http://58921.com/alltime/2017

#设置图形大小
plt.figure(figsize=(20,15),dpi=80)
#绘制条形图
plt.barh(a,b,height=0.3,color='orange')
#设置字符串到y轴
plt.yticks(range(len(a)),a,fontproperties='SimHei')
#保存图片
plt.grid(alpha=0.3)
plt.show()

Python数据分析【1】:matplotlib库详细教程_第6张图片
总结
竖着的条形图:plt.bar(a,b,width=0.3)
横着的条形图:plt.barh(a,b,height=0.3,color=‘orange’)

问题2:假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现改数据?

from matplotlib import pyplot as plt
a=['猩球崛起3:终极之战','敦刻尔克','蜘蛛侠:英雄归来','战狼2']
b_16=[15746,312,4497,319]
b_15=[12357,156,2045,168]
b_14=[2358,399,2358,362]
#数据来源:http://www.cbooo.cn/movieday

bar_width=0.2

x_14=list(range(len(a)))
x_15=[i+0.2 for i in x_14]
x_16=[i+0.2*2 for i in x_14]
#设置图形大小
plt.figure(figsize=(20,15),dpi=80)
#绘制条形图
plt.bar(a,b_14,width=bar_width,label='9月14日')
plt.bar(x_15,b_15,width=bar_width,label='9月15日')
plt.bar(x_16,b_16,width=bar_width,label='9月16日')
#plt.bar(range(len(a)),b,width=0.3)

#设置x轴的刻度
plt.xticks(x_15,a,fontproperties='SimHei')

#设置图例
plt.legend(prop='SimHei') #字体设置有点错误

plt.show()

Python数据分析【1】:matplotlib库详细教程_第7张图片

应用场景
-数量统计
-频率统计

(3) 绘制直方图
问题1:假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?

from matplotlib import pyplot as plt

a=[118, 120, 120, 91, 89, 83, 135, 126, 106, 83, 126, 84, 113, 116, 98, 100, 104, 94, 129, 115, 113, 120, 126, 105, 120, 111, 96, 137, 92, 114, 86, 97, 119, 109, 123, 107, 101, 130, 133, 115, 84, 105, 139, 97, 136, 133, 116, 124, 134, 107, 131, 117, 110, 134, 89, 81, 95, 113, 123, 133, 91, 114, 139, 80, 134, 87, 81, 94, 132, 121, 138, 116, 136, 135, 112, 123, 105, 117, 134, 81, 108, 90, 101, 119, 81, 132, 138, 107, 98, 97, 96, 130, 137, 129, 101, 125, 121, 114, 81, 116, 82, 138, 115, 115, 117, 108, 124, 134, 111, 131, 103, 110, 134, 133, 134, 96, 115, 80, 123, 117, 115, 116, 132, 117, 111, 97, 88, 80, 87, 109, 111, 117, 91, 115, 114, 122, 100, 85, 138, 101, 128, 130, 104, 122, 125, 105, 100, 128, 94, 82, 116, 108, 84, 127, 84, 131, 100, 91, 111, 139, 103, 127, 122, 108, 109, 119, 85, 97, 104, 131, 92, 97, 84, 113, 134, 140, 100, 110, 103, 119, 126, 108, 130, 97, 129, 128, 92, 104, 85, 99, 115, 102, 122, 96, 107, 130, 111, 113, 82, 138, 103, 127, 124, 99, 139, 87, 109, 134, 84, 90, 80, 92, 126, 124, 83, 113, 119, 83, 138, 130, 128, 117, 81, 123, 82, 135, 119, 80, 124, 83, 130, 112, 99, 102, 91, 119, 118, 97, 83, 123, 90, 133, 93, 131, 102, 100, 116, 122, 91, 120]

# 计算组数:组数=极差/组距
d=5  #组距
num_bins=(max(a)-min(a))//d

#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.hist(a,num_bins,normed=True)  #数据和组数,频率直方图
#hist传入需要统计的数据,以及组数即可

#设置x轴的刻度
plt.xticks(range(min(a),max(a)+d,d))

plt.grid()
plt.show()

Python数据分析【1】:matplotlib库详细教程_第8张图片

问题2:在美国2004年人口普查发现有124 million的人在离家相对较远的地方工作。根据他们从家到上班地点所需要的时间,通过抽样统计(最后一列)出了下表的数据,这些数据能够绘制成直方图么?

from matplotlib import pyplot as plt

#数据
interval=[0,5,10,15,20,25,30,35,40,45,60,90] #时间段,x轴
width=[5,5,5,5,5,5,5,5,5,15,30,60]  #组距
quantity=[836,2737,3723,3926,3596,1438,3273,642,824,613,215,57]  #频数
# 数据来源:https://en.wikipedia.org/wlkl/Histoggram
# 普查报告地址:http://www.census.gov/prod/2004pubs/c2kbr-33.pdf


#设置图形大小
plt.figure(figsize=(20,8),dpi=80)

plt.bar(range(12),quantity,width=1)  


#设置x轴的刻度
_x=[i-0.5 for i in range(13)]
_xtick_labels=interval+[150]
plt.xticks(_x,_xtick_labels)

plt.grid()
plt.show()

#bar方法的使用
#原始数据才可以用直方图

Python数据分析【1】:matplotlib库详细教程_第9张图片

直方图的应用场景
① 用户的年龄分布状态
② 一段时间内用户点击次数的分布状态
③ 用户活跃时间的分布状态

4. 画图工具

4.1 常见问题总结:
(1) 应该选择哪种图形来呈现数据
折线图:变化
条形图:离散数据
(2) matplotlib.plot(x,y):折线图
(3) matplotlib.bar(x,y):直方图
(4) matplotlib.scatter(x,y):散点图
(5) matplotlib.hist(data,bins,normed):条形图
(6) xticks 和 yticks 的设置:x,y轴的刻度
(7) label 和 title.grid 的设置
(8) 绘图的大小和保存图片

4.2 matplotlib使用流程:
(1) 明确问题
(2) 选择图形的呈现方式
(3) 准备数据
(4) 绘图和图形完善

4.3 更多的图形样式
matplotlib支持的图形是非常多的,如果有其他的需求,我们可以查看以下url地址:
matplotlib.
ECHARTS.

4.4 更多的绘图工具
(1) plotly: 可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib 和 pandas
使用用法:简单,照着文档写即可
plotly for python.

(2) seaborn

你可能感兴趣的:(Python,数据分析,可视化,python,数据分析)