Matplotlib的概念和简单应用
一、Matplotlib的概念
Matplotlib 是 Python 的绘图库。
它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
Matplotlib的特点:
1.是专门用于开发2D图标(包括3D图表)
2.使用起来极其简单
3.以渐进、交互方式实现数据可视化
-
matplotlib架构:
-
上层调用下层
-
后端:实现绘图区域(分配画图资源)
-
美工:
- figure、axes、axis
- xticks,yticks
- xlabel,ylabel
- plot(参数)
- lengend
-
脚本:pytplot
-
美工层
-
figure:指整个图形(包括所有元素,比如标题、线等)
-
axes(坐标系):数据的绘图区域
-
axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签
特点
- 一个figure可以包含多个axes(坐标系)
- 一个坐标系可以包含多个坐标轴
-
-
-
二、Matplotlib的简单应用
1、折线图
- 折线图:点的坐标(横坐标,纵坐标)
案例1:实现温度变化(折线图)绘制
步骤:
1.先生成figure
2.准备数据,折线图点,x,y坐标个数一一对应
3.显示调用show()
import matplotlib.pyplot as plt
plt.figure() # 画幕布
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])# 横坐标,纵坐标
plt.savefig("./test.png") # 保存位置
plt.show()# 显示
效果如下:
案例2:显示上海和北京的温度变化(同一张图)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20,10),dpi=80) # 画幕布
# 准备数据
x = range(60)
x_ch = ['11点{}分'.format(i) for i in x]
y_shanghai = [random.uniform(15,18) for i in range(60)] # 变化范围15~18
# 准备北京的温度
y_beijing = [random.uniform(1,3) for i in range(60)] # 变化范围1~3
y_ticks = range(40)
plt.plot(x,y_shanghai,label = '上海')
# 显示北京的温度
plt.plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
# 修改刻度值
# 指定显示的x刻度的列表
# 第一个参数:必须是指
# 第二个参数:指定跟第一个参数对应的中文
plt.xticks(x[::5],x_ch[::5])
plt.yticks(y_ticks[::5])
# 增加标题,坐标描述
plt.xlabel('时间')
plt.ylabel('温度')
plt.title('北京和上海:从11点~12点的温度变化情况')
# 增加图例的显示
plt.legend(loc = 'best')
plt.savefig("./test2.png")
plt.show()
效果如下:
案例3:显示北京和上海的温度变化(不同图)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
# plt.figure(figsize=(20,10),dpi=80) # 画幕布
# 当在多个ax里面画图的时候,标签,刻度,在相应的坐标系里指定
fig,ax=plt.subplots(nrows=1,ncols=2,figsize=(20,8))
# 准备数据
x = range(60)
x_ch = ['11点{}分'.format(i) for i in x]
y_shanghai = [random.uniform(15,18) for i in range(60)] # 变化范围15~18
# 准备北京的温度
y_beijing = [random.uniform(1,3) for i in range(60)] # 变化范围1~3
y_ticks = range(40)
# plt.plot(x,y_shanghai,label = '上海')
ax[0].plot(x,y_shanghai,label = '上海')
# 显示北京的温度
# plt.plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
ax[1].plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
# 修改刻度值
# 指定显示的x刻度的列表
# 第一个参数:必须是指
# 第二个参数:指定跟第一个参数对应的中文
# plt是对整理坐标系处理,ax是对每个坐标系处理
# plt.xticks(x[::5],x_ch[::5])
ax[0].set_xticks(x[::5],x_ch[::5])
ax[1].set_xticks(x[::5],x_ch[::5])
# plt.yticks(y_ticks[::5])
ax[0].set_yticks(y_ticks[::5])
ax[1].set_yticks(y_ticks[::5])
# 增加标题,坐标描述
# plt.xlabel('时间')
ax[0].set_xlabel('时间')
ax[1].set_xlabel('时间')
# plt.ylabel('温度')
ax[0].set_ylabel('温度')
ax[1].set_ylabel('温度')
# plt.title('北京和上海:从11点~12点的温度变化情况')
ax[0].set_title('中午从11点~12点的温度变化情况')
ax[1].set_title('中午从11点~12点的温度变化情况')
# 增加图例的显示
# plt.legend(loc = 'best')
ax[0].legend(loc = 'best')
ax[1].legend(loc = 'best')
plt.savefig("./test3.png")
plt.show()
效果如下:
2、条形图
plt.bar(*x**,* *height**,* *width=0.8**,* *bottom=None**, ***,* *align='center'**,* *data=None**, ****kwargs*)
案例1:显示每部电影的票房
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
# 柱状图
plt.figure(figsize=(20,8))
# 电影名字,每部电影对应的票房
movie_name = ['战狼2','哪吒之魔童降世','流浪地球','复仇者联盟4:终局之战','红海行动']
x = range(len(movie_name))
y = [5639,4934,4618,4205,3622]
# 使用plt.bar显示
# plt.bar 填入的x坐标必须全是数字
plt.bar(x,y,0.2,color = ['b','r','g','y','c','m'])
# 修改刻度,以及电影名字显示
plt.xticks(x,movie_name)
plt.savefig('./test4')
plt.show()
效果如下:
案例2:显示每日票房与每周票房的对比
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
# 柱状图
plt.figure(figsize=(20,8))
movie_name = ['战狼2','哪吒之魔童降世','流浪地球']
first_day = [10587.6,10062.5,1275.7]
first_weekend = [36224.9,34479.6,11830]
x = range(len(movie_name))
# 使用plt.bar显示
plt.bar(x,first_day,width=0.2,label='首日票房')
plt.bar([i+0.2 for i in x],first_weekend,width=0.2,label='首周票房')
plt.xticks([i+0.1 for i in x],movie_name)
plt.legend(loc='best')
plt.title('首日票房与首周票房对比')
plt.savefig('./test5')
plt.show()
效果如下:
3、直方图
plt.hist
plt.grid
- 组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数
- 组距:每一组两个端点的差
步骤:
1.设置组距
2.设置组数:组数=极差/组距
案例1:显示豆瓣电影评分分布直方图
# 组距为1
# 创建figure
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20,8))
score = [8.7,8.2,8.1,8,8,7.9,7.8,7.8,7.8,7.7,7.6]
bins = 0.05
group = int((max(score)-min(score))/bins)
# 画直方图
plt.hist(score,group,density=True) # density 频率 默认是0
# 指定刻度和步长
plt.xticks(score[::1])
plt.title('电影评分直方图')
plt.xlabel('电影评分')
plt.ylabel('电影数据量')
# 添加网格
plt.grid(True,linestyle = '--',alpha=1) # alpha表示格子清晰度
plt.savefig('./test6')
plt.show()
效果如下:
直方图的场景
- 用于表示分布情况
- 通过直方图还可以观察和估计哪些数据比较集中,异常或者孤立的数据分布在何处
- 利于较小数据的分析
- 例如:用户年龄分布,商品价格分布
直方图和柱状图对比
- 直方图:适合x坐标数据:连续的数据,数据量大
- 柱状图:x坐标,类别。数据量较小。
4、饼图
plt.pie(x,labels=,autopct=,colors)
案例1:显示每个电影的场次占比
# 电影的排片占比显示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
# 创建figure
plt.figure(figsize=(20,8))
movie_name = ['战狼2','哪吒之魔童降世','流浪地球','复仇者联盟4:终局之战','红海行动']
# 场次
place_count = [60605,54546,45819,28243,13270]
# 显示饼图
plt.pie(place_count,labels=movie_name,autopct='%1.2f%%',colors=['b','r','y','g','c'])
plt.legend(loc='best')# 添加图例
plt.axis('equal')# 变成圆形
plt.savefig('./test7')
plt.show()
效果如下:
应用场景
分类的占比情况
例如:班级男女分布占比,公司销售额占比
说明:
数据来源:豆瓣网和电影网
5、各类统计图的比较:
- 条形统计图是用一个单位长度表示一定的数量,根据数量的多少画出长短不同的直条,它能很快的看出各种数量的多少;
- 折线统计图是用一个单位长度表示一定的数量,根据数量的多少描出各点,然后用线段依次连接起来,它不但可以看出各种数量的多少,而且可以看出数量的增减变化情况;
- 扇形统计图是用一个圆表示整体,用圆内各个扇形的大小表示各部分占总数的百分比,它可以清楚看出各种数量占整体的百分比。