声明:

  • 以下代码均亲自实现验证
  • 用例均摘自Matplotlib教程(非常详细) (biancheng.net))

一、Matplotlib的介绍

1.matplotlib的架构组成

1)脚本层:脚本层是 Matplotlib 结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行,它的主要工作是负责生成图形与坐标系。

2)美工层:美工层是结构中的第二层,它提供了绘制图形的元素时的给各种功能,例如,绘制标题、轴标签、坐标刻度等。

3)后端层:后端层是 Matplotlib 最底层,它定义了三个基本类,首先是 FigureCanvas(图层画布类),它提供了绘图所需的画布,其次是 Renderer(绘图操作类),它提供了在画布上进行绘图的各种方法,最后是 Event(事件处理类),它提供了用来处理鼠标和键盘事件的方法。

2.matplotlib的图形组成

1)Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的元素,比如标题、轴线等

2)Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区

3)Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签

4)Artist:您在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)

3.Matplotlib功能扩展包

许多第三方工具包都对 Matplotlib 进行了功能扩展,其中有些安装包需要单独安装,也有一些允许与 Matplotlib 一起安装。常见的工具包如下:

1)Bashmap:这是一个地图绘制工具包,其中包含多个地图投影,海岸线和国界线

2)Mplot3d:它用于 3D 绘图

二、第一个Matplotlib绘图程序

Matplotlib 中的 pyplot 模块是一个类似命令风格的函数集合,这使得 Matplotlib 的工作模式和 MATLAB 相似。pyplot 模块提供了可以用来绘图的各种函数,比如创建一个画布,在画布中创建一个绘图区域,或是在绘图区域添加一些线、标签等。

from matplotlib import pyplot as plt
import numpy as np
import math# 首先使用 NumPy 提供的函数 arange() 创建一组数据来绘制图像。
x = np.arange(0, math.pi*2, 0.05)
# 上述所得 x 的值作用到 x 轴上,而该值对应的正弦值,也就是 y 值,使用以下方法获取.
y=np.sin(x)
# 使用 plot() 函数对 x、y 进行绘制。
plt.plot(x,y)
# 主要的绘图工作已经完成,不过还需要绘制一些细节,需要我们补充一下,比如图像的标题(title)、x 轴与 y 轴的标签(label)等。
plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')
# 使用show展示图像
plt.show()

三、pyplot.figure图形对象

在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。

figure对象是一个顶级容器,用来放置、布局子绘图组件。

参数如下图所示:

参数 说明
figsize 指定画布的大小(宽度和高度),单位是英寸
dpi 指定绘图对象的分辨率(即每英寸多少像素),默认值是80
facecolor 背景颜色
dgecolor 边框颜色
frameon 是否显示边框

利用plot.figure作图:

from matplotlib import pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x,y)
ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')
plt.show()
  • 敲重点 :     详细讨论Figure的add_axes()方法 

axes是figure容器中的一个格子,可以进一步将figure划分多个子区域,这就像一个文件柜被划分为多个格子或抽屉一样。

Axes是Figure子容器中最重要的一个子容器。Axes是一个矩形区域,这个矩形是基于figure坐标系统定义的。

要向figure中添加axes子区域,有三个途径:

1. 使用figure的add_axes()方法;

2.使用figure的add_subplot()方法;

3.创建一个Axes对象实例,再将这个实例添加到figure中。

  add_axes()方法的调用:add_axes(rect, projection=None, polar=False, **kwargs)                             其中的 rect 是位置参数,接受一个4元素的浮点数列表, [left, bottom, width,                                   height] ,它定义了要添加到figure中的矩形子区域的:左下角坐标(x, y)、宽度、                             高度。

注意:每个元素的值是figure宽度和高度的分数。即将figure的宽、高作为1个单位。

四、axes类使用详解

Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。

通过调用 add_axes() 方法能够将 axes 对象添加到画布中,该方法用来生成一个 axes 轴域对象,对象的位置由参数rect决定。

下面介绍 axes 类的其他成员函数,这些函数在绘图过程中都承担着不同的作用:

1.legend()绘制图例

 ax.legend(handles, labels, loc)

1.labels 是一个字符串序列,用来指定标签的名称(使用元组);

2.loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示;

3.handles 参数,它也是一个序列,它包含了所有线型的实例;

下面是 loc 参数的表示方法,分为字符串和整数两种,如下所示:

位置 字符串表明 整数数字表示
自适应 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

2.plot()指定线型、标记颜色、样式以及大小

1)颜色

’b' 蓝色
'g' 绿色
'r' 红色
'c' 青色
'm' 品红色
'y' 黄色
'k' 黑色
'w' 白色

2)标记符号

‘.’

点标记

‘o' 圆圈标记
‘x' X标记
'D' 砖石标记
’H‘ 六角标记
’s‘ 正方形标记
’+‘ 加号标记

3)线型

’-‘ 实线
’--‘ 虚线
’-.‘ 点划线
’:’ 虚线
‘H’ 六角标记

下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。

from matplotlib import pyplot as plty=[1,4,9,16,25,36,49,64]
x1=[1,16,30,42,55,68,77,88]
x2=[1,6,12,18,28,40,52,65]fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#使用简单的形式  color/标记符/线型
l1=ax.plot(x1,y,'ys-')
l2=ax.plot(x2,y,'go--')
ax.legend(labels=('smartphone','tv'),loc='lower right')ax.set_title('Advertisement effect on sales')
ax.set_xlabel('medium')
ax.set_ylabel('sales')
plt.show()

五、subplot()、subplots()、subplot2grid()用法详解

1.subplot()函数用法

在使用 Matplotlib 绘图时,我们大多数情况下,需要将一张画布划分为若干个子区域,之后,我们就可以在这些区域上绘制不用的图形。

(1)plt.subplot(nrows, ncols, index)

它可以均等地划分画布,nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。

subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。

 敲重点:如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。

#没有使用figure画布对象情况
from matplotlib import pyplot as plt
#先创建子图在进行画图
plt.subplot(212)
plt.plot([1,2,3])
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
plt.subplot(211)
plt.plot(range(12),color='y')
plt.show()

(2)add_subplot() 函数

如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:

from matplotlib import pyplot as plt
fig = plt.figure()ax1=fig.add_subplot(111)
ax1.plot([1,2,3])ax2=fig.add_subplot(221,facecolor='y')
ax2.plot([1,2,3])plt.show()

(3)通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。

import matplotlib.pyplot as plt
import numpy as np
import mathx=np.arange(0,math.pi*2,0.05)
fig=plt.figure()axes1=fig.add_axes([0.1,0.1,0.8,0.8])
axes2=fig.add_axes([0.55,0.55,0.3,0.3])
y=np.sin(x)
axes1.plot(x,y,'b')
axes2.plot(x,np.cos(x),'r')
axes1.set_title('sine')
axes2.set_title('cosine')plt.show()

2.subplots()函数用法

subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象。( subplot() 只是创建一个包含子图区域的画布)

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

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

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

如果想要设置子图的宽度和高度可以在函数内加入figsize值
fig, ax = plt.subplots(1,3,figsize=(15,7)),这样就会有1行3个15x7大小的子图。

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

import numpy as np
from matplotlib import pyplot as pltx=np.arange(1,5)
fig,axe=plt.subplots(2,2)   #此处不可以写成22
#绘制平方函数
axe[0][0].plot(x,x*x)
axe[0][0].set_title('square')
#绘制平方根函数
axe[0][1].plot(x,np.sqrt(x))
axe[0][1].set_title('squre root')    #此处为第一排第二列
#绘制指数函数
axe[1][0].plot(x,np.exp(x))
axe[1][0].set_title('exp')      #此处为第二排第一列
#绘制对数函数
axe[1][1].plot(x,np.log10(x))
axe[1][1].set_title('log')
plt.show()

3.subplot2grid()函数用法

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

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

参数含义如下:

shape:把该参数值规定的网格区域作为绘图区域;

location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;

rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。使用 colspan指定列,使用rowspan指定行(默认值为1)

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

from matplotlib import pyplot as plt
import numpy as np
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),rowspan=2,colspan=2)x = np.arange(1,10)
a1.plot(x,np.exp(x))
a1.set_title('exp')
a2.plot(x,x*x)
a2.set_title('square')
a3.plot(x,np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()
  • 敲重点:

plt.tight_layout()t会自动调整子图参数,使之填充整个图像区域。这是个实验特       ·                      性,可能在一些情况下不工作。它仅仅检查坐标轴标签、刻度标签以及标题的部·                       分。

六、grid()设置网格格式

axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。

grid(color, ls , lw )

参数含义如下:

color:表示网格线的颜色;

ls:表示网格线的样式;

lw:表示网格线的宽度;

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

import numpy as np
from matplotlib import pyplot as plt
x=np.arange(1,11)
fig,axes=plt.subplots(1,3,figsize = (12,4))     #figsize 参数用于设置画布的总大小
axes[0].plot(x,x**3,'g',lw=2)
#开启网格
axes[0].grid(True)
axes[0].set_title('default grid')
axes[1].plot(x,np.exp(x),'r',lw=2)
#开启网格,并设置网格的颜色,线型,线宽
axes[1].grid(True,color='b',ls='--',lw=1)
axes[1].set_title('custom grid')
axes[2].plot(x,x)
axes[2].set_title('no grid')
fig.tight_layout()
plt.show()

七、Matplotlib设置坐标轴格式

(1)Matplotlib 通过 axes 对象的xscaleyscale属性来实现对坐标轴的格式设置。

在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。示例:右侧的子图显示对数刻度,左侧子图则显示标量刻度:

from matplotlib import pyplot as plt
import numpy as np
x=np.arange(1,5)
fig,axes=plt.subplots(1,2,figsize=(10,4))
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)
axes[1].set_title("Logarithmic scale (y)")
#设置y轴
axes[1].set_yscale("log")       #############
axes[0].set_xlabel("x axis")
axes[0].set_ylabel("y axis")
#设置x、y轴标签
axes[1].set_xlabel("x axis")
axes[1].set_ylabel("y axis")
fig.tight_layout()
plt.show()

(2)使用spines通过指定轴的颜色和宽度,从而对进行显示格式设置。spines

轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。

以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:

from matplotlib import pyplot as plt
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#为左侧轴,底部轴添加颜色
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,6],'y')
plt.show()

八、Matplotlib设置坐标轴范围

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

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

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

1.第一种 Matplotlib 自动设置

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

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

from matplotlib import pyplot as plt
import numpy as np
fig=plt.figure()
a1=fig.add_axes([0.1,0.1,0.8,0.8])
x=np.arange(1,10)
a1.plot(x,np.exp(x),'r')
a1.set_title('exp')
#设置X轴和Y轴数值范围
a1.set_xlim(0,10)
a1.set_ylim(0,10000)
plt.show()

九、Matplotlib设置刻度和刻度标签

刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。

在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。

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

也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。

from matplotlib import pyplot as plt
import numpy as np
import mathx=np.arange(0,math.pi*2,0.05)
y=np.sin(x)
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
ax.plot(x,y)
ax.set_title('sine')
#设置x轴刻度
ax.set_xlabel('angle')
ax.set_xticks([0,2,4,6])
#设置x轴标签
ax.set_xticklabels(['zero','two','four','six'])
#设置y轴刻度
ax.set_yticks([-1,0,1])
plt.show()

十、Matplotlib的绘制图形

(1)Matplotlib双轴图

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

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

from matplotlib import pyplot as plt
import numpy as npx=np.arange(1,11)
#创建图形对象
fig=plt.figure()
#添加子图区域
a1=fig.add_axes([0.1,0.1,0.8,0.8])
#绘制指数函数
a1.plot(x,np.exp(x))
a1.set_ylabel('exp')
#添加双轴
a2=a1.twinx()
#绘制对数函数
a2.plot(x,np.log(x),'ro-')
a2.set_ylabel('log')
#绘制图例
fig.legend(labels=('exp','log'),loc='upper left')
plt.show()

(2)Matplotlib柱状图

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

Matplotlib 提供了bar()函数来绘制柱状图

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

该函数的参数说明如下:

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

下面是一个关于 Matplotlib 柱状图的简单示例:

from matplotlib import pyplot as plt
#创建图形对象
fig=plt.figure()
#添加子图区域,参数值表示[left, bottom, width, height ]
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#准备数据
langs=['C','C++','Java','Python','PHP']
students=[23,17,35,29,12]
#绘制柱状图
ax.bar(langs,students,color='y')
plt.show()

通过调整柱状图的宽度,可以实现在同一 x 轴位置绘制多个柱状图。您可以将它们设置成不同的颜色,从而使它们更容易区分。

下面示例描述了某工程学院过去四年中,三个专业录取的统招学生数量:

from matplotlib import pyplot as plt
import numpy as np
#准备数据
data=[[30,25,50,20],[40,25,51,17],[35,22,45,19]
]
X=np.arange(4)
#创建画布
fig=plt.figure()
#添加子图区域
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#绘制柱状图
ax.bar(X+0.00,data[0],color='b',width=0.25)
ax.bar(X+0.25,data[1],color='g',width=0.25)
ax.bar(X+0.50,data[2],color='r',width=0.25)
plt.show()

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

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

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

(第一次调用plt.bar()绘制了黄色柱状图, 第二次调用plot.bar()时绘制了灰色柱状图,最后一次调用plt.bar()则绘制最底部的柱状图。两个柱状图相接触的位置就是顶部与底部的位置,这样就构成了柱状堆叠图。)

import numpy as np
from matplotlib import pyplot as pltcountries=['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])
#此处的_下划线表示将循环取到的值放弃,只得到【0,1,2,3,4】
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('2019 Olympics Top Scorers')
plt.show()

(3)Matplotlib直方图

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

直方图:用于概率分布,它显示了一组数值序列在给定的数值范围内出现的频率;

柱状图:用于展示各个类别的频数。

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

  • 将整个值范围划分为一系列区间;
  • 区间值(bin)的取值,不可遗漏数据(通常将 bin 指定为连续且不重叠的数值区间,而 bin 值指区间开始和结束的数值);
  • 计算每个区间中有多少个值;

hist(x,bins,range,density,histtype)

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。直方图显示了相应范围的学生人数:

import numpy as np
from matplotlib import pyplot as plta=np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
#创建图形对象
fig=plt.figure()
#创建轴域对象
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#绘制直方图
ax.hist(a,bins=[0,25,50,75,100])
#设置坐标轴
ax.set_title('histogram of result')
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('number of students')
plt.show()

具体使用时要查阅源码使用,一些参数需要调整

(4)Matplotlib饼状图

饼状图可显示一个数据系列,具体来说饼状图显示一个数据系列中各项目的占项目总和的百分比。
pie(x,labels,color,autopct)

x 数组序列,数组元素对应扇形区域的数量大小
labels 列表字符串序列,为每个扇形区域备注一个标签名字
color 为每个扇形区域设置颜色,默认按照颜色周期自动设置
autopct 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形
区的标签,并将其放置在扇形区内

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

from matplotlib import pyplot as plt
import numpy as np
#准备数据
langs=['C','C++','Java','Python','PHP']
students=[23,17,35,29,12]
#添加图形对象
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#绘制饼状图
ax.pie(students,labels=langs,autopct='%1.2f%%')     #最后两个百分号是为了显示百分号
plt.show()

(5)Matplotlib折线图

  • 绘制单条折线图

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

from matplotlib import pyplot as pltx=['MON','TUES','WED','THUR','FRI','SAT','SUN']
y=[20,40,35,55,4,80,50]
# "g" 表示绿色,marksize用来设置'D'菱形的大小
plt.plot(x,y,'g',marker='D',markersize=5,label="周活")
plt.xlabel('登陆时间')
plt.ylabel('用户活跃度')
plt.title('C语言中文网活跃度')
plt.legend(loc='lower right')
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1,y1 in zip(x,y):'''zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。>>>a = [1,2,3]>>> b = [4,5,6]>>> c = [4,5,6,7,8]>>> zipped = zip(a,b)     # 打包为元组的列表[(1, 4), (2, 5), (3, 6)]'''plt.text(x1,y1,str(y1),ha='center',va='bottom',fontsize=10)
#保存图片(先保存,再展示)
plt.savefig(r"f:\Desktop\1.jpg")
plt.show()
  • 绘制多条折线图

绘制了两天内同一时刻,天气温度随时间变化的折线图:

import matplotlib.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]
#绘制折线图,添加数据点,设置点的大小
# * 表示绘制五角星;此处也可以不设置线条颜色,matplotlib会自动为线条添加不同的颜色
plt.plot(x, y1, 'r',marker='*', markersize=10)
plt.plot(x, y2, 'b', marker='*',markersize=10)
plt.title('温度对比折线图')  # 折线图标题
plt.xlabel('时间(h)')  # x轴标题
plt.ylabel('温度(℃)')  # y轴标题
#给图像添加注释,并设置样式
for a, b in zip(x, y1):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y2):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
#绘制图例
plt.legend(['第一天', '第二天'])
#显示图像
plt.show()

(6)Matplotlib散点图

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

import matplotlib.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='r',label="girls")
ax.scatter(grades_range, boys_grades, color='b',label="boys")
ax.set_xlabel('Grades Range')
ax.set_ylabel('Grades Scored')
ax.set_title('scatter plot')
#添加图例
plt.legend()
plt.show()

(7)Matplotlib等高线图

等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。
Matplotlib API 提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。

import numpy as np
import matplotlib.pyplot as plt
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X, Y = np.meshgrid(xlist, ylist)
#定义Z与X,Y之间的关系
Z = np.sqrt(X**2 + Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线颜色
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp) # 给图像添加颜色柱
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x (cm)')
ax.set_ylabel('y (cm)')
#画等高线
plt.contour(X,Y,Z)
plt.show()

(8)Matplotlib振动图

振动图也叫磁场图,或量场图,其图像的表现形式是一组矢量箭头,其数学含义是在点 (x,y) 处具有分向量 (u,v)。

quiver(x,y,u,v)

参数 说明
x 一维、二维数组或者序列,表示箭头位置的x坐标
y 一维、二维数组或者序列,表示箭头位置的y坐标
u 一维、二维数组或者序列,表示箭头向量的x分量
v 一维、二维数组或者序列,表示箭头向量的y分量
c 一维、二维数组或者序列,表示箭头颜色

以下示例,绘制了一个简单的振动图:

import matplotlib.pyplot as plt
import numpy as np
x,y = np.meshgrid(np.arange(-2, 2, 0.2), np.arange(-2, 2, 0.25))
z = x*np.exp(-x**2 - y**2)
#计算数组中元素的梯度
v, u = np.gradient(z, 0.2, 0.2)
fig, ax = plt.subplots()
q = ax.quiver(x,y,u,v)
plt.show()

(9)Matplotlib箱型图

箱型图(也称为盒须图)于 1977 年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
在箱型图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)。箱型图结构如下所示:

  boxplot() 

  • 首先准备创建箱型图所需数据:您可以使用numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量;
  • 然后用 data_to_plot 变量指定创建箱型图所需的数据序列;
  • 最后用 boxplot() 函数绘制箱型图。
import matplotlib.pyplot as plt
import numpy as np#利用随机数种子使每次生成的随机数相同
np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
data_to_plot=[collectn_1,collectn_2,collectn_3,collectn_4]
fig = plt.figure()
#创建绘图区域
ax = fig.add_axes([0,0,1,1])
#创建箱型图
bp = ax.boxplot(data_to_plot)
plt.show()

(10)Matplotlib提琴图

小提琴图(Violin Plot)是用来展示数据分布状态以及概率密度的图表。这种图表结合了箱形图和密度图的特征。小提琴图跟箱形图类似,不同之处在于小提琴图还显示数据在不同数值下的概率密度。小提琴图使用核密度估计(KDE)来计算样本的分布情况,图中要素包括了中位数、四分位间距以及置信区间。在数据量非常大且不方便一一展示的时候,小提琴图特别适用。

小提琴图使用核密度估计(KDE)来计算样本的分布情况,图中要素包括了中位数、四分位间距以及置信区间。在数据量非常大且不方便一一展示的时候,小提琴图特别适用。

import matplotlib.pyplot as plt
import numpy as npnp.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
#创建绘制小提琴图的数据序列
data_to_plot = [collectn_1, collectn_2, collectn_3, collectn_4]
#创建一个画布
fig = plt.figure()
#创建一个绘图区域
ax = fig.add_axes([0,0,1,1])
# 创建一个小提琴图
bp = ax.violinplot(data_to_plot)
plt.show()

python可视化Matplotlib库相关推荐

  1. python 颜色_如何使用python中matplotlib库分析图像颜色

    用代码分析图像可能很困难.你如何使代码"理解"图像的上下文? 通常,使用AI分析图像的第一步 是找到主要颜色.在如何使用python中matplotlib库分析图像颜色中,我们将使 ...

  2. Python可视化matplotlib自定义:运行时参数修改、自定义样式、默认样式+plt.style.use()

    Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认样式+plt.style.use() 目录 Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认 ...

  3. Python可视化matplotlib绘制三维可视化图形(Three-Dimensional)

    Python可视化matplotlib绘制三维可视化图形(Three-Dimensional) Matplotlib最初设计时只考虑二维可视化绘图.大约在1.0版本发布的时候,在Matplotlib的 ...

  4. Python可视化matplotlib多子图可视化(Multiple Subplots):plt.axes()、plt.subplot()、plt.subplots()、

    Python可视化matplotlib多子图可视化(Multiple Subplots) 目录 Python可视化matplotlib多子图可视化(Multiple Subplots) 手动绘制子图

  5. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

  6. Python的matplotlib库画图不能显示中文问题解决

    Python的matplotlib库画图不能显示中文问题解决 参考文章: (1)Python的matplotlib库画图不能显示中文问题解决 (2)https://www.cnblogs.com/CQ ...

  7. Ubuntu16.04 下python的matplotlib库加入中文字体(微软雅黑)

    Ubuntu16.04 下python的matplotlib库加入中文字体 一.首先安装微软雅黑字体 1.下载或者拷贝微软雅黑字体 2.将待安装的字体复制到Ubuntu下面的字体位置`/usr/sha ...

  8. Python学习-Matplotlib库绘制简单点阵图、线型图操作

    Python学习-Matplotlib库绘制简单散点图图和线型图.标签设置以及刻度线设置操作 目录 1.Matplotlib绘图细节的简单理解 2.绘制点图.线型图 3.给图表设置复杂标注 4.移动刻 ...

  9. python的matplotlib库绘制条形图、散点图、饼图、折线图

    python的matplotlib库绘制条形图.散点图.饼图.折线图 当我们学会了爬虫,抓取到了一些数据,接下来就是做数据分析了.本文章介绍绘制图形的基本代码. 打开cmd用pip 安装,若输入pip ...

最新文章

  1. linux udevd服务 设备管理工具 简介
  2. Go []byte to a C *char
  3. 【C/C++13】天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)
  4. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序
  5. java调用 火眼臻睛,连接创新,发现未来,臻识科技受邀CCF-GAIR,论道浪潮之巅...
  6. thinkphp3.2+cropper上传多张图片剪切图片
  7. 3DMAX安装失败怎样卸载重新安装3DMAX,解决3DMAX安装失败的方法总结
  8. iPlayer惨遭破解诅咒AKAIO作者扬言要让它支持商业游戏
  9. python管道怎么使用_如何在多个流程中正确使用管道(2)
  10. iOS切换window根控制器
  11. Thinkphp6 think-queue redis 执行异步任务
  12. BottomNavigationView与Navigation使用
  13. 【洛谷习题】皇后游戏
  14. javaweb的校园快递管理系统
  15. 【 C++ 】AVL树
  16. Word 注重页面细节才专业(添加页眉页脚,调整页边距,消灭孤行) | 职场人就应该这样用 Word
  17. 罗振宇2023“时间的朋友”跨年演讲原版PPT(附下载)
  18. 易语言实现视频播放功能
  19. dfgdfgdfgdfg
  20. 项目很忙不好意思离职,怎么办?

热门文章

  1. 推荐一款“黑科技”给大家
  2. hash 和 history 两种模式
  3. 【向生活低头】如何给无字幕视频添加字幕
  4. PBR来龙去脉九:IBL学习蒙特卡洛的基本概念
  5. r5处理器_火影T5A Pro测评 R5-3500X高性价比证明之作
  6. 利用BLKTRACE分析IO性能
  7. 0430---maven 项目打包为可运行jar包的步骤及应注意事项
  8. 基于php美食网站的设计英文,50个以美食、餐饮为主题的欧美网站设计
  9. LiveLink for MATLAB:COMSOL与MATLAB交互
  10. 开学季征文|卷生卷死之新学期大学生自救指南!!!