matplotlib实际上是一套Python面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条Line2D、文字Text、刻度等在内存中都有一个对象与之对应。
matplotlib默认参数的配置处理:https://blog.csdn.net/lanchunhui/article/details/52327042
matplotlib.pyplot模块为matplotlib提供的一套和MATLAB类似的绘图API,以方便快速绘图。将众多绘图对象所构成的复杂结构隐藏在这套API内部。我们只需要调用pyplot模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。
matplotlib.pyplot模块对外提供函数式的接口,其内部实际保存了当前图表以及当前子图等信息。在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,比如说: plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
在matplotlib.pyplot模块中,
Figure-Axes/Subplot - Axis的关系:
Figure:
Figure就是画板,是画纸Axes/Subplot的载体。
具体画画是在画纸Axes/Subplot上操作的,即使只有一个子图,也可以生成subplot,然后对subplot对象进行各种轴、刻度、标注的设定。
subplot与Axes的区别:
subplot用法:ax1 = fig.add_subplot(235),23代表生成2行3列的图像,5代表从上到下,从左到右数,获取第5个子图的对象。
Axes用法:ax3=fig.add_axes([0.1, 0.1, 0.4, 0.9]), 前两个数字0.1 0.1 代表相对于fig的原始坐标的位置,0.4,0.9代表横纵坐标轴分别从原始位置出发,有多长的轴距。Axes可以理解为Axis的轴的集合,所以,也可以对应得到很多轴Axis的属性,如标注等。ax3即获得了一个轴域(由横纵坐标轴得到的区域, 也勉强叫做子图)
subplot与Axes的区别:
两者你中有我,我中有你,生成subplot的时候,必然生成axes,画axes也相当于是生成了一个subplot
add_supplot简单明了,而add_axes生成子图方式更加灵活,可以自由控制子图的位置(相对位置,很方便),可以实现重叠。
两种作图方式:
以调用plt函数库为代表的函数式编程思想,直接调用plot, xlim函数实现画图功能:
以调用sub_plot/add_axies为代表的面向对象编程思想,可以调用子图的.plot, set_xlim方法:
重要概念:
整体的设置:
获取当前图表:fig=plt.gcf() # Get Current Figure, 查看源码,返回一个figure() 画板对象。
获取当前子图:ax=plt.gca() # Get Current Axes,看源码, 返回一个axes画纸/子图对象。
获取对象的各种属性: plt.getp(plt.gca(), "lines"),前面是对象,后面时属性
======================================================
1 创建一个画板,并获得子图
函数编程方式1:
plt.figure(num=1, figsize=(8,4), dpi=300), 创建制定编号,大小,分辨率的画板,dpi缺省值80。注意这里只是显示时看到的dpi,实际save图像的时候,最终的图像的分辨率为对应的savefig指定的分辨率。
# savefig(dpi=300)的默认分辨率,可以在matplotlib的配置文件中设置。设置配置文件方式如下:
# matplotlib.rcParams["savefig.dpi"]100
面向对象方式二:
fig=plt.figure()
ax=fig.add_subplot(111)
注意,以下均以函数编程方式讲解,特殊地方可以调用plt.gca() 获得子图对象,按子图对象单独处理
2 通过调用plot函数在当前的绘图对象中进行绘图
plt.plot(years, price, 'b*')#,label="$cos(x^2)$")
plt.plot(years, price, 'r')
Note:
1. 第一句将x,y数组传递给plot
2.通过第三个参数"b--"指定曲线的颜色和线型,这个参数称为格式化参数,它能够通过一些易记的符号快速指定曲线的样式。其中b表示蓝色,"--"表示线型为虚线。
3. 用关键字参数指定各种属性:label : 给所绘制的曲线一个名字,此名字在图示/图例(legend)中显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。color : 指定曲线的颜色linewidth : 指定曲线的宽度
具体参见【附录 - matplotlib中的作图参数】
3 设置绘图对象的各个属性:
plt.xlabel("years(+2000)") #设置X轴的文字
plt.ylabel("housing average price(*2000 yuan)")
plt.ylim(0, 15) #设置Y轴的范围
plt.title('line_regression & gradient decrease') #设置图表的标题
plt.legend() #显示图示
通过配置文件方式设置xlabel和ylabel显示的默认大小
import matplotlib
matplotlib.rc('xtick', labelsize=18)
matplotlib.rc('ytick', labelsize=18)
4.最后调用plt.show()显示出我们创建的所有绘图对象。
Matplotlib 里的常用类的包含关系为 Figure -> Axes -> (Line2D, Text, etc.)一个Figure对象可以包含多个子图(Axes),在matplotlib中用Axes对象表示一个绘图区域,可以理解为子图。
plt.show()
5. 清空plt绘制的内容
plt.cla()
plt.close(0)# 关闭图 0
plt.close('all') 关闭所有图
6. 图形保存和输出设置
可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为“test.png”,并且通过dpi参数指定图像的分辨率为 120,因此输出图像的宽度为“8X120 = 960”个像素。
plt.savefig("test.png",dpi=120)
也可以通过show()出来的图形界面手动保存和设置
matplotlib中绘制完成图形之后通过show()展示出来,我们还可以通过图形界面中的工具栏对其进行设置和保存
matplotlib修改图片大小:图形界面下方工具栏可以设置图形上下左右的边距
如果想在跑程序外部查看图片,可以这样:
plt.savefig('/tmp/1.png')
subprocess.run('xdg-open /tmp/1.png', shell=True)
7. 绘制多图表
如果需要同时绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号,如果序号所指定的Figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2
x = np.linspace(0, 3, 100)
for i in xrange(5):
plt.figure(1) #选择图表1
plt.plot(x, np.exp(i*x/3))
plt.sca(ax1) #选择图表2的子图1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 选择图表2的子图2
plt.plot(x, np.cos(i*x))
plt.show()
8. 绘制多子图
matplotlib.pyplot.subplots(2,3,5)
subplot将整个绘图区域等分为numRows行* numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。
9. Matplotlib中坐标轴设定:刻度线、刻度标签、坐标网格以及坐标轴标题:
刻度包括主刻度和副刻度,分别通过get_major_ticks()和get_minor_ticks()方法获得。
每个刻度线都是一 个XTick或YTick对象,它包括实际的刻度线和刻度标签。
Axis 对象提供了 get_ticklabels()和get_ticklines()方法,可以直接获得刻度标签和刻度线。
plt.show()
axis = plt.gca().xaxis
axis.get_ticklocs()#获得axis对象的刻度位置列表 # array([ 1. , 1.5, 2. , 2.5, 3. ])
axis.get_ticklabels() # 获得刻度标签列表 # axis.get_ticklabels() # 获得刻度标签列表
[x.get_text() for x in axis.get_ticklabels()]# 获得刻度的文本字符串# [u'1.0', u'1.5', u'2.0', u'2.5', u'3.0‘] 获得X轴上表示主刻度线的列表,可看到X轴上共有10条刻度线
axis.get_ticklines() # 由于没有副刻度线,因此副刻度线列表的长度为0:
axis.get_ticklines(minor=True) # 获得副刻度线列表
plt.xticks(fontsize=16, color="red", rotation=45) # 使用pyplot模块中的xticks()能够完成X轴上刻度标签的配置:
10. 配置属性
matplotlib所绘制的图的每个组成部分都对应有一个对象,我们可以通过调用这些对象的属性设置方法set_*或者pyplot的属性设置函数setp设置其属性值。
12 配置文件
其它细节:
- 给一些特殊点做注释,文1
- matplotlib显示图像的同时,继续跑下面的代码的方式,文1
- 在图表中显示中文,文1
- 面向对象画图,即以subplot,axes的对象作图,文1
- Matplotlib中的作图参数:颜色color、线条line_styles、点型makers,文1
- MatPlotLib中设置坐标轴主刻度标签和次刻度标签显示,文1
- 图像的载入和显示imread(),imshow(),文1
案例:画散点图,热度图,线图,直方图,散点-直方图,加标签,在画板中导入已有图片,图谱/热度方格图,箱线图,双坐标图,多个子图用同一个lenlegend
案例:图像的大小设置、刻度和标注特殊设置、增加X轴与Y轴间的间隔,向右移动X轴标注一点点即可、移动刻度标注、调整图像边缘及图像间的空白间隔、子图像统一标题设置、图像中标记线和区域的绘制
绘制论文格式图片:
http://www.jb51.net/article/115168.htm
https://www.cnblogs.com/nju2014/p/5707980.html
参考文0:https://www.zhihu.com/question/51745620/answer/231113561
参考文1: http://blog.csdn.net/pipisorry/article/details/37742423