声明:
1)脚本层:脚本层是 Matplotlib 结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行,它的主要工作是负责生成图形与坐标系。
2)美工层:美工层是结构中的第二层,它提供了绘制图形的元素时的给各种功能,例如,绘制标题、轴标签、坐标刻度等。
3)后端层:后端层是 Matplotlib 最底层,它定义了三个基本类,首先是 FigureCanvas(图层画布类),它提供了绘图所需的画布,其次是 Renderer(绘图操作类),它提供了在画布上进行绘图的各种方法,最后是 Event(事件处理类),它提供了用来处理鼠标和键盘事件的方法。
1)Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的元素,比如标题、轴线等
2)Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区
3)Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签
4)Artist:您在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)
许多第三方工具包都对 Matplotlib 进行了功能扩展,其中有些安装包需要单独安装,也有一些允许与 Matplotlib 一起安装。常见的工具包如下:
1)Bashmap:这是一个地图绘制工具包,其中包含多个地图投影,海岸线和国界线
2)Mplot3d:它用于 3D 绘图
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()
在 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()
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个单位。
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
通过调用 add_axes() 方法能够将 axes 对象添加到画布中,该方法用来生成一个 axes 轴域对象,对象的位置由参数rect
决定。
下面介绍 axes 类的其他成员函数,这些函数在绘图过程中都承担着不同的作用:
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 |
1)颜色
’b' | 蓝色 |
'g' | 绿色 |
'r' | 红色 |
'c' | 青色 |
'm' | 品红色 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
2)标记符号
‘.’ | 点标记 |
‘o' | 圆圈标记 |
‘x' | X标记 |
'D' | 砖石标记 |
’H‘ | 六角标记 |
’s‘ | 正方形标记 |
’+‘ | 加号标记 |
3)线型
’-‘ | 实线 |
’--‘ | 虚线 |
’-.‘ | 点划线 |
’:’ | 虚线 |
‘H’ | 六角标记 |
下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。
from matplotlib import pyplot as plt
y=[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()
在使用 Matplotlib 绘图时,我们大多数情况下,需要将一张画布划分为若干个子区域,之后,我们就可以在这些区域上绘制不用的图形。
它可以均等地划分画布,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()
如果不想覆盖之前的图,需要使用 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()
import matplotlib.pyplot as plt
import numpy as np
import math
x=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()
subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象。( subplot() 只是创建一个包含子图区域的画布)
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 plt
x=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()
该函数能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
参数含义如下:
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会自动调整子图参数,使之填充整个图像区域。这是个实验特 · 性,可能在一些情况下不工作。它仅仅检查坐标轴标签、刻度标签以及标题的部· 分。
axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。
参数含义如下:
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()
xscale
或yscale
属性来实现对坐标轴的格式设置。在一个函数图像中,有时自变量 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()
轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(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 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。
(当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。)
下面示例分别对自动设置和自定义设置做了演示:
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()
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 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。
在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。
xticks() 和 yticks() 函数接受一个列表作为参数,列表中的元素表示对应数轴上要显示的刻度。
也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。
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.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()
在一些应用场景中,有时需要绘制两个 x 轴或两个 y 轴,这样可以更直观地显现图像,从而获取更有效的数据。Matplotlib 提供的 twinx() 和 twiny() 函数,除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线。
下面示例绘制了一个具有两个 y 轴的图形,一个显示指数函数 exp(x),另一个显示对数函数 log(x)。:
from matplotlib import pyplot as plt
import numpy as np
x=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()
柱状图是一种用矩形柱来表示数据分类的图表,柱状图可以垂直绘制,也可以水平绘制,它的高度与其所表示的数值成正比关系。柱状图显示了不同类别之间的比较关系,图表的水平轴 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 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])
#此处的_下划线表示将循环取到的值放弃,只得到【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()
直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。
直方图:用于概率分布,它显示了一组数值序列在给定的数值范围内出现的频率;
柱状图:用于展示各个类别的频数。
如果想要构建直方图,必须遵循以下步骤:
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 plt
a=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()
具体使用时要查阅源码使用,一些参数需要调整
饼状图可显示一个数据系列,具体来说饼状图显示一个数据系列中各项目的占项目总和的百分比。
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()
绘制单条折线图
下面示例是关于 C语言中文网用户活跃度的折线图:
from matplotlib import pyplot as plt
x=['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()
散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势。通俗地讲,它反映的是一个变量受另一个变量的影响程度。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()
等高线图(也称“水平图”)是一种在二维平面上显示 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()
振动图也叫磁场图,或量场图,其图像的表现形式是一组矢量箭头,其数学含义是在点 (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()
箱型图(也称为盒须图)于 1977 年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
在箱型图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)。箱型图结构如下所示:
boxplot()
numpy.random.normal()
函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量;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()
小提琴图(Violin Plot)是用来展示数据分布状态以及概率密度的图表。这种图表结合了箱形图和密度图的特征。小提琴图跟箱形图类似,不同之处在于小提琴图还显示数据在不同数值下的概率密度。小提琴图使用核密度估计(KDE)来计算样本的分布情况,图中要素包括了中位数、四分位间距以及置信区间。在数据量非常大且不方便一一展示的时候,小提琴图特别适用。
小提琴图使用核密度估计(KDE)来计算样本的分布情况,图中要素包括了中位数、四分位间距以及置信区间。在数据量非常大且不方便一一展示的时候,小提琴图特别适用。
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.violinplot(data_to_plot)
plt.show()