matplotlib 三
- 一. 绘制画布Figure容器
- 1.函数与参数
- 2. 相关方法
- 关于figsize和pdi对图大小的显示
- 参考文档
- 二. Axes容器
- 相关方法
- 三. Axis容器
- 相关方法
- 参考文档
- 四. Tick容器
- 参考文档
一. 绘制画布Figure容器
以整个边框、图像及内部所有元素为对象
1.函数与参数
说明:
所有绘图元素的顶层容器
使用:
fig = plt.figure(参数)
.figure(num=None, figsize=(6.4, 4.8), pdi=100, facecolor='w', clear=False, linewidth=None, edgecolor='w', frameon=True, subplotpars=None)
num --- 整型数字。类似于画布的标识,如果不指定,每使用一次就创建新的画布,且num自动增加(以表明产生了不同的画布)
figsize --- 数字元祖。默认(6.4, 4.8),参数指(width, height),指定画布的大小,单位:英寸。(按照默认分辨率不变缩放图片)
pdi --- 数字型。表示画布的分辨率(Dots Per Inch) ,即每英寸能显示的像素点。
facecolor --- 图框架的背景色,默认为白色。
clear --- 默认False。可选True,如果figure已存在,则会清除掉已存在的画布。
linewidth --- 图框架的线宽,默认无宽度。
edgecolor --- 图框架的颜色,默认白色。
frameon --- 默认为True。为False,禁止绘制图框架
subplotpars --- 子图参数。默认为None
2. 相关方法
使用:
fig.方法(参数)
(1). 在图中添加轴.add_axes(rect, sharex, sharey, polar=Flase)
rect --- 设置轴的位置和尺寸。浮点数列表,格式为:[左,下,宽度,高度]
sharex, sharey --- 设置该轴与共享轴具有相同的lim,ticks和scale等
polar --- 默认False。True,创建极坐标子图。
(2). 在图中添加轴.add_subplot(*args, sharex, sharey, polar=Flase)
*args --- 三位整数,默认为111。代表[行][列][索引值]。等同于add_subplot(行,列,索引值),但三者都小于10时,才可以相等。无位置参数时,等同于(1, 1, 1)
(3). 在图中删除轴.delaxes(ax)
ax --- 要删除的轴
(4). 显示标签.legend(handles, labels, loc)
如果创建图像时设置了label属性,可直接使用:.legend()
其他属性可参考上一篇
(5). 添加主题标题.suptitle(t, x, y, ha, va, fontsize, fontweight)
t --- 标题内容
x, y --- 标题位置
ha --- 相对于(x, y)的水平对齐方式。{'center','left',right'},默认值:'center'
va --- 相对于(x, y)的垂直对齐方式。{'top','center','bottom','baseline'},默认值:'top'
fontsize --- 字体大小
fontweight --- 字体粗细
(6). 获取属性
获得轴:.get_axes()
获得画布中包含的元素:.get_children()
获得分辨率:get_dpi()
获得画框颜色:get_edgecolor()
获得背景色:get_facecolor()
获得画布的高与宽:get_figheight()
get_figwidth()
获得背景设置是否禁止:get_frameon()
获得画布的尺寸,即高和宽:get_size_inches()
关于figsize和pdi对图大小的显示
plt.figure(figsize=(x, y), pdi=pdi)
前面提到过:
figsize:图的大小,x和y分别指图片的宽和高,单位为英寸。它同时也间接表明了轴以及其他元素的大小,那么更大的图将允许显示更长的文本,更多的轴或更多的标记标签等元素。
pdi:每英寸的像素点数,即分辨率
,单位pdi
。决定图包含多少个像素。
所以:
一张图的像素为: (xp, yp) = (x * pdi, y * pdi)
一般表示为:xp * yp
单位:像素
- pixels
或px
以像素为标准存储的图像一般称为:数字图像
举例:
想打印一张图大小为(6.4 inches, 7.2 inches),PDI分辨率为100pdi的图片,则这张图的像素为:(640 pixels, 720 pixels)
6.4 inches * 100pdi = 640 pixels
7.3 inches * 100pdi = 720 pixels
延伸例子:
上面的例子中,像素大小为(640, 720),可选择的图大小和分辨率的组合:
figsize=(8, 9), pdi=80
figsize=(16, 18), pdi=40
figsize=(4, 4.5), pdi=160
... ...
figure与dpi对图片显示影响的案例:
(1). 原始数据(图片大小为3*3,分辨率为55pdi)
fig = plt.figure(figsize=(3, 3), dpi=55)
ax1 = fig.add_subplot(111)
ax1.bar(list("ABCDE"), np.arange(1, 6))
结果1:图片大小为 3*3
(2). 图片长宽增加一倍,分辨率不变(图片大小为 6*6,分辨率为55)
fig = plt.figure(figsize=(6, 6), dpi=55)
ax1 = fig.add_subplot(111)
ax1.bar(list("ABCDE"), np.arange(1, 6))
结果2:图片大小为 6*6
(3). 图片大小不变,分辨率增加一倍(图片大小为3*3,分辨率为110)
fig = plt.figure(figsize=(3, 3), dpi=110)
ax1 = fig.add_subplot(111)
ax1.bar(list("ABCDE"), np.arange(1, 6))
结果3:图片大小大于 6*6
(4). 图片大小增加一倍,分辨率增加一倍(图片大小6*6,分辨率110)
fig = plt.figure(figsize=(6, 6), dpi=110)
ax1 = fig.add_subplot(111)
ax1.bar(list("ABCDE"), np.arange(1, 6))
结果4:图片结果大于 9*9
可以看出图片的显示大小与figsize指定不符合。
那么图片的真实大小,可以用wps等软件打开对比,可以得出结论:分辨率的变化不会改变图片的大小,但会改变图片的像素密度,即单位面积内的像素点数。
参考文档
百度搜索图像与图片尺寸、分辨率之间的关系像素、图像、Pdi三者的区别对屏幕的理解—分辨率,dpi,ppi,屏幕尺寸,像素 等
二. Axes容器
以图为对象,不包括边框,包含内部所有元素
使用:
# 创建一个Axes容器
axes = fig.add_subplot(参数)
相关方法
注意:相关方法完整参数可参考前面文章与plt相似的函数参数
(1). 设置标题.set_title(string)
(2). 设置x、y轴的最大值与最小值.set_xlim(min, max)
.set_ylim(min, max)
(3). 设置x、y轴的刻度.set_xticks(sequence)
.set_yticks(sequence)
sequence --- 序列
(4). 设置x、y轴的标签.set_xlabel(string, fontdict=None)
.set_ylabel(string, fontdict=None)
(5). 添加注释.set_text(x, y, string, fontdict=None)
x, y --- 坐标点
string --- 要注释的内容
fontdict --- 字体字典属性,可参考上一篇
(6). 设置图内部背景色.set_facecolor(color)
三. Axis容器
以x、y为对象,包含内部所有元素,如刻度(刻度的文本,刻度的线)等
使用:
# 创建一个Axes容器
axes = fig.add_subplot(参数)
# 创建Axis容器
axes.xaxis... ...
相关方法
(1). 设置x、y轴上label的位置axes.xaxis.set_label_coords(x, y)
axes.yaxis.set_label_coords(x, y)
x, y --- 改变标签的坐标位置
(2). 设置x、y轴上刻度格式axes.xaxis.set_major_formatter(formatter)
formatter --- 设置的刻度格式。需要调用Tick容器
举例:
import matplotlib.ticker as ticker
# 保留2位小数
formatter = ticker.FormatStrFormatter('%.2f')
ax1.yaxis.set_major_formatter(formatter)
(3). 设置轴属性(轴的文本与线)
设置刻度上文本属性axes.xaxis.get_ticklabels()
axes.yaxis.get_ticklabels()
设置刻度上线属性axes.xaxis.get_tickline()
axes.yaxis.get_tickline()
举例:
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4])
ax1.set_facecolor('lightslategray')
# 设置刻度上文本的属性
for label in ax1.xaxis.get_ticklabels():
# label是一个Label对象
label.set_color('red')
label.set_rotation(45)
label.set_fontsize(16)
# 设置刻度上线条的属性
for line in ax1.yaxis.get_ticklines():
# line是一个Line2D对象
line.set_color('green')
line.set_markersize(25)
line.set_markeredgewidth(3)
plt.show()
参考文档
官方文档
四. Tick容器
Tick是用来做刻度的,包括刻度和网格对象,可用属性如下:
举例:
import matplotlib.ticker as ticker
# Fixing random state for reproducibility
np.random.seed(19680801)
fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20))
formatter = ticker.FormatStrFormatter('$%.2f')
ax.yaxis.set_major_formatter(formatter)
for tick in ax.yaxis.get_major_ticks():
tick.label1On = False
tick.label2On = True
tick.label2.set_color('green')
plt.show()
参考文档
官方文档