图形的最外面是文字部分,包括标题,x轴标签,y轴标签。其次是主刻度标签和副刻度标签(不太常用),然后是坐标轴,最里面是数据。
在人工绘画时我们都需要一张纸,在Matplotlib中,这张纸叫画布(图中蓝色框,英文为 Canvas)。
其次需要绘图框(图中绿色框,英文为 Figure),绘图框是允许绘图的最大空间,也是最高的图形容器。
在绘图框里我们才可以画画。这里的画就是 “图”。我们把这个“图”叫子图(图4中黄色框,英文为Axes或Subplot)。子图的范围就是黄色框中包含的所有图形元素。
Axes和Subplot语义相同,但是Axes用的较广泛些。
Matplotlib包括三个层次:后台层、艺术家层和脚本层。它们在逻辑上是堆叠的关系。
后台层是Matplotlib的底层结构,用来提供整个绘图的核心引擎。
例如:后端负责在不同操作系统,用户界面,显示器中配置绘图文件,并让图像都能正确显示。
处理用户对图形的交互,例如鼠标点击或者键盘输入等
后台层是整个Matplotlib的核心,用来提供画布,渲染图形,在屏幕上展示\
Matplotlib里面,我们不经常接触到后台层
有几个基础类(Base Classes)
FigureCanvas
类:提供画布Renderer
类:绘制并渲染图形Event
类:处理用户交互,例如鼠标点击等每个基础类下面还有子类(Subclasses),它们都是为了提供绘图所需的基本功能与环境。
艺术家层顾名思义,就像艺术家一样在画板上作画,它控制着图形的线条、形状、轴、文字等样式。
它是整个结构中的中间层,负责对象的生成与管理。它知道每条线段有多长,点的形状是什么。如果说后台层是绘图工具,艺术家层可看作是作画的画家。
Artist
类,包含每一个“艺术家”应该具备的共同属性,例如坐标轴的画法等
Artist
类下也有很多子类。例如有绘制坐标轴的,处理文字的等。Line2D
、Rectangle
、Circle
、Text
等。Figure
),还有XAxis
、YAxis
、Axes
、Subplot
等。这一层实际上是一个“翻译官”,将我们所写的代码告诉给“艺术家”,这样艺术家才知道我们需要画什么。
在Matplotlib中我们使用的这位翻译官名字叫做
pyplot
直接和“艺术家”进行交流,称之为面向对象画图。
正是由于在脚本层和艺术家层均可作图,因此Matplotlib的语法对于初学者来说比较混乱。
Matplotlib的绘图逻辑要比以上复杂得多,在Matplotlib里面,还有很多支持性组件,包括配置支持组件和实用程序模块组件等。
详细可以参考《Mastering Matplotlib》 一书。
直接调用Matplotlib的脚本层翻译官
pyplot
完成基本绘图任务。
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
#plt为pyplot的缩写,这个别名已在国际上约定俗成
Matplotlib在绘图时所接受的数据类型包括列表list和Numpy的多维数组(ndarray)。
散点图用来描绘两个数值型特征的关系,它的对象最好是两个连续型特征,如果有一个是离散型也可以。
plt.scatter()
Matplotlib
中,绘图最后都需使用plt.show()
函数,将图形输出。plt.scatter(x, y)
plt.show()
条形图用来看类别型数据的分布
直方图用来看连续型数据的分布。
plt.bar()
不会自动统计个数,故可能需要手动提取表格中的数据的取值集合以及每一个取值下的计数bar()
,包含两个必要参数:x
和y
(也就是高度)。width
参数来调整每个矩形的宽度plt.bar(x, height = y, width = 0.2)
plt.show()
plt.hist()
函数来绘制。width
参数代表一个矩形应该覆盖x轴上的范围多少。
width
和条形图的width
参数意义不同。plt.hist(x, width = 1)
plt.show()
饼图可以很好的看出各个部分占总数的百分比。饼图的对象是一个离散型或类别型数据。
plt.pie()
函数。!x
y
)autopct
。plt.pie(x, labels=y, autopct='%0.0f%%')#autopct='%0.0f%%'显示百分比
plt.show()
箱线图用来观察连续特征的分布状况,通过箱线图,除了能够判断数据的离散程度,还可以直观地识别数据中的离群值。
plt.boxplot()
plt.boxplot()
函数画图。labels
可用来更改x轴坐标。[list]positions
来调整这两个箱线图的位置。[list]showfliers
参数可以设置是否显示离群值。[boolean]vert
参数可用来调整箱线图方向。[boolean]plt.boxplot(x, labels=['x1'])
plt.show()
折线图能很好的看出数据的变化或趋势。
plt.plot()
combined = list(zip(x,y))
combined.sort()
排序uncombined = list(zip(*combined))
拆开列表linestyle
"ro-"
表示:红色,实心大圆点,实线核密度图需要的是连续型随机变量。核密度图又是核密度估计,核密度估计的“估计”代表估计一个随机变量的值。
plt.plot()
函数。函数名 | 必要参数 | 绘图效果 | 可选参数1 | 可选参数2 | 可选参数3 | 官方链接 |
---|---|---|---|---|---|---|
plt.scatter() | x, y | 散点图 | marker调整形状 | s调整大小 | c调整颜色 | matplotlib.pyplot.scatter |
plt.bar() | x, height | 条形图 | width调整宽度 | alpha调整透明度 | color调整颜色 | matplotlib.pyplot.bar |
plt.hist() | x | 直方图 | bins条形个数 | align条形对齐 | color调整颜色 | matplotlib.pyplot.hist |
plt.pie() | x | 饼图 | labels添加成分标注 | radius更改圆形半径 | color调整颜色 | matplotlib.pyplot.pie |
plt.boxplot() | x | 箱线图 | widths箱线宽度 | labels添加箱线标注 | vert更改画图方向 | matplotlib.pyplot.boxplot |
plt.plot() | x, y | 折线图 | linestyle选择线样式 | alpha调整透明度 | color调整颜色 | matplotlib.pyplot.plot |
plt.violinplot()
就是绘制小提琴图(箱线图的一个变种)%matplotlib notebook
"魔法"命令。此时不需使用 plt.show()
函数,Jupyter会自动生成交互式图像%matplotlib inline
"魔法"命令,此时不需使用 plt.show()
函数,Jupyter会自动生成非交互式图像plt.title()
来添加标题plt.xlabel()
来添加x轴标签plt.ylabel()
来添加y轴标签plt.text()
来添加自定义文字
plt.text(200, 0, 'f(x)=sin(x)')
plt.legend()
来添加图例
labels
来添加图例的标签color
loc
表示。
left
, center
, right
)upper left
, center
, upper right
, lower left
, lower center
, lower right
)alpha
fontsize
labelpad
参数调整r'$xxxx$'
格式[TeX语法]
xxxx
就是要显示的特殊文字\
开始,并且希腊字母是它们的英文拼写方式。例如r'$\alpha$'
r'$\alpha$ (alpha)'
\frac{}{}
表示\sqrt{}
表示修改最大(小)值,用xlim()
或者ylim()
函数
plt.xlim(0, 100)
让坐标轴以log的形式显示。这时就需要使用plt.xscale('log')
或者plt.yscale('log')
来调整。
添加主、副刻度网格用grid()
函数
major主刻度网格:plt.grid(which='major', linewidth=2, linestyle='--')
minor副刻度网格:plt.grid(which='minor', linestyle=':', linewidth=0.3, color='b')
plt.minorticks_on()
plt.grid(True)
默认参数添加网格
xticks()
yticks()
来修改主刻度显示范围。
第一个参数是要修改的位置,第二个参数是要填写的新标签。
rotation
参数可以调整主刻度标签的方向。
注意第一个参数接受的是ndarray
的结构【PS:实测list也可以】
使用np.array()
来创建显示范围,或使用np.arange()
来指定大小值及其间距来创建显示范围。
注意在使用np.arange()
创建显示范围时,设定的最大值要稍大于需要显示的最大值,否则最后一个值将无法显示。
例如:
x_label = ['A','B','C']
y_label = ['first','second','third']
plt.xticks(np.array([0,60,120]), x_label, rotation='vertical')
plt.yticks(np.arange(min(y), max(y)+0.1, 0.5), y_label)
plt.tick_params()
函数可以调节主刻度标签大小,主刻度长短,坐标轴标签颜色等。
使用axis
参数来指定要修改的坐标轴
color
为主刻度颜色
size
为主刻度长度
labelcolor
为主刻度标签颜色
labelsize
为主刻度标签大小
plt.tick_params(axis = "x", color = "green", size = 30)
plt.tick_params(axis = "y", labelcolor = "red", labelsize = 15)
绘制子图的函数是plt.subplot()
在plt.subplot()
里面要说明当前子图的位置坐标。
plt.subplot(1,2,1)
plt.subplot()
也支持省略逗号的方法。即plt.subplot(121)
执行完第一个plt.subplot()
后,就开始绘制当前子图。当调整完所有细节后,再写下一个plt.subplot()
开始绘制第二个子图。
import matplotlib.pyplot as plt
import numpy as np
# 绘制第一个子图
plt.subplot(1,2,1)
plt.plot(x, y)
plt.title('Subplot 1')
plt.xlabel('X lable')
plt.ylabel('Y lable')
plt.legend(['sin(x)'])
# 绘制第二个子图
plt.subplot(1,2,2)
plt.scatter(x, y, c='r', alpha=0.1, s=1)
plt.title('Subplot 2')
plt.xlabel('X axis')
plt.ylabel('Y axis')
用函数plt.tight_layout()
自动设置子图间距。
使用plt.suptitle()
函数(注意拼写)来添加绘图框标题
color
),透明度(alpha
)等参数,用法和其他文本类函数的参数一样。绘图框标题的位置
通过使用plt.subplots_adjust()
函数调整绘图框的位置,让出绘图框标题的位置
或plt.suptitle()
中的可选参数x
和y
调整绘图框标题
参数 | 作用 |
---|---|
left = 0.8 | 子图左侧的位置 |
right = 0.2 | 子图右侧的位置 |
top = 0.8 | 子图上方的位置 |
bottom = 0.2 | 子图下方的位置 |
wspace = 0.2 | 子图之间保留的宽度 |
hspace = 0.2 | 子图之间保留的高度 |
plt.figure(figsize=(15, 8))
调整图片大小函数名 | 作用 |
---|---|
plt.xlabel() | 添加及修改x轴标签 |
plt.ylabel() | 添加及修改y轴标签 |
plt.text() | 添加及修改自定义文字 |
plt.xlim() | 设置x轴范围 |
plt.ylim() | 设置x轴范围 |
plt.grid() | 添加网格 |
plt.xtick() | 修改x轴主刻度标签 |
plt.ytick() | 修改y轴主刻度标签 |
plt.tick_params() | 修改主刻度颜色,长度 |
plt.legend() | 添加及修改图例 |
plt.subplot() | 绘制多张子图 |
plt.suptitle() | 添加及修改绘图框标题 |
plt.subplots_adjust() | 修改子图与绘图框间距 |
plt.tight_layout() | 自动调整子图间距 |
plt.minorticks_on() | 开启副刻度显示 |
import matplotlib.pyplot as plt#1
import numpy as np#2
x = np.arange(0, 10, 0.5)#3
plt.plot(x, 10*x, 'r-.',
x, x**2, 'bs',
x, x**3, 'g^')#4
在执行第一行代码的时候,matplotlib.pyplot会选择系统默认(或者用户指定)的backend。然后,matplotlib.pyplot会执行一系列配置任务:创建一个figure manager的工厂函数(factory function);选择合适的绘图函数(draw function)等
在执行第四行代码的时候,
plot()
函数,清除已经存在的Axes对象,然后根据提供的数据进行绘图3.在执行第五行代码的时候,Matplotlib获取当前活跃的figure manager对象,对象调用canvas.draw()
函数,显示图形
位于脚本层的pyplot模块提供的方便快捷的绘图函数实质上是在创建一系列类的对象(Figure, Axes等),并由这些对象来去调用相应函数,具体执行绘图的操作。
pyplot模块位于面向对象的编程接口上方,为用户隐藏了Matplotlib的运行细节。
对象实例 | 说明 |
---|---|
FigureCanvas | Figure对象的容器 |
Figure | 多个Axes对象实例的容器 |
Axes | 包含图形基本元素(如文本,直线,曲线等)的矩形区域 |
Matplotlib在获取figure canvas对象之后,将Figure对象实例保存在FigureCanvas中,然后可以向Figure实例添加多个Axes对象实例,完成图形的"搭建"。
#面向对象的matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
import numpy as np
from matplotlib.font_manager import FontProperties
%matplotlib inline
x = np.arange(0, 10, 0.5)
fig = Figure()
FigureCanvas(fig)
axes = fig.add_subplot(111)
custom_font = FontProperties(fname = '/楷体_GB2312.ttf')#设置中文字体
axes.set_title('面向对象的编程风格', fontproperties =custom_font, fontsize = 15)
axes.plot(x, 10*x, 'r-.')
axes.plot(x, x**2, 'bs')
axes.plot(x, x**3, 'g^')
fig
show()/draw()
等函数,展示图形。因此,我们需要使用Ipython的display()
函数来显示绘制完成的图形。[Warning]:目前不知道如何调用display()显示图片pyplot模块:plt | Axes对象:axes |
---|---|
plt.plot() | axes.plot() |
plt.scatter() | axes.scatter() |
plt.pie() | axes.pie() |
plt.hist() | axes.hist() |
plt.grid() | axes.grid() |
plt.legend() | axes.legend() |
plt.title() | axes.set_title() |
plt.xlabel() plt.ylabel() | axes.set_xlabel() axes.set_ylabel() |
pyplot
模块的函数也就是对Axes
对象相应函数的再次封装。图形元素 | 元素所属的类 | (base class) |
---|---|---|
线条 | matplotlib.line.line2D | - |
轴,刻度 | matplotlib.axis.tick | matplotlib.artist.Artist |
轴标签,标题等 | matplotlib.text.Text | matplotlib.artist.Artist |
Axes对象 | matplotlib.axes._axes.Axes | matplotlib.artist.Artist |
Figure对象 | matplotlib.figure.Figure | - |
通常我们混合使用
在pyplot的代码中,我们可以通过调用指定的函数,返回当前图形的Figure对象或者AxesSubPlot对象。
函数 | 返回对象 |
---|---|
plt.gcf() | Figure对象 |
plt.gca() figure.gca() |
AxesSubPlot对象 |
通过plt.gcf()
获得当前图形的Figure对象
figure()
函数返回Figure对象调用Figure对象fig的gca()
函数,返回当前的AxesSubplot对象。
#一个例子
fig, axes_list = plt.subplots(2,1)
axes_list[0].plot(x1, y1, 'bo')
axes_list[1].plot(x2, y2, 'r--')
添加图形元素 | 使用的函数 |
---|---|
图形的标题 | set_title() |
X轴标签 | set_xlabel() |
Y轴标签 | set_ylabel() |
X轴刻度 | set_xticks() |
Y轴刻度 | set_yticks() |
X轴刻度特征名称 | set_xsticklabels() |
Y轴刻度特征名称 | set_ysticklabels() |
误差条图形用来反映数据的离散程度,可以显示数据各个特征的均值和误差。
一般和其他图形结合使用
误差条图形使用函数plt.errorbar(x, y, yerr=None, xerr=None, fmt='',...)
部分参数
x
,y
[数据位置]xerr=None
, yerr=None
[x, y轴误差线大小]
fmt
[误差线样式]
范围(range)
x m a x − x m i n x_{max}-x_{min} xmax−xmin
标准差(standard deviation, sd)
s d = ( x − μ ) 2 n sd = \sqrt{\dfrac{(x - \mu)^2}{n}} sd=n(x−μ)2
标准误差(standard error, se)
s e = s d n se = \dfrac{sd}{\sqrt{n}} se=nsd
置信区间(95%)(confidence interval)
[ x − t ∗ s d , x + t ∗ s d ] [x - t*sd, x + t*sd] [x−t∗sd,x+t∗sd]
计算样本平均值
x ˉ = ∑ x n \bar{x}=\frac{\sum x}{n} xˉ=n∑x
计算样本标准差(std)σ(参数ddof【Delta Degrees of Freedom,Delta自由度】此处默认值为1)
σ = ∑ ( x ˉ − x ) 2 n − d d o f σ = ∑ ( x ˉ − x ) 2 n − 1 \sigma = \sqrt {\frac{\sum (\bar x-x)^{2}}{n-ddof}}\\\sigma = \sqrt {\frac{\sum (\bar x-x)^{2}}{n-1}} σ=n−ddof∑(xˉ−x)2σ=n−1∑(xˉ−x)2
计算样本标准误差(标准误,sem)
s e m = z α / 2 × σ n sem = z_{\alpha / 2}\times \frac{\sigma}{\sqrt n} sem=zα/2×nσ
计算置信区间
x ˉ ± z α / 2 × σ n x ˉ ± s e m \bar{x}\pm z_{\alpha / 2}\times \frac{\sigma}{\sqrt n}\\ \bar{x}\pm sem xˉ±zα/2×nσxˉ±sem
热力图(heatmap)是一种以颜色高亮的程度来表征数据集变量数值大小的直观图形,可以让用户快读了解掌握数据集各个变量的取值信息。
使用函数plt.colorbar()
import matplotlib.pyplot as plt
import numpy as np
data = [[1,2,3,4],[2,3,4,5],[3,4,5,6]]#二维数据
fig, ax = plt.subplots()#添加一个子图
heatmap = ax.pcolormesh(data, cmap = plt.cm.Blues, alpha = 0.8)
fig.colorbar(heatmap)
#设置轴刻度
ax.set_xticks(np.arange(4) + 0.5, minor=False)#+0.5使刻度显示在图像中心
ax.set_yticks(np.arange(3) + 0.5, minor=False)
#设置轴刻度标签
ax.set_xticklabels([1,2,3,4], minor = False,rotation = 90)
ax.set_yticklabels(['A','B','C'], minor = False)
plt.show()
笔记部分内容图片来源于数据酷客,文章目的只是用于笔记记载