先,绘制一张最简单的图:
importmatplotlib.pyplotaspltfig=plt.figure(figsize=(5,5),dpi=300)#创建画布axe=plt.subplot(1,1,1)#创建子图axe.set_title('test')#设置子图标题fig.savefig('test.png',dpi=300)#保存图片plt.show()#展示图片于是我们可以得到最简单的一张图。

下面对代码做必要的介绍:
fig=plt.figure(figsize=(5,5),dpi=150)axe=plt.subplot(1,1,1)figsize:决定了整个画布的大小与横纵比例,值得一提的是,当绘制的是地理图的时候,figsize只会决定画布的大小,而横纵比例由设置的经度与纬度来决定。
dpi:在画布阶段的dpi会影响到出图的质量,dpi设置过高会导致图像的线条很粗,因此一般在plt.figure中,dpi设置100~200。而如果需要高质量的图片,则在savefig中修改dpi
fig.savefig('test.png',dpi=300)subplot:绘制子图,三个参数分别表示多少行,多少列和第几个子图。
接下去进行一张简单的地理图绘制,以展现画布的所有初始设置。
importmatplotlib.pyplotaspltimportnumpyasnpfrommatplotlib.font_managerimportFontPropertiesimportmatplotlibasmplSimsun=FontProperties(fname="./font/SimSun.ttf")mpl.rcParams['axes.unicode_minus']=Falseconfig={"font.family":'serif',"mathtext.fontset":'stix',"font.serif":['SimSun'],}mpl.rcParams.update(config)fig=plt.figure(figsize=(5,5),dpi=150)#创建画布axe=plt.subplot(1,1,1)#创建子图axe.set_title('$\mathrm{Title}$标题',fontsize=12,y=1.05)#设置子图标题axe.set_xlim(0,10)axe.set_ylim(0,10)axe.invert_yaxis()# 翻转纵坐标plt.xticks([0,3,6,9],["x=0",'x=3','x=6','x=9'],fontsize=10,color='red')axe.set_yticks(np.arange(0,11,1))#axe.get_xaxis().set_visible(False)labels=axe.get_xticklabels()+axe.get_yticklabels()[label.set_fontproperties(FontProperties(fname="./font/Times.ttf",size=8))forlabelinlabels]axe.set_ylabel('$\mathrm{Y}$轴',fontsize=10)fig.savefig('test.png',dpi=300)#保存图片plt.show()#展示图片
接下去对图片的绘制做解读:
字体采用了中文宋体,英文Times New Roman的方式,详细的实现方法可以看这篇文章:https://zhuanlan.zhihu.com/p/118601703
首先需要对matplotlib进行初始化的字体设置
frommatplotlib.font_managerimportFontPropertiesimportmatplotlibasmplSimsun=FontProperties(fname="./font/SimSun.ttf")mpl.rcParams['axes.unicode_minus']=False#正常显示负号config={"font.family":'serif',"mathtext.fontset":'stix',"font.serif":['SimSun'],}mpl.rcParams.update(config)FontProperties可以将自己的ttf文件制作为matplotlib的字体,fname中提供路径即可
config是参照上文中的设置,让字体以LaTeX的方式显示。值得一提的是,英文字体准确来说并不是Times New Roman,而是stix字体。而stix字体本身就是为了替代Times New Roman而制作的,如果仔细看可以看出差别,但是对于科研绘图来说完全可以用(除非有人逐个像素点去比对)。
对于存在中英文字体共存的地方,比如坐标轴刻度与图题,采用以下TeX的方式解决:
axe.set_title('$\mathrm{Title}$标题')需要注意一点,由于这里使用的是matplotlib的内置Tex方式,因此会与Latex有一些不同,但是依然可以参考Latex的使用说明。
对于中英文共存采用不同字体的实现还有很多方式,比如Latex公式等,可以看这篇文章:
matplotlib:实现中文“宋体”,英文“Times New Rom”_沉思的雅典娜的博客-CSDN博客_matplotlib 宋体
而对于纯英文或者中文的字体,直接命名单一字体即可:
labels = axe.get_xticklabels() + axe.get_yticklabels() [label.set_fontproperties(FontProperties(fname="./font/Times.ttf", size=8)) for label in labels]这是坐标轴刻度的字体设置方式。之前提到过matplotlib是面向对象的,因此修改字体的方式是先获取axe的x轴和y轴刻度,再对刻度进行字体修改为Times New Roman。
需要注意的一点是,如果指定了自己的字体,那么只能在FontProperties中修改size,通过设置刻度字体是无效的,如:
plt.yticks(fontsize=1)对于Linux等不内置宋体与Times New Roman字体的系统来说,需要首先运行代码查找matplotlib字体存放位置:
importmatplotlibmatplotlib.matplotlib_fname()然后将ttf文件copy到fonts/ttf目录下,删除/home/.cache/matplotlib内的所有文件(缓存)
然后修改matplotlibrc文件:
font.sans-serif: Simsun, Times, DejaVu Sans,......2. 图题设置
axe.set_title('$\mathrm{Title}$标题',fontproperties=Simsun,fontsize=12,y=1.05)字体不再赘述了。需要提的是y参数表示的是标题离图片的高度。
3. 坐标轴刻度设置
axe.set_xlim(0, 10)axe.set_ylim(0, 10)axe.invert_yaxis() # 翻转纵坐标plt.xticks([0,3,6,9], ["x=0",'x=3','x=6','x=9'], fontsize=10, color='red')axe.set_yticks(np.arange(0, 11, 1))#axe.get_xaxis().set_visible(False)axe.set_xlim用于设置图片的范围。地理图的范围设置是另一个函数,在第二篇文章中会介绍。
axe.invert_yaxis用于翻转纵坐标,同理横坐标也可以,使用axe.invert_xaxis即可
plt.xticks可以自定义当前子图的坐标轴刻度,[0,3,6,9]与 ["x=0",'x=3','x=6','x=9']分别对应第几个刻度位置显示什么标签。
axe.set_yticks是另一种设置标签的方式,如果不需要自定义的话这个函数还是很好用的。
axe.get_xaxis().set_visible()是设置坐标轴显示与否,包括了刻度与标签,如果设置为False则表示不显示,True为显示。
4. 坐标轴标签设置
axe.set_ylabel('$\mathrm{Y}$轴', fontsize=10)axe.set_ylabel与axe.set_xlabel分别表示设置y轴标签与x轴标签。
于是我们可以做一个四个子图同框的简单画布:

代码如下:
importmatplotlib.pyplotaspltimportnumpyasnpfrommatplotlib.font_managerimportFontPropertiesimportmatplotlibasmplSimsun=FontProperties(fname="./font/SimSun.ttf")mpl.rcParams['axes.unicode_minus']=Falseconfig={"mathtext.fontset":'stix',}mpl.rcParams.update(config)fig=plt.figure(figsize=(5,5),dpi=150)#创建画布axe=plt.subplot(2,2,1)#创建子图axe2=plt.subplot(2,2,2)#创建子图axe3=plt.subplot(2,2,3)#创建子图axe4=plt.subplot(2,2,4)#创建子图axe.set_title('图$\mathrm{1}$',fontproperties=Simsun,fontsize=12,y=1.05)#设置子图标题axe2.set_title('图$\mathrm{2}$',fontproperties=Simsun,fontsize=12,y=1.05)#设置子图标题axe3.set_title('图$\mathrm{3}$',fontproperties=Simsun,fontsize=12,y=1.05)#设置子图标题axe4.set_title('图$\mathrm{4}$',fontproperties=Simsun,fontsize=12,y=1.05)#设置子图标题plt.subplots_adjust(wspace=0.3,hspace=0.4)plt.show()#展示图片其中对于子图的调整使用了如下代码:
plt.subplots_adjust(wspace=0.3,hspace=0.4)wspace控制的是子图之间的横向间距,hspace是纵向间距
————————————————
版权声明:本文为知乎博主「爱垂钓的猫_」的原创文章,转载请附上原文出处链接及本声明。
原文链接:https://zhuanlan.zhihu.com/p/372639904