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

容器 火焰图_参考文档_02


(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

容器 火焰图_容器 火焰图_03


(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

容器 火焰图_数据分析_04


可以看出图片的显示大小与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是用来做刻度的,包括刻度和网格对象,可用属性如下:

容器 火焰图_数据分析_05


举例:

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()

参考文档

官方文档