1 认识Matplotlib
什么是Matplotlib?
- 专门用于开发2D图表(包括3D图表)
- 以渐进、交互式方式实现数据可视化
为什么要学习Matplotlib?
可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
2 Matplotlib图像结构
Matplotlib可以分为三层结构,即容器层、辅助显示层、图像层。
- 容器层:主要由Canvas、Figure、Axes组成。
- Canvas(画板)位于最底层,用户一般接触不到。
- Figure(画布)建立在Canvas之上,指的是整个图形。
- Axes(绘图区)建立在Figure之上,一个Figure可以包含多个Axes,一个Axes可以包含多个Axis(坐标轴),包含2个即为2d坐标系,3个即为3d坐标系。
- 辅助显示层:为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
- 图像层:Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
3 常见图形绘制
3.1 折线图
概念:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
plt.plot(x, y)
需求:画出上海市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
import matplotlib.pyplot as plt
import random
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 准备x,y坐标的数据
x = range(60)
# random.uniform(x,y)方法将随机生成一个【实数】,它在 [x,y] 范围内。
# random.randint(x,y)则取【整数】,且x,y均是整数
y = [random.uniform(15, 18) for i in x]
# 需求:再添加一个北京市的温度变化,只需要再次plot即可,但是需要区分线条
y1 = [random.uniform(0, 8) for i in x]
# 创建画布【figsize:指定图的长宽,dpi:图像的清晰度,返回figure对象】
plt.figure(figsize=(20, 8), dpi=100)
# 绘制折线图
plt.plot(x, y, label="上海")
plt.plot(x, y1, color='r', linestyle=':', label="北京")
# 构造x,y轴刻度
x_ticks = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks[::5])
plt.yticks(y_ticks[::5])
# 添加网格显示【alpha:透明度】
plt.grid(True, linestyle='--', alpha=0.5)
# 添加x轴、y轴描述信息及标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
# 显示图例
plt.legend(loc="best")
# 保存图片到指定路径
plt.savefig("plot.png")
# 显示图像【注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。】
plt.show()
图形的风格
图例的位置
多个坐标系显示— plt.subplots(面向对象的画图方法)
将上海和北京的天气图显示在同一个图的不同坐标系当中,效果如下:
注意:
plt.函数名()
相当于面向过程的画图方法,axes.set_方法名()
相当于面向对象的画图方法。
创建画布
'''
参数 nrows, ncols : 设置有几行几列坐标系
返回 fig : 图对象,axes : 相应数量的坐标系
'''
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
绘制图像
axes[0].plot(x, y, label="上海")
axes[1].plot(x, y1, color="r", linestyle=":", label="北京")
刻度显示
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
添加网格显示
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)
添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("上海中午11点--12点温度变化图", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("北京中午11点--12点温度变化图", fontsize=20)
添加图例
axes[0].legend(loc=0)
axes[1].legend(loc=0)
plt.plot()除了可以画折线图,也可以用于画各种数学函数图像
import matplotlib.pyplot as plt
import numpy as np
# numpy.linspace 是用于创建一个由等差数列构成的一维数组。【起始数、结束数、个数】
x = np.linspace(-10, 10, 1000)
y = np.sin(x)
plt.figure(figsize=(20, 8), dpi=100)
plt.plot(x, y)
plt.grid()
plt.show()
3.2 散点图
概念:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
plt.scatter(x, y)
需求:探究房屋面积和房屋价格的关系
import matplotlib.pyplot as plt
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9, 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9, 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1,
30.74, 400.02, 205.35, 330.64, 283.45]
plt.figure(figsize=(20, 8), dpi=100)
plt.scatter(x, y)
plt.show()
3.3 柱状图
概念:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
plt.bar(x, width, align='center', **kwargs)
"""
Parameters:
x : 需要传递的数据
width : 柱状图的宽度
align : 每个柱状图的位置对齐方式
{‘center’, ‘edge’}, 默认: ‘center’
**kwargs :
color:选择柱状图的颜色
"""
需求:对比每部电影的票房收入
import matplotlib.pyplot as plt
movie_name = ['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案', '寻梦环游记', '全球风暴', '降魔传', '追捕', '七十七天', '密战', '狂兽', '其它']
# 横坐标
x = range(len(movie_name))
# 票房数据
y = [73853, 57767, 22354, 15969, 14839, 8725, 8716, 8318, 7916, 6764, 52222]
plt.figure(figsize=(20, 8), dpi=100)
plt.bar(x, y, width=0.5, color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g', 'b'])
# 修改x轴的刻度显示
plt.xticks(x, movie_name)
plt.grid(linestyle="--", alpha=0.5)
plt.title("电影票房收入对比")
plt.show()
注意:垂直方向的柱形图可以使用
barh()
方法来设置
3.4 直方图
概念:由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
matplotlib.pyplot.hist(x, bins=None)
"""
x : 需要传递的数据
bins : 组距
"""
3.5 饼图
概念:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
plt.pie(x, labels=,explode=,autopct=,colors)
'''
x:数量,自动算百分比
labels:每部分名称
explode:各个扇形之间的间隔,默认值为0
autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。(例如m.n:m表示对应的输出项在输出设备上所占的字符数n表示精度,即小数点后保留几位)
colors:每部分颜色
shadow:布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影
'''
import matplotlib.pyplot as plt
labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
x = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0) # 仅“分解”第二个切片
plt.pie(x, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.show()