Matplotlib-数据可视化详解
1. 数据可视化简介
-
可视化介绍
-
数据可视化是指直观展现数据,它是数据处理过程的一部分。
-
把数值绘制出来更方便比较。借助数据可视化,能更直观地理解数据,这是直接查看数据表做不到的
-
数据可视化有助于揭示数据中隐藏的模式,数据分析时可以利用这些模式选择模型
-
-
可视化库介绍
-
基于Matplotlib 绘制静态图形
-
pandas
-
seaborn
基于JS (javaScript)
-
pyecharts/echarts
-
plotly
-
-
2.Matplotlib的API介绍
Matplotlib提供了两种方法来作图:状态接口和面向对象
-
导包
# 使用Matplotlib需要导入pyplot # Matplotlib.pyplot 包含一系列绘图函数的相关函数 import matplotlib.pyplot as plt
-
方式1: 状态接口
# 状态接口方式 绘图. import matplotlib.pyplot as plt # 1. 准备x轴 和 y轴的数据. x = [-3, 5, 7] # x轴坐标 y = [10, 2, 5] # y轴坐标 # 2. 创建画布, figure: 创建画布, figsize=指定画布大小 plt.figure(figsize=(15, 6)) # 3. 绘图, 传入x轴, y轴 plt.plot(x, y) plt.grid(True) # 添加网格线 # 4. 设置x轴坐标 和 y轴坐标的范围 plt.xlim(0, 10) plt.ylim(-3, 8) # 5. 设置x轴 和 y轴的标签 plt.xlabel('X Axis', size=20) plt.ylabel('Y Axis', size=10) # 6. 设置标题. plt.title('Line Plot', size=30) # 7. 显示图片 plt.show()
-
方式2: 面向对象
# 面向对象 绘图. import matplotlib.pyplot as plt # 1. 准备x轴 和 y轴的数据. x = [-3, 5, 7] # x轴坐标 y = [10, 2, 5] # y轴坐标 # 2. 创建画布, 坐标轴对象 fig, ax = plt.subplots(figsize=(15, 6)) # 3. 绘图, 传入x轴, y轴 ax.plot(x, y) ax.grid(True) # 添加网格线 # 4. 设置x轴坐标 和 y轴坐标的范围 ax.set_xlim(0, 10) ax.set_ylim(-3, 8) # 5. 设置x轴 和 y轴的标签 ax.set_xlabel('X Axis', size=20) ax.set_ylabel('Y Axis', size=10) # 6. 设置标题. ax.set_title('Line Plot', size=30) # 7. 显示图片 plt.show()
3.Matplotlib案例-anscombe数据集可视化
-
数据集介绍
-
通过
Anscombe数据集
说明数据可视化的重要性 -
Anscombe数据集由英国统计学家Frank Anscombe创建
-
数据集包含4组数据,每组数据包含两个连续变量。
-
每组数据的平均值、方差、相关性基本相同,但是当它们可视化后,就会发现每组数据的模式明显不同。
-
-
查看四组数据值
anscombe.groupby('dataset').describe().T
describe()查看数据的查看数据的分布情况
发现每组数据中, x, y 的分布情况基本相同, 从均值, 极值和几个4分位数上看, 这几组数据貌似分布差不多
-
代码实现
import pandas as pd # 1. 加载数据 anscombe = pd.read_csv('data/anscombe.csv') anscombe # 2. 查看每组数据, 一共四组, 每组都是11条数据 anscombe.dataset.value_counts() # 3. 查看每组数据的具体统计信息, 统计结果几乎一致,但是可视化后, 完全不同. anscombe.groupby('dataset').describe().T # 4.上面的数据一共可以分成4分 I II III IV 我们把这四份数据分别可视化, 画4张小图, 放到一个画布中 fig = plt.figure(figsize=(16,8)) # 在画布中 设置一个两行两列的框, 第一个框 对应axes1 axes1 = fig.add_subplot(2,2,1) # 在画布中 设置一个两行两列的框, 第二个框 对应axes2 axes2 = fig.add_subplot(2,2,2) # 在画布中 设置一个两行两列的框, 第三个框 对应axes3 axes3 = fig.add_subplot(2,2,3) # 在画布中 设置一个两行两列的框, 第四个框 对应axes4 axes4 = fig.add_subplot(2,2,4) # scatter()函数: 创建散点图. # 分别传入四组数据的 x 和 y列值即可, 对应四个坐标系. axes1.scatter(anscombe[anscombe['dataset']=='I']['x'],anscombe[anscombe['dataset']=='I']['y']) axes2.scatter(anscombe[anscombe['dataset']=='II']['x'],anscombe[anscombe['dataset']=='II']['y']) axes3.scatter(anscombe[anscombe['dataset']=='III']['x'],anscombe[anscombe['dataset']=='III']['y']) axes4.scatter(anscombe[anscombe['dataset']=='IV']['x'],anscombe[anscombe['dataset']=='IV']['y']) plt.show()
4.Matplotlib单变量可视化-直方图
-
概述
-
直方图会将数据分组后, 绘制成图表, 来显示数据的分布情况.
-
-
示例代码
# 生成等差数列 import numpy as np np.linspace(3.07, 50.81, 11) # 等差数列, 包左包右, 生成11个数 # 具体的绘制直方图的动作. import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 plt.figure(figsize=(16, 8)) # bins表示把数据分成几个组(等价于: np.linspace(), 生成等差数列 plt.hist(tips['total_bill'], bins=10) # 就写到这里, 先不写下边代码, 可以看到10个区间. plt.title('总账单金额的分布情况') plt.grid(True) plt.xlabel('账单金额') plt.ylabel('出现次数')
import numpy as np np.linspace(3.07,50.81,11) # bins = 10 相当于在账单的最小值, 和最大值范围内生成了11值的等差数列
11个值划分10个区间, 直方图的高度, 就是落到每个区间中的数据的条目数
5.Matplotlib双变量可视化-散点图
-
概述
-
双变量(bivariate)指两个变量
-
散点图用于表示一个连续变量随另一个连续变量的变化所呈现的大致趋势
-
例如: 了解
账单金额
和小费
之间的关系可以绘制散点图
-
-
示例代码
# 绘制画布 plt.figure(figsize=(12, 8)) # 绘制散点图, 传入: x轴(这里是: 账单总金额), y轴(这里是: 小费) plt.scatter(tips['total_bill'], tips['tip']) # 设置x轴 和 y轴 值 plt.xlabel('账单金额') plt.ylabel('小费金额') # 显示网格 plt.grid(True)
6.Matplotlib多变量可视化-散点图
-
概述
-
在散点图的基础上, 可以通过
颜色
来区分不同的类别 -
散点的大小也可以用来表示一个变量
-
-
示例代码
-
添加一列, 用来区分不同性别 显示的颜色
# 添加一列, 用来区分不同性别显示的颜色 def recode_sex(sex): if sex=='Female': return 'r' else: return 'b' # 调用上述自定义函数, 给 tips这个df对象, 新增一列. tips['sex_color'] = tips['sex'].apply(recode_sex) # 查看下男女各组总数 tips.sex_color.value_counts()
-
具体的绘制动作
-
plt.figure(figsize=(12, 8)) # x轴: 账单总金额, y轴: 小费 # c: 表示散点的颜色 # s: 表示散点的大小, 可以是一个数, 也可以是一个序列. # alpha: 表示散点的透明度. plt.scatter(tips.total_bill, tips.tip, c=tips.sex_color, s=tips['size'] * 10, alpha=0.5) plt.xlabel('账单金额') plt.ylabel('小费金额') plt.legend(tips.sex)
-