matplotlib可视化基础
matplotlib制作可视化图表是python数据分析中的一个非常重要的模块,这个模块我之前一直没怎么使用过,这里重新练习下matplotlib模块的使用,数据源来自天池比赛中的二手车交易价格预测数据。
一、matplotlib基础
1、matplotlib图形的基本构成部分
1 | # 一般在jupyter notebook中导入matplotlib的方式 |
- 基础 (primitives) 类:线 (line), 点 (marker), 文字 (text), 图例 (legend), 网格 (grid), 标题 (title), 图片 (image) 等。
- 容器 (containers) 类:图 (figure), 坐标系 (axes), 坐标轴 (axis) 和刻度 (tick)
基础类元素是我们想画出的标准对象,而容器类元素是基础类元素的寄居出,它们也有层级结构。
图 → 坐标系 → 坐标轴 → 刻度→绘制图型
如下图所示,主要元素及结构:figure(图形)、axes(子图形)、title(标题)、legend(图例)、Major tick(大标尺刻度)、Minor tick(小标尺刻度)、Major tick label(大标尺刻度数值)、Minor tick label(小标尺刻度数值)、Y axis label(y轴指标说明)、X axis label(x轴指标说明)、Line(线型图)、Markers(数据标注点)、Grid(格子)等。
2、matplotlib图形的几个容器类:
2.1 Figure对象(图)
整个图形即是一个Figure对象。
Figure对象至少包含一个子图,也就是Axes对象。
Figure对象包含一些特殊的Artist对象,如title标题、图例legend。
Figure对象包含画布canvas对象。 canvas对象一般不可见,通常无需直接操作该对象,matplotlib程序实际绘图时需要调用该对象。
figure对象上可以添加各种元素:文字、图片、折线等,接下来实际操作下:
1 | # 在figure中显示文本并自定义位置 |
1 | # 用 Image.open() 将图片转成像素存在 ndarray 中,再用 plt.imshow() 展示。 |
2.2 Subplot对象(子图)
常用方法set_xlim()以及set_ylim():设置子图x轴和y轴对应的数据范围。
set_xticks()以及set_yticks():设置子图的x轴和y轴刻度标签
set_title():设置子图的标题。
set_xlabel()以及set_ylable():设置子图x轴和y轴指标的描述说明
1 | # subplot(rows, columns, i-th plots) |
1 | # 循环绘制子图 |
2.3 Axes对象(坐标系)
字面上理解,Axes是数据轴Axis的复数,但它并不是指数据轴,而是子图对象,可以这样理解,每一个子图都有x和y轴,Axes则用于代表这两个数据轴所对应的一个子图坐标系对象,我们每次画图看起来是在图(Figure)中进行,实际是绘制在Axes坐标系对象中的,一个Figure对象能有多个Axes对象。
一幅图 (Figure) 中可以有多个坐标系 (Axes),说一幅图中有多幅子图 (Subplot),因此坐标系和子图是不是同样的概念?
在绝大多数情况下是的,两者有一点细微差别:
- 子图在母图中的网格结构一定是规则的
- 坐标系在母图中的网格结构可以是不规则的
子图是坐标系的一个特例。
坐标系比子图更通用,有两种生成方式
用 gridspec 包加上 subplot()
用 plt.axes()
1 | # 不规则网格 |
1 | # 大图套小图 |
两种生成坐标系的推荐代码:
第一种,同时生成图和坐标系:
1 | fig,ax = plt.subplots() |
第二种,先生成图,再添加坐标系
1 | fig=plt.figure() |
2.4 Axis对象(坐标轴)
Axis是数据轴对象,主要用于控制数据轴上刻度位置和显示数值,通常是二维的,有两条坐标轴
- 横轴:XAxis
- 纵轴:YAxis
每个坐标轴包含两个元素
- 容器类元素「刻度」,该对象里还包含刻度本身和刻度标签
- 基础类元素「标签」,该对象包含的是坐标轴标签
1 | fig, ax = plt.subplots() |
2.5 Tick对象(刻度)
2.6 Artist对象
基本上所有的对象都是一个Artist对象,包括Figure对象、Axes对象和Axis对象,可以将Artist理解为一个基本类。当提交代码,图像最终呈现时,所有的artist对象都会绘制于canvas画布上,这个对象其实大部分时间用不上。
3、matplotlib图形的基础元素:
要画出一幅有内容的图,还需要在容器里添加基础元素比如线 (line), 点 (marker), 文字 (text), 图例 (legend), 网格 (grid), 标题 (title), 图片 (image) 等,具体来说
- 画一条线,用 plt.plot() 或 ax.plot()
- 画个记号,用 plt.scatter() 或 ax.scatter()
- 添加文字,用 plt.text() 或 ax.text()
- 添加图例,用 plt.legend() 或 ax.legend()
- 添加图片,用 plt.imshow() 或 ax.imshow()
二、实例绘图
本实例绘图数据依据天池比赛零基础入门数据挖掘 - 二手车交易价格预测的数据源进行绘制,探索该部分数据结构。
首先读取数据
1 | # 读取天池二手车交易价格预测的训练数据 |
SaleID | name | regDate | model | brand | bodyType | fuelType | gearbox | power | kilometer | … | v_5 | v_6 | v_7 | v_8 | v_9 | v_10 | v_11 | v_12 | v_13 | v_14 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 736 | 20040402 | 30.0 | 6 | 1.0 | 0.0 | 0.0 | 60 | 12.5 | … | 0.235676 | 0.101988 | 0.129549 | 0.022816 | 0.097462 | -2.881803 | 2.804097 | -2.420821 | 0.795292 | 0.914762 |
1 | 1 | 2262 | 20030301 | 40.0 | 1 | 2.0 | 0.0 | 0.0 | 0 | 15.0 | … | 0.264777 | 0.121004 | 0.135731 | 0.026597 | 0.020582 | -4.900482 | 2.096338 | -1.030483 | -1.722674 | 0.245522 |
2 | 2 | 14874 | 20040403 | 115.0 | 15 | 1.0 | 0.0 | 0.0 | 163 | 12.5 | … | 0.251410 | 0.114912 | 0.165147 | 0.062173 | 0.027075 | -4.846749 | 1.803559 | 1.565330 | -0.832687 | -0.229963 |
3 | 3 | 71865 | 19960908 | 109.0 | 10 | 0.0 | 0.0 | 1.0 | 193 | 15.0 | … | 0.274293 | 0.110300 | 0.121964 | 0.033395 | 0.000000 | -4.509599 | 1.285940 | -0.501868 | -2.438353 | -0.478699 |
4 | 4 | 111080 | 20120103 | 110.0 | 5 | 1.0 | 0.0 | 0.0 | 68 | 5.0 | … | 0.228036 | 0.073205 | 0.091880 | 0.078819 | 0.121534 | -1.896240 | 0.910783 | 0.931110 | 2.834518 | 1.923482 |
5 rows × 31 columns
主要指标含义如下:
train.csv
- SaleID - 销售样本ID
- name - 汽车编码
- regDate - 汽车注册时间
- model - 车型编码
- brand - 品牌
- bodyType - 车身类型
- fuelType - 燃油类型
- gearbox - 变速箱
- power - 汽车功率
- kilometer - 汽车行驶公里
- notRepairedDamage - 汽车有尚未修复的损坏
- regionCode - 看车地区编码
- seller - 销售方
- offerType - 报价类型
- creatDate - 广告发布时间
- price - 汽车价格
- v_0’, ‘v_1’, ‘v_2’, ‘v_3’, ‘v_4’, ‘v_5’, ‘v_6’, ‘v_7’, ‘v_8’, ‘v_9’, ‘v_10’, ‘v_11’, ‘v_12’, ‘v_13’,’v_14’ 【匿名特征,包含v0-14在内15个匿名特征】
数字全都脱敏处理,都为label encoding形式,即数字形式。
首先对数据进行常规解读:
1 | dftrain.info() |
1 | dftrain.describe().round(2) |
SaleID | name | regDate | model | brand | bodyType | fuelType | gearbox | power | kilometer | … | v_5 | v_6 | v_7 | v_8 | v_9 | v_10 | v_11 | v_12 | v_13 | v_14 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 150000.00 | 150000.00 | 150000.00 | 149999.00 | 150000.00 | 145494.00 | 141320.00 | 144019.00 | 150000.00 | 150000.00 | … | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 | 150000.00 |
mean | 74999.50 | 68349.17 | 20034170.51 | 47.13 | 8.05 | 1.79 | 0.38 | 0.22 | 119.32 | 12.60 | … | 0.25 | 0.04 | 0.12 | 0.06 | 0.06 | -0.00 | 0.01 | 0.00 | 0.00 | -0.00 |
std | 43301.41 | 61103.88 | 53649.88 | 49.54 | 7.86 | 1.76 | 0.55 | 0.42 | 177.17 | 3.92 | … | 0.05 | 0.05 | 0.20 | 0.03 | 0.04 | 3.77 | 3.29 | 2.52 | 1.29 | 1.04 |
min | 0.00 | 0.00 | 19910001.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.50 | … | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -9.17 | -5.56 | -9.64 | -4.15 | -6.55 |
25% | 37499.75 | 11156.00 | 19990912.00 | 10.00 | 1.00 | 0.00 | 0.00 | 0.00 | 75.00 | 12.50 | … | 0.24 | 0.00 | 0.06 | 0.04 | 0.03 | -3.72 | -1.95 | -1.87 | -1.06 | -0.44 |
50% | 74999.50 | 51638.00 | 20030912.00 | 30.00 | 6.00 | 1.00 | 0.00 | 0.00 | 110.00 | 15.00 | … | 0.26 | 0.00 | 0.10 | 0.06 | 0.06 | 1.62 | -0.36 | -0.13 | -0.04 | 0.14 |
75% | 112499.25 | 118841.25 | 20071109.00 | 66.00 | 13.00 | 3.00 | 1.00 | 0.00 | 150.00 | 15.00 | … | 0.27 | 0.10 | 0.13 | 0.08 | 0.09 | 2.84 | 1.26 | 1.78 | 0.94 | 0.68 |
max | 149999.00 | 196812.00 | 20151212.00 | 247.00 | 39.00 | 7.00 | 6.00 | 1.00 | 19312.00 | 15.00 | … | 0.29 | 0.15 | 1.40 | 0.16 | 0.22 | 12.36 | 18.82 | 13.85 | 11.15 | 8.66 |
8 rows × 30 columns
三、基础参数
参照这个GitHub地址总结的:https://github.com/rougier/matplotlib-cheatsheet
最后
给出以上实例的jupyter notebook文件:
给出matplotlib的预定义格式
1 | # 可视化显示在页面,包含3种 |
1 | # 第二组色卡,从左往右 |