【数据可视化】Matplotlib 从入门到精通学习笔记

数据可视化是什么

如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,原因在于图表数据更加直观且形象化,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做数据可视化。

输出结果图

subplots

matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。

subplots 的函数格式如下:

fig , ax = plt.subplots(nrows, ncols)

nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列数。

函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)。

下面我们创建了一个 2 行 2 列的子图,并在每个子图中显示 4 个不同的图像。

from matplotlib import pyplot as plt
import numpy as np
fig,a=plt.subplots(2,2)
x=np.arange(-10,10,0.01)
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('sqrt')
a[1][0].plot(x,exp(x))
a[1][0].set_title('exp(x)')
a[1][1].plot(x,log2(x))
a[1][1].set_title('log2(x)')
plt.show()

上述代码的输出结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IxFhgJL-1668750878059)(D:\\学习\\笔记\\matplotlib图片\\18.png)]

subplot2grid()

matplotlib.pyplot 模块提供了 subplot2grid() ,该函数能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。

函数语法格式如下:

plt.subplot2grid(shape, location, rowspan, colspan)

参数含义如下:

  • shape:把该参数值规定的网格区域作为绘图区域;
  • location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
  • rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。

下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:

from matplotlib import pyplot as plt
import numpy as np
import math
a1=plt.subplot2grid((3,3),(0,0),colspan=2)
a2=plt.subplot2grid((3,3),(0,2),rowspan=3)
a3=plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=2)
x=np.arange(-math.pi*2,math.pi*2,0.1)
a1.plot(x,np.sin(x),'r-.')
a2.plot(x,np.exp(x),'c-')
a3.plot(x,np.cos(x),'g-.')
plt.show()

输出结果如下:

在这里插入图片描述

subplot2grid()输出结果

grid()

grid() 的函数使用格式如下:

grid(color='b', ls = '-.', lw = 0.25)

参数含义如下:

  • color:表示网格线的颜色;
  • ls:表示网格线的样式;
  • lw:表示网格线的宽度;

网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果您只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。

from matplotlib import pyplot as plt
import numpy as np
import math
fig,a=plt.subplots(1,3,figsize=(12,6))
x=np.arange(0,20,1)
a[0].plot(x,x**3,'g-.',lw=2)
a[0].grid(True)
a[0].set_xlabel('x')
a[0].set_ylabel('y')
a[0].set_title("y=x**3")
a[1].plot(x,np.exp(x),'r--',lw=2)
a[1].grid(True)
a[1].set_xlabel('x')
a[1].set_ylabel('y')
a[1].set_title("y=exp(x)")
a[2].plot(x,np.log2(x),'c-',lw=2)
a[2].grid(True)
a[2].set_xlabel('x')
a[2].set_ylabel('y')
a[2].set_title("y=.log2(x)")
fig.tight_layout()
fig.show()

上述代码执行后,输出结果

在这里插入图片描述

图1:输出结果

在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。

示例:右侧的子图显示对数刻度,左侧子图则显示标量刻度。

import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 2, figsize=(10,4))
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title("Normal scale")
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
#设置y轴
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)")
axes[0].set_xlabel("x axis")
axes[0].set_ylabel("y axis")
axes[0].xaxis.labelpad = 10
#设置x、y轴标签
axes[1].set_xlabel("x axis")
axes[1].set_ylabel("y axis")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbd59HQu-1668750878061)(D:\\学习\\笔记\\matplotlib图片\\21.png)]

图1:对数关系图

轴的设置

轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。通过指定轴的颜色和宽度,从而对进行显示格式设置,比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#为左侧轴,底部轴添加颜色
ax.spines['bottom'].set_color('blue')
ax.spines['left'].set_color('red')
ax.spines['left'].set_linewidth(2)
#将侧轴、顶部轴设置为None
ax.spines['right'].set_color(None)
ax.spines['top'].set_color(None)
ax.plot([1,2,3,4,5])
plt.show()

输出结果如下:

在这里插入图片描述

设置x,y轴

Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。

当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。

下面示例分别对自动设置和自定义设置做了演示:第一种 Matplotlib 自动设置

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
#添加绘图区域
a1 = fig.add_axes([0,0,1,1])
 #准备数据
x = np.arange(1,10)
#绘制函数图像
a1.plot(x, np.exp(x))
#添加题目
a1.set_title('exp')
plt.show()

代码执行后,输出结果如下:

在这里插入图片描述

图1:输出结果

第二种:自定义设置,set_xlim() 将 x 轴的数值范围设置为(0到10); set_ylim() 将 y 轴的范围设置为(0到10000)。

from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(0,10)
y=np.exp(x)
plg=plt.figure()
a1=plg.add_axes([0,0,1,1])
a1.plot(x,y)
a1.set_xlim(0,15)
a1.set_ylim(0,10000)

输出结果如下:

在这里插入图片描述

设置刻度

刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。

xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如下所示:

ax.set_xticks(2,4,6,8,10)

x 轴上的刻度标记,依次为 2,4,6,8,10。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。

下面示例对刻度和标签的使用方法做了说明。

```python

from matplotlib import pyplot as plt

import numpy as np

import math

x=np.arange(0,10)

y=np.exp(x)

plg=plt.figure()

a1=plg.add_axes(0,0,1,1)

a1.plot(x,y)

a1.set_xticklabels(i for i in range(11))

a1.set_yticklabels(math.e**i for i in range(10))

输出结果如下:

![在这里插入图片描述](https://img-blog.csdnimg.cn/361ab4bdc14444169d360682a87f8008.png)



图1:绘制坐标轴刻度与标签

## 解决中文乱码

### **重写配置文件**

通过临时重写配置文件的方法,可以解决 Matplotlib 显示中文乱码的问题,代码如下所示:

`import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题`

将上述代码添加到您的绘图程序中,即可解决中文乱码的问题。这是一种非常灵活、便捷的解决方法。完整的程序代码如下:

```python

import matplotlib.pyplot as plt

plt.rcParams"font.sans-serif"="SimHei" #设置字体

plt.rcParams"axes.unicode_minus"=False #该语句解决图像中的“-”负号的乱码问题

x=2015,2016,2017,2018,2019,2020,2021,2022

y=8.1,7.2,8.2,7.3,6.4,7.3,7.4,2.9

plt.plot(x,y)

plt.xlabel('年份')

plt.ylabel('增长率%')

plt.fill_between(x,y,5,color='yellow')

输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0490ca1fbc9347a1a893450b86a42269.png)

不过上述解决方案适用于所有操作系统,其唯一弊端是每编写一个绘图程序就要添加一次相同的代码。

### **修改配置文件**

下面介绍第二种方式:通过直接修改配置文件的方法,可以一劳永逸的解决 Matplotlib 的中文乱码问题。注意此过程在 Windows 环境下进行。  

Matplotlib 从配置文件 matplotlibrc 中读取相关配置信息,比如字体、样式等,因此我们需要对该配置文件进行更改。首先查看 matplotlibrc 所在的目录,使用如下代码确定目录位置:

```python

import matplotlib

matplotlib.matplotlib_fname()

然后修改配置文件 matplotlibrc。打开配置文件后,找到以下信息:

\\#font.family: sans-serif

\\#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif

将上述配置项前面的#去掉,并修改的配置项,如下所示:

font.family : Microsoft YaHei, sans-serif

font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif

注意,由于版本问题,上述内容配置信息可能存在一些差异,请自动忽略。  

最后,在以下目录中复制中文字体微软雅黑:

C:\\Windows\\Fonts\\Microsoft YaHei UI

复制完成后,将字体粘贴至以下路径文件中:

返回路径中

字体粘贴后会出现一个 MSYH.ttc 的字体文件

## twinx() twiny()

在一些应用场景中,有时需要绘制两个 x 轴或两个 y 轴,这样可以更直观地显现图像,从而获取更有效的数据。Matplotlib 提供的 twinx() 和 twiny() 函数,除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线,比如一个轴绘制对函数,另外一个轴绘制指数函数。  

下面示例绘制了一个具有两个 y 轴的图形,一个显示指数函数 exp(x),另一个显示对数函数 log(x)。

```python

import matplotlib.pyplot as plt

import numpy as np

fig = plt.figure()

a1 = fig.add_axes(0,0,1,1)

x = np.arange(10)

a1.plot(x,x**2)

a1.set_ylabel('x**2')

a2 = a1.twinx()

a2.plot(x, np.log(x),'ro-')

a2.set_ylabel('log')

fig.legend(labels = ('x**2','log'),loc='upper left')

plt.show()

输出结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4a19ead6d25c44319fed9917f0660304.png)


## 绘制多做图形

### 柱状图

柱状图是一种用矩形柱来表示数据分类的图表,柱状图可以垂直绘制,也可以水平绘制,它的高度与其所表示的数值成正比关系。柱状图显示了不同类别之间的比较关系,图表的水平轴 X 指定被比较的类别,垂直轴 Y 则表示具体的类别值。  

Matplotlib 提供了bar()函数来绘制柱状图,它可以应用在 MATLAB 样式以及面向对象的绘图方法中。当它与 axes 对象一起使用时,其语法格式如下:

ax.bar(x, height, width, bottom, align)

该函数的参数说明,如下表所示:

| bar()函数参数说明 |                                                                                                        |
|-------------------|--------------------------------------------------------------------------------------------------------|
| x                 | 一个标量序列,代表柱状图的x坐标,默认x取值是每个柱状图所在的中点位置,或者也可以是柱状图左侧边缘位置。 |
| height            | 一个标量或者是标量序列,代表柱状图的高度。                                                             |
| width             | 可选参数,标量或类数组,柱状图的默认宽度值为 0.8。                                                     |
| bottom            | 可选参数,标量或类数组,柱状图的y坐标默认为None。                                                      |
| algin             | 有两个可选项 {"center","edge"},默认为 'center',该参数决定 x 值位于柱状图的位置。                     |

该函数的返回值是一个 Matplotlib 容器对象,该对象包含了所有柱状图。  

#### 绘制简单柱状图

```python

from matplotlib import pyplot as plt

fig=plt.figure()

a=fig.add_axes(0,0,1,1)

langs = 'C', 'C++', 'Java', 'Python', 'PHP'

students=23,34,28,40,17

a.bar(langs,students,width=0.9)

plt.show()

输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d32c6f4d49c444569cbf282cf27f4d1c.png)

图1:matplotlib bar()绘图  

#### 同一 x 轴位置绘制多个柱状图

通过调整柱状图的宽度,可以实现在同一 x 轴位置绘制多个柱状图。您可以将它们设置成不同的颜色,从而使它们更容易区分。下面示例描述了某工程学院过去四年中,三个专业录取的统招学生数量。

```python

import numpy as np

import matplotlib.pyplot as plt

#准备数据

data =[30, 25, 50, 20,40, 23, 51, 17,35, 22, 45, 19]

X = np.arange(4)

fig = plt.figure()

#添加子图区域

ax = fig.add_axes([0,0,1,1])

#绘制柱状图

ax.bar(X + 0.00, data0, color = 'b', width = 0.25)

ax.bar(X + 0.25, data1, color = 'g', width = 0.25)

ax.bar(X + 0.50, data2, color = 'r', width = 0.25)

上述代码执行后,将显示四个柱状图,将每个柱状图又均分为三个小柱状图,每个柱状图占据 0.25 个单位。

图2:matplotlib绘图

#### 堆叠柱状图

柱状图除了上述使用方法外,还有另外一种堆叠柱状图。所谓堆叠柱状图就是将不同数组别的柱状图堆叠在一起,堆叠后的柱状图高度显示了两者相加的结果值。  

bar() 函数提供了一个可选参数bottom,该参数可以指定柱状图开始堆叠的起始值,一般从底部柱状图的最大值开始,依次类推。  

下面是一个不同国家参加奥林匹克运动会所得奖牌(金银铜)的柱状堆叠图示例,如下所示:

```python

import numpy as np

import matplotlib.pyplot as plt

countries = 'USA', 'India', 'China', 'Russia', 'Germany'

bronzes = np.array(38, 17, 26, 19, 15)

silvers = np.array(37, 23, 18, 18, 10)

golds = np.array(46, 27, 26, 19, 17)

ind = x for x, _ in enumerate(countries)

#绘制堆叠图

plt.bar(ind, golds, width=0.5, label='golds', color='gold', bottom=silvers+bronzes)

plt.bar(ind, silvers, width=0.5, label='silvers', color='silver', bottom=bronzes)

plt.bar(ind, bronzes, width=0.5, label='bronzes', color='#CD853F')

#设置坐标轴

plt.xticks(ind, countries)

plt.ylabel("Medals")

plt.xlabel("Countries")

plt.legend(loc="upper right")

plt.title("2022 Top Scorers")

plt.show()

在上述代码中,第一次调用plt.bar()绘制了黄色柱状图, 第二次调用plot.bar()时绘制了灰色柱状图,最后一次调用plt.bar()则绘制最底部的柱状图。两个柱状图相接触的位置就是顶部与底部的位置,这样就构成了柱状堆叠图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/44039a8ee83045d5a3dcf156d88929fa.png)


### 直方图

直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。  

首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。  

例如,我们对某工厂的员工年龄做直方图统计,首先我们要统计出每一位员工的年龄,然后设定一个 20 至 65 的数值范围,并将该数值范围细分为 4 个区间段 (20,35),(35,45),(45,55),(55,65) , 最后通过直方图的形式,展示该工厂员工在相应年龄区间的分布情况。  

如果想要构建直方图,必须遵循以下步骤:

- 将整个值范围划分为一系列区间。

- 区间值(bin)的取值,不可遗漏数据;

- 计算每个区间中有多少个值。

通常将 bin 指定为连续且不重叠的数值区间,而 bin 值指区间开始和结束的数值。

您可以使用下面的函数来绘制直方图:

matplotlib.pyplot.hist()

该函数的参数说明如下:

| x        | 必填参数,数组或者数组序列。                                                                                           |
|----------|------------------------------------------------------------------------------------------------------------------------|
| bins     | 可选参数,整数或者序列,bins 表示每一个间隔的边缘(起点和终点)默认会生成10个间隔。                                    |
| range    | 指定全局间隔的下限与上限值 (min,max),元组类型,默认值为 None。                                                        |
| density  | 如果为 True,返回概率密度直方图;默认为 False,返回相应区间元素的个数的直方图。                                        |
| histtype | 要绘制的直方图类型,默认值为“bar”,可选值有 barstacked(堆叠条形图)、step(未填充的阶梯图)、stepfilled(已填充的阶梯图)。 |

以下示例绘制了班级学生得分情况的直方图。其中定义了四个区间(bins)分别是:0-25、26-50、51-75 和 76-100。直方图显示了相应范围的学生人数。

```python

from matplotlib import pyplot as plt

import numpy

fig,a=plt.subplots(1,1)

data=21,34,56,87,99,11,23,45,76,12,35,12,46,86,56,77,9,57,79

a.hist(data)

a.set_xticks(10,20,30,40,50,60,70,80,90,100)

上述代码执行后,输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/45b44dbef88941529569c3c0efaf52bd.png)

图1:直方图绘制结果

### 饼状图

饼状图用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目的占项目总和的百分比。  

Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:

[TABLE]

以下示例:关于不同计算机语言学习人数的饼状图。autopct 参数设置为 %1.2f% ,并将各项所占总和的百分比显示在相对应的扇形区内。

```python

from matplotlib import pyplot as plt

import numpy as np

flg=plt.figure()

a=flg.add_axes(0,0,1,1)

a.axis('equal')

subject='c','c++','java','python','maltab'

students=12,16,23,25,14

a.pie(students, labels = langs,autopct='%1.3f%%')

plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/dfce61eae3ba4026a8fb74bd9247e8b8.png)

图1:Matplotlib饼状图

折线图(line chart)是我们日常工作、学习中经常使用的一种图表,它可以直观的反映数据的变化趋势。与绘制柱状图、饼状图等图形不同,Matplotlib 并没有直接提供绘制折线图的函数,因此本节着重讲解如何绘制一幅折线图。

### 折线图

#### **绘制单条折线**

下面示例是关于 C语言中文网用户活跃度的折线图:

```python

from matplotlib import pyplot as plt

x = "Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"

y = 20, 40, 35, 55, 42, 80, 50

plt.plot(x,y,"g",markersize=4,label="周活跃")

plt.xlabel("登陆时间")

plt.ylabel("周活跃度")

plt.legend(loc="lower right")

plt.title("博客")

for x1, y1 in zip(x, y):

plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)

plt.savefig("1.jpg")

plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/8bdb3ea831ef427f896f5fc1f6adcabb.png)


#### **绘制多条折线图**

当学习完如何绘制单条折线的绘制后,再绘制多条折线也变的容易,只要准备好绘制多条折线图的数据即可。  

下面是一个简单示例,绘制了两天内同一时刻,天气温度随时间变化的折线图:

```python

from matplotlib import pyplot as plt

x = 5, 8, 12, 14, 16, 18, 20

y1 = 18, 21, 29, 31, 26, 24, 20

y2 = 15, 18, 24, 30, 31, 25, 24

plt.plot(x,y1,'y',marker="*",markersize=8)

plt.plot(x,y2,'g',marker="*",markersize=8)

#* 表示绘制五角星;此处也可以不设置线条颜色,matplotlib会自动为线条添加不同的颜色

plt.title("temperture's map")

for a,b in zip(x,y1):

plt.text(a,b,str(b),ha='center',va='bottom',fontsize=8)

for a,b in zip(x,y2):

plt.text(a,b,str(b),ha='center',va='bottom',fontsize=10)

plt.xlabel("time")

plt.ylabel("temperture")

plt.legend('today','nextday',loc='lower right')

plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/ec69417e3a0e43219e444c9261d22531.png)


### 散点图

散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势。通俗地讲,它反映的是一个变量受另一个变量的影响程度。  

散点图将序列显示为一组点,其中每个散点值都由该点在图表中的坐标位置表示。对于不同类别的点,则由图表中不同形状或颜色的标记符表示。同时,您也可以设置标记符的颜色或大小。  

下面示例,绘制了学生考试成绩的散点图,其中蓝色代表男孩成绩,红色表示女孩的成绩。

```python

from matplotlib import pyplot as plt

girls_grades = 89, 90, 70, 89, 100, 80, 90, 100, 80, 34

boys_grades = 30, 29, 49, 48, 100, 48, 38, 45, 20, 30

grades_range = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

fig=plt.figure()

ax=fig.add_axes(0,0,1,1)

ax.scatter(grades_range,girls_grades,color='b',label='girl')

ax.scatter(grades_range,boys_grades,color='g',label='boy')

ax.set_xlabel('graderange')

ax.set_ylabel('score')

ax.set_title('graderangescore')

plt.legend('girl','boy',loc='lower right')

plt.show()

代码执行后,输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/35ec22e484604c069005562765ccf80e.png)


### 等高线图

等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。  

自变量 X 和 Y 需要被限制在矩形网格内,您可以将 x 、y 数组作为参数传递给 numpy.meshgrid() 函数来构建一个网格点矩阵。

关于 meshgrid() 函数用法可参考《*numpy.meshgrid()用法详解*》。

Matplotlib API 提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。

```python

from matplotlib import pyplot as plt

import numpy as np

xlist = np.linspace(-3.0, 3.0, 10)

ylist=np.linspace(-3.0,3.0,100)

X, Y = np.meshgrid(xlist, ylist)

Z=np.sqrt(X2+Y2)

fig,ax=plt.subplots(1,1)

cp = ax.contourf(X,Y,Z)#填充等高线颜色

fig.colorbar(cp)

plt.contour(X,Y,Z,colors=('y'))#画等高线

ax.set_title('Filled Contours Plot')

ax.set_xlabel('x (cm)')

ax.set_ylabel('y (cm)')

plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/187d19d4eeef4b378e8fa64b2ed9c85f.png)

图1:等高线示例图  


左侧图像绘制了两个变量 X、Y ,右侧的颜色柱(colorbar)则表示 X 的取值,颜色越深表示值越小,中间深色部分的圆心点表示 x=0,y=0,z=0。

### 箱型图

箱型图(也称为盒须图)于 1977 年由美国著名统计学家**约翰·图基**(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。  

在箱型图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)。箱型图结构如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d1f2051060b746b68e3cab5ba2805348.png)



首先准备创建箱型图所需数据:您可以使用numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量。如下所示:

```python

collectn_1 = np.random.normal(500, 250, 100)

collectn_2 = np.random.normal(800, 180, 200)

collectn_3 = np.random.normal(900, 150, 300)

collectn_4 = np.random.normal(700, 100, 200)

然后用 data_to_plot 变量指定创建箱型图所需的数据序列,最后用 boxplot() 函数绘制箱型图,完整代码如下所示:

```python

import numpy as np

from matplotlib import pyplot as plt

collectn_1 = np.random.normal(500, 250, 100)

collectn_2 = np.random.normal(800, 180, 200)

collectn_3 = np.random.normal(900, 150, 300)

collectn_4 = np.random.normal(700, 100, 200)

data=collectn_1,collectn_2,collectn_3,collectn_4

fig=plt.figure()

ax=fig.add_axes(0,0,1,1)

ax.boxplot(data)

plt.show()

上述代码执行后,输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f8f1040a2ab64b03ba89ba6ef733ade7.png)


## 三维绘图

最初开发的 Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础上,构建了一部分较为实用的 3D 绘图程序包,比如 mpl_toolkits.mplot3d,通过调用该程序包一些接口可以绘制 3D散点图、3D曲面图、3D线框图等

mpl_toolkits 是 Matplotlib 的绘图工具包。

### **第一个三维绘图程序**

下面编写第一个三维绘图程序。  

首先创建一个三维绘图区域, plt.axes() 函数提供了一个参数projection,将其参数值设置为 "3d"。如下所示:

```python

#导入三维工具包mplot3d

from mpl_toolkits import mplot3d

import numpy as np

import matplotlib.pyplot as plt

fig = plt.figure()

#创建3d绘图区域

ax = plt.axes(projection='3d')

有了三维绘图区域,接下来就要构建 3d 图像,如下所示:

`#从三个维度构建`

```python

import numpy as np

z=np.linspace(0,1,100)

x=10np.cos(z100)

y=10np.sin(z100)

最后调用 plot3D() 方法绘制 3d 图形,代码如下:

```python

ax.plot3D(x,y,z,'gray')

ax.set_title("3D Line")

完整程序如下所示:

```python

from matplotlib import pyplot as plt

from mpl_toolkits import mplot3d

import numpy as np

z=np.linspace(0,1,100)

x=10np.cos(z100)

y=10np.sin(z100)

fig=plt.figure()

ax=plt.axes(projection='3d')

ax.plot3D(x,y,z,'gray')

ax.set_title("3D Line")

plt.show()

输出结果如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e3ad6aa99cc04ad7a77c48baf9e395d3.png)


上述代码中的 ax.plot3D() 函数可以绘制各种三维图形,这些三维图都要根据(x,y,z)三元组类来创建。

### **3D散点图**

通过 ax.scatter3D() 函数可以绘制 3D 散点图,示例代码如下:

```python

from matplotlib import pyplot as plt

import mpl_toolkits.mplot3d

import numpy as np

z=np.linspace(-1,1,1000)

x=10np.cos(z100)

y=10np.sin(z100)

fig=plt.figure()

ax=plt.axes(projection='3d')

ax.scatter3D(x,y,z)

ax.set_title("Scatter 3D Line")

plt.show()

输出结果图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b3b53a1f85c14971a0fbd54e3d04bab2.png)

### **3D等高线图**

ax.contour3D() 可以用来创建三维等高线图,该函数要求输入数据均采用二维网格式的矩阵坐标。同时,它可以在每个网格点(x,y)处计算出一个 z 值。  

以下示例展示了如何绘制三维正弦等高线图。代码如下:

```python

def f(x, y):

return np.sin(np.sqrt(x ** 2 + y ** 2))

from matplotlib import pyplot as plt

import mpl_toolkits.mplot3d

import numpy as np

x = np.linspace(-1, 1, 100)

y = np.linspace(-1, 1, 100)

#将数据网格化处理

X, Y = np.meshgrid(x, y)

Z = f(X, Y)

fig=plt.figure()

ax=plt.axes(projection='3d')

ax.contour3D(X,Y,Z,50, cmap='binary')

ax.set_title("Scatter 3D Line")

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('z')

plt.show()

输出结果图如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/908bdb53b07f470ca4c0585a93cf932f.png)


### **3D线框图**

线框图同样要采用二维网格形式的数据,与绘制等高线图类似。  

线框图可以将数据投影到指定的三维表面上,并输出可视化程度较高的三维效果图。通过 plot_wireframe() 能够绘制 3D 线框图。

代码如下:

```python

def f(x, y):

return np.sin(np.sqrt(x ** 2 + y ** 2))

from matplotlib import pyplot as plt

import mpl_toolkits.mplot3d

import numpy as np

x = np.linspace(-3, 3, 100)

y = np.linspace(-3, 3, 100)

#将数据网格化处理

X, Y = np.meshgrid(x, y)

Z = f(X, Y)

fig=plt.figure()

ax=plt.axes(projection='3d')

#调用绘制线框图的函数plot_wireframe()

ax.plot_wireframe(X, Y, Z, color='g')

ax.set_title("wireframe 3D Line")

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('z')

plt.show()

输出结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bfbd3e12f5cb4d78b4062c230c9252d7.png)


### **3D曲面图**

曲面图表示一个指定的因变量y与两个自变量x和z之间的函数关系。  

3D 曲面图是一个三维图形,它非常类似于线框图。不同之处在于,线框图的每个面都由多边形填充而成。Matplotlib 提供的 plot_surface() 函数可以绘制 3D 曲面图,该函数需要接受三个参数值 x,y 和 z 。示例代码如下:

```python

from mpl_toolkits import mplot3d

import numpy as np

import matplotlib.pyplot as plt

#求向量积(outer()方法又称外积)

x = np.outer(np.linspace(-2.5, 2.5, 100), np.ones(100))

y = x.copy().T

#数据z

z = np.cos(x 2 + y 2)

#绘制曲面图

fig = plt.figure()

ax = plt.axes(projection='3d')

#调用plot_surface()函数

ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')

ax.set_title('Surface plot')

plt.show()

输出结果图:

在这里插入图片描述
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
【数据可视化】Matplotlib 从入门到精通学习笔记
如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,原因在于图表数据更加直观且形象化,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做数...
<<上一篇
下一篇>>