Matplotlib绘制子图
Matplotlib是第三方库,可以快速生成高质量的图表,实现数据的可视化。它可以绘制直方图,折线图,柱状图,散点图,三维图等。
(一)环境的安装
你可以使用anaconda navigator 进行搜索安装,也可以通过pip安装,方法非常简单。
(二)Figure对象的创建(figure)
你可以将figure理解为matplotlib中的画布,所有的画图操作都是在figure上进行的。所以在你画图前,你需要先创建figure(画布)。
使用figure(num, figsize,dpi,facecolor, edgecolor, frameon)
参数 | 解释 |
---|---|
num | 图形编号或名称,取值为数字/字符串 |
figsize | 图形编号或名称,取值为数字/字符串 |
dpi | 绘图对象的分辨率,默认值为80 |
facecolor | 背景颜色 |
edgecolor | 边框颜色 |
frameon | 表示是否显示边框,默认为绘制 |
下面我们将绘制一个背景颜色为黄色的空白画布
import matplotlib.pyplot as plt
#pyplot是matplotlib的一个子库,通过它可以快速绘制二维图片,所以在绘制二维图像前需先import matplotlib.pyplot as plt
plt.figure(figsize=(5,5),facecolor='y')#这里'y'是yellow的缩写
plt.plot()#在里面啥都设置,所以将绘制空白图形
plt.show()#使用该函数进行显示,
小伙伴们也可以试着将plt.figure()里的参数清空,看看绘制出的是一个什么样的图像
(三)绘制子图(plt.subplot)
就是在figure(画布)上绘制多个子图
这里需要用到subplot()函数来划分子图
plt.subplot(行数,列数,第几个子图像):切割成行数列数个数量的子图像,多个子图像便分布在行数列数的范围之内。
下面是将将画布划分为2×2的子图区域,并绘制3个子图
plt.subplot(2,2,1):划分为2×2的子图区域,目前第1个子图像指向在第1行第1列的位置上。
plt.subplot(2,2,2):划分为2×2的子图区域,目前第2个子图像指向在第1行第2列的位置上。
plt.subplot(2,2,3):划分为2×2的子图区域,目前第3个子图像指向在第2行第1列的位置上。
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='g')#这里换成原谅色
plt.subplot(2,2,1)
plt.subplot(2,2,2)
plt.subplot(2,2,3)
plt.show()#使用该函数进行显示,
PS:如果plt.subplot(2,2,1)里的三个参数不大于10,可以直接写为plt.subplot(221),就是将里面的“,”省略
(四)添加标题(suptitle,title,tight_layout)
标题分为全局标题,和子标题。全局标题是整个图片的标题,子标题是每一个子图的标题。
全局标题suptitle()
参数 | 解释 |
---|---|
x | 标题位置的x坐标 默认为0.5 |
y | 标题位置的y坐标 默认为0.98 |
color | 标题颜色 默认为黑色 |
backgroundcolor | 标题背景颜色 默认为12 |
fontsize | 字体大小 , 可选xx-small 、x-small 、small 、medium 、large 、x-large 、xx-large |
fontweight | 字体粗细 ,默认为normal,可选light 、normal、 medium 、semibold 、bold 、heavy、 black |
horizontalalignment | 标题水平对齐方式, 默认为center,可选center、left、right |
verticalalignment | 标题的垂直对齐方式, 默认为center,可选top、center、bottom、baseline |
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='gray')#这里换成原谅色
plt.suptitle("heading",fontsize=17,backgroundcolor='green')#总标题参数
plt.subplot(2,2,1)
plt.subplot(2,2,2)
plt.subplot(2,2,3)
plt.show()#使用该函数进行显示
参数子标题title()用法与总标题相似
参数 | 解释 |
---|---|
loc | 标题位置 left,right |
rotation | 标题文字旋转角度 |
color | 标题颜色 黑色 |
fontsize | 标题的字体大小 |
fontweight | 字体粗细 normal |
fontstyle | 设置字体类型 |
horizontalalignment | 标题水平对齐方式 center |
verticalalignment | 标题的垂直对齐方式 top |
fontdict | 设置参数字典 |
相比于总标题,子标题还可以将参数设置为字典,然后使用这个字典作为标题的参数,做到快速设置相同参数
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='gray')#这里换成原谅色
plt.suptitle("heading",fontsize=17,backgroundcolor='green')#总标题参数
fontdict={"fontsize":13,"color":"yellow","fontstyle":"italic","rotation":"45"}#这里设置参数字典
plt.subplot(2,2,1)
plt.title('title1',loc='right')
plt.subplot(2,2,2)
plt.title('title2',loc='left',color='red',backgroundcolor='blue')
plt.subplot(2,2,3)
plt.title('title3',fontdict=fontdict)
plt.show()#使用该函数进行显示
小伙伴们应该可以看见,全局标题与子标题相互重叠,且第三幅图的子标题与第一幅子标题的x轴重叠了(即使不旋转也会重叠,因为标题的下半部分就已经与第一幅的x轴相互重叠了)
这时候我们就需要tight_layout()函数,它可以检查坐标轴标签、刻度标签、和子图标题,自动调整子图,使之填充整个绘图区域,并消除子图之间的重叠。
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='gray')#这里换成原谅色
plt.suptitle("heading",fontsize=17,backgroundcolor='green')#总标题参数
fontdict={"fontsize":13,"color":"yellow","fontstyle":"italic","rotation":"45"}#这里设置参数字典
plt.subplot(2,2,1)
plt.title('title1',loc='right')
plt.subplot(2,2,2)
plt.title('title2',loc='left',color='red',backgroundcolor='blue')
plt.subplot(2,2,3)
plt.title('title3',fontdict=fontdict)
plt.tight_layout()
plt.show()#使用该函数进行显示
小伙伴们可以看见,子图之间的距离都已经分开了,但是全局标题还是与子图标题相重叠。因为tight_layout()里,我们没有设置任何参数,它就会默认占满整个画布。这时我们只需调整tight_layout()函数里的参数,就可以解决上述问题tight_layout( rect=[left, bottom, right, top])这里面所有的参数都是与画布的比值,最大为1,最小为0
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='gray')#这里换成原谅色
plt.suptitle("heading",fontsize=17,backgroundcolor='green')#总标题参数
fontdict={"fontsize":13,"color":"yellow","fontstyle":"italic","rotation":"45"}#这里设置参数字典
plt.subplot(2,2,1)
plt.title('title1',loc='right')
plt.subplot(2,2,2)
plt.title('title2',loc='left',color='red',backgroundcolor='blue')
plt.subplot(2,2,3)
plt.title('title3',fontdict=fontdict)
plt.tight_layout(rect=[0,0,1,0.93])#这里设置宽度占满,高度从下到上占0.93
plt.show()#使用该函数进行显示
可以看到问题已经解决了
(五)添加中文字体
添加中文字体,只需在程序中添加plt.rcParams [" font.sans-serif" ] = “目标字体的英文名”
from matplotlib import font_manager
a= sorted([f.name for f in font_manager.fontManager.ttflist])
for i in a:
print(i)
小伙伴们可以看见,右下角的终端已经打印出所有支持的字体
可以用上面的程序打印出matplitlib所支持的所有字体,但打印出的都是英文名,所以小伙伴们并不知道其所对应的字体中文名称,所以小伙伴们在自己的C盘中搜索Fonts就可以看见电脑所有字体对应的中文名,右键–属性,就能看见其对应的中文名(但并不代表电脑中的字体就一定能在matplotlib中显示),当然matplotlib也有函数可以让我们自己添加电脑中自带的字体的方法,这里就不多说了,感兴趣的小伙伴可以自行百度
下面的程序将字体是作为华文新魏
import matplotlib.pyplot as plt
plt.figure(figsize=(7,5),facecolor='gray')#这里换成原谅色
plt.rcParams['font.sans-serif']=['STXINWEI']#设置中文字体为华文新魏,但好像并不是所有的中文字体都支持
plt.suptitle("全局标题",fontsize=17,backgroundcolor='green')#总标题参数
fontdict={"fontsize":13,"color":"yellow","fontstyle":"italic","rotation":"45"}#这里设置参数字典
plt.subplot(2,2,1)
plt.title('标题1',loc='right')
plt.subplot(2,2,2)
plt.title('标题2',loc='left',color='red',backgroundcolor='blue')
plt.subplot(2,2,3)
plt.title('标题3',fontdict=fontdict)
plt.tight_layout(rect=[0,0,1,0.93])#这里设置宽度占满,高度从下到上占0.93
plt.show()#使用该函数进行显示
小伙伴们可以看见所有的标题都变成了中文
(六)备注
下面推荐一个网站,上面都是matplotlib的画图实例,都有程序。配合着看,相信你也可以画出很多精美的图表,而且都给你分类好了,个人觉的matplotlib画图,这一个网站就够了。
传送门
这里面的每一幅图片,你点进去,都有代码实现。
(七)结语
如果有什么错误的地方,还请大家批评指正,最后,希望小伙伴们都能有所收获。