全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

数据分析之绘图和可视化

发布时间:2022-08-12 15:04:55
发布人:wjy

hi~~~ 我是宋宋,今天给大家分享的是数据分析的可视化部分。

### 简介

信息可视化(也叫绘图)是数据分析中最重要的⼯作之⼀。它可能是探索过程的⼀部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea等。

其实做 Python的数据可视化,可以使用的库分别是 Matplotlib 、Seaborn 、Bokeh、 Plotly 、Pyecharts等。

Matplotlib是Python数据可视化库中的泰斗,它已经成为python中公认的数据可视化工具,通过Matplotlib可以很方便的设计和输出二维以及三维的数据,其提供了常规的笛卡尔坐标,极坐标,球坐标,三维坐标等,其输出的图片质量也达到了科技论文中的印刷质量,日常的基本绘图更不在话下。

Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。

优势:

> (1)能将数据进行可视化,更直观的呈现
>
> (2)使数据更加客观,更具说服力

在分享Matplotlib之前我们先了解以下几个概念:

**画板、画纸的概念**

image01

我们知道画画时需要画板和画纸。在matplotlib中也是一个道理。

图形在画板(figure)中绘制完成,而画板又由不同的画布(纸)(axes)构成,具体的图形构建时要指明画板和画布,否则默认一画板一画布。

##### 画板(figure)

画板存在的意义:

- 控制图像的比例情况(大小)
- 保存图像

创建一个画板

> plt.figure(
> num=None, 用于指定在画板上,放几个画布
> figsize=None, (宽度, 高度)
> dpi=None, 图像的分辨率
> facecolor=None, 背景色
> edgecolor=None, 边界颜色
> frameon=True,
> FigureClass,
> clear=False,
> **kwargs,
> linewidth
> )

##### 画布(axes)

一个坐标系就是一个画布,就是一个图,一个画板上可以有多个坐标系

画布的创建
画布要创建在画板上
fig.add_subplot(nrows, ncols, index)
nrows将画板分为几行,ncols将画板分为几列,index选取使用哪一个被划分的画板

> add_subplot(nrows, ncols, index, \**kwargs)
> add_subplot(pos, **kwargs)
> add_subplot(ax)
> add_subplot()

画板与画布的关系

屏幕快照 2021-08-24 下午5.10.29

matplotlib图标的基本组成

- 画板figure 呈现出来的坐标系
- 绘图区域axes 【画布】
- x轴和y轴的水平垂直轴线 以及 轴标签
- 轴线上的刻度 以及 对应的刻度标签
- 画布标题
- 图例

### 如何使用绘图包Matplotlib?

matplotlib的基本要素:

```
# 导入pyplot和matplotlib模块

import matplotlib as mpl

from matplotlib import pyplot as plt

%matplotlib inline # 绘制的图片在当前文档显示
```

默认一画板一画纸,我们也可以自己定义画板figure和画布axes,添加顺序是:

> 1. 定义一个figure对象
> 2. 给figure对象添加subplot

比如:

```python
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt

%matplotlib inline

fig = plt.figure()
# 指定切分区域的位置
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)

random_arr = np.random.randn(100)
plt.plot(random_arr)

plt.show()
```

屏幕快照 2021-08-24 下午4.22.55

大家可以发现在最后一个画布上显示了图像,但是前面三个没有显示出来,原因是此时的plt是有上下文的,所谓上下文就是在ax2和ax3之间使用plt.plot()进行绘制则绘制的图形是ax2这个画纸的。即在哪个画纸下面执行画图就会绘制在谁上面,前提是下一个画布创建之前。所以如果在ax2和ax4上画图也可以改成如下代码,

```
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt

%matplotlib inline

fig = plt.figure()
random_arr = np.random.randn(100)
# 指定切分区域的位置
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
plt.plot(random_arr)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
plt.plot(random_arr)
plt.show()
```

屏幕快照 2021-08-24 下午4.28.28

注意: 如果绘图区域显示的图像比较小,可以结合参数figsize=(宽度,高度)进行设定。

当然也可以使用画布axes对象进行绘制,比如下面代码:

```
# 省略导入,同上
...
fig = plt.figure(figsize=(11,7)) # 画板的大小 设置的横向和纵向的值 单位是英寸 可以表示水平和垂直的缩放
random_arr = np.random.randn(100)
# 指定切分区域的位置
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
random_arr = np.random.randn(100)
ax1.plot(random_arr)
random_arr = np.random.randn(100)
ax2.plot(random_arr)
random_arr = np.random.randn(100)
ax3.plot(random_arr)
random_arr = np.random.randn(100)
ax4.plot(random_arr)
plt.show()
```

屏幕快照 2021-08-24 下午5.08.10

其中的add_subplot(self, *args, **kwargs) 表示向figure添加一个Axes作为一subplot布局的一部分。

add_subplot()方法本质上做了两件事:

1. 将整个Figure区域划分为Row * col的网格;
2. 在网格的指定格子(索引号)中创建一个Axes

add_subplot()网格有两种定义方式:

第一种是用3个参数,分别代表网格的,行数 nrows, 列数 ncols, 索引号index。它们都是位置参数。这种是第1种调用签名形式。

第二种是用一个3位数的整数,如,224,第一个2表示2行,第二个2表示2列,第3位上的4表示第4个格子。这就是第二种调用签名形式,pos为224,也是位置参数。
比如说创建一个2行2列的布局,绘图在第四个axes,注意:2*2的网格是虚拟的,起一个定位的作用

屏幕快照 2021-08-24 下午5.14.04

**小结:**

1. figure就是一个矩形容器(顶层容器),可以再划分为小方格,每个方格就是一个subplot,即子绘图区。
2. 一个图形中可以有多个subplot,这些subplot又可以被看作一个整体,有一些属性如整个subplot的位置、内部(单个subplot之间)的间距等,这些属性保存在figure.SubplotParams类中。可以通过Figure的subplotpars参数来修改这些属性。
3. 子图使用了subplot,而不是subfigure。fiugre仅是一个矩形容器,而plot则是具体的图形元素了,所以subplot会自动创建一个Axes,这个Axes是属于特定subplot的。

### 画布的设置

创建好了画布之后,我们就可以对画布进行设置,比如添加标题、坐标轴、设置坐标轴刻度、图例等

#### artist操作

**设置画布标题**

> axes.set_title(label)
> label,
> fontdict=None,
> loc=None,
> pad=None,
> *,
> y=None,
> **kwargs,
> )
> 可以设置标题的位置,样式

**设置坐标轴标签**

> axes.set_xlabel()
> axes.set_ylabel(
> ylabel, # 坐标轴标签名
> fontdict=None, # 字体大小
> labelpad=None,
> *,
> loc=None, # 位置{'left', 'center', 'right'}
> **kwargs,
>
> rotation, # 旋转
> color, # 颜色
> )

**开启和关闭坐标轴**

> axes.set_axis_on()
> axes.set_axis_off()

**设置坐标轴范围【相当于只看一部分】**

> axes.axis([xmin, xmax, ymin, ymax])
>
> axes.set_xlim(min,max)
> axes.set_ylim(min,max)

**设置坐标轴刻度**

> axes.set_xticks([float, float])
> axes.set_yticks(
> ticks=[float, float], 刻度的位置会根据数据的范围以及数据本身设置刻度的位置
> labels=['',''],
> rotation,
> fontsize,
> color
> )

**设置网格**

> axes.grid(b=None, which='major', axis='both', **kwargs)
> axes.grid(True
> )

**设置图例**
在绘图操作中设置label参数,再调用图例显示方法

在图例方法中传入字符串列表

> axes.legend(handles, labels, loc)
> ** loc:图例位置
> ** labels:图例标签名称
> ** handles:

> =============== =============
> Location String Location Code
> =============== =============
> 'best' 0
>
> 'upper right' 1
> 'upper left' 2
> 'lower left' 3
> 'lower right' 4
> 'right' 5
> 'center left' 6
> 'center right' 7
> 'lower center' 8
> 'upper center' 9
> 'center' 10
> =============== =============

案例:

```

fig = plt.figure(figsize=(10,5))
x = np.linspace(0, np.pi * 2, 100)
y = np.sin(x)
ax1 = fig.add_subplot(1,2,1)
ax1.set_title('正余弦波', fontsize=20, fontweight='bold', horizontalalignment='left', verticalalignment='bottom') # 默认是不支持汉字的
ax1.plot(x, y)
ax1.plot(x, np.cos(x))
ax1.legend(['sin(x)', 'cos(x)'],loc='upper right')
ax2 = fig.add_subplot(1,2,2)

random_arr = np.random.randn(100)
ax2.plot(random_arr)
ax2.set_title('标准正态分布')
```

设置的标题是中文的,因为要想支持中文可以添加如下代码在执行之前:

```
plt.rcParams['font.sans-serif'] = ['Simhei']
# 中文情况下 负号显示会有异常 所以还需要设置负号的操作
# 'axes.unicode_minus'
plt.rcParams['axes.unicode_minus'] = False
# 设置的是点的标记 默认是就是None 不显示
plt.rcParams['lines.marker'] = 'None'
```

屏幕快照 2021-08-24 下午5.42.10

当然上面的操作也可以在上下文上完成,结果是一样的。只不过去掉了set_title()中的set_直接使用plt绘制。其他属性也是一样的。即:

```
fig = plt.figure(figsize=(10,5))
x = np.linspace(0, np.pi * 2, 100)
y = np.sin(x)
ax1 = fig.add_subplot(1,2,1)
plt.title('正余弦波', fontsize=20, fontweight='bold', horizontalalignment='left', verticalalignment='bottom') # 默认是不支持汉字的
plt.plot(x, y)
plt.plot(x, np.cos(x))
plt.legend(['sin(x)', 'cos(x)'],loc='upper right')
ax2 = fig.add_subplot(1,2,2)

random_arr = np.random.randn(100)
plt.plot(random_arr)
plt.title('标准正态分布')
```

 

相关文章

明道、teambition、Tower.im、Worktile、trello的功能都有哪些?

明道、teambition、Tower.im、Worktile、trello的功能都有哪些?

2023-10-14
反欺诈中所用到的机器学习模型有哪些?

反欺诈中所用到的机器学习模型有哪些?

2023-10-14
强化学习中on-policy与off-policy有什么区别?

强化学习中on-policy与off-policy有什么区别?

2023-10-14
为什么交叉熵可以用于计算代价?

为什么交叉熵可以用于计算代价?

2023-10-14

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取