最近在帮人做一些关于拟合的东西,虽然拟合没咋做出来,但是作图的好多东西就一下回忆起来了,主要是 Python 的 matplotlib 里的一些设置和 MATLAB 的一些设置都很像,就一下回忆起本科时候学习的一些东西了...反正也在下数据,就闲来写点东西。
#-*-coding:UTF-8 -*-import numpy as npimport mathimport matplotlib.pyplot as pltfrom matplotlib import rcParamsfrom matplotlib.font_manager import FontProperties#这个就当模板去用呗,省的总是查来查去的plt.rcParams['axes.unicode_minus']=False#设置字体font = {'family': 'sans-serif','color': 'darkred','weight': 'normal','size': 20,}font1 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc",style='normal',weight = 'bold',size = 20)title_font = FontProperties(fname=r"C:\Windows\fonts\times.ttf",style = 'normal',weight= 'bold',size=40)x = np.arange(-10,10,0.2)y = 1./(1 + np.exp(-x))# figure# 绘图的设置figure = plt.figure(figsize=(10,10),dpi=80,edgecolor='b')figure.text(0.2,0.5,'中文测试',FontProperties = font1)figure.text(0.6,0.5,r'y = $\dfrac{1}{1+e^{-x}}$',color='b',fontsize=20)#坐标轴设置ax = plt.gca()#左右无框ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.spines['bottom'].set_position(('data',0)) #data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置ax.spines['left'].set_position(('axes',0.5))#设置字体plt.plot(x,y,'r--',linewidth=3)plt.xlabel('x',fontsize=25,fontdict=font)plt.ylabel('y',fontsize=25,fontdict=font)locs, labels = plt.xticks()plt.tick_params(direction='in')plt.xticks(np.arange(-10, 10.1, step=2),fontsize=20)plt.yticks(np.arange(0.1,1.01,step=0.2),fontsize=20)plt.title(r'sigmoid function',fontsize=30,FontProperties=title_font,color='b')plt.show()plt.savefig("test.png")
也在补一些 DL 的基础呗,就看到这个 sigmoid 函数了,这个算 activate function ,用这个算出值之后再用交叉熵或者 softmax 计算损失函数。其实最关键的是想保留下这个 Python 的模板,发现 Python 的绘图和 MATLAB 很像,就是 figure - axes - children 属性。以前大多用 MATLAB 绘图,Python 用过几次,不大熟练,但是经常遇到几个问题,所以,就想记在公众号里,以备不时之需呗。
中文字体显示的问题 由于 Matplotlib 里面自带的字体库是不带中文字体的,所以需要去用一些方法去指向中文字体,例如:
font = {'family': 'sans-serif','color': 'darkred','weight': 'normal','size': 20,}title_font = FontProperties(fname=r"C:\Windows\fonts\times.ttf",style = 'normal',weight= 'bold',size=40)figure.text(0.2,0.5,'中文测试',FontProperties = font1)
font-family 这个东西,像无衬线,打字机 balala 可以自己查一查,当时在 LaTeX 工作室实习的时候也没搞清楚,hhhh,weight
设置粗细,size
设置大小。
fname 可以在命令窗口用 fc-list : > font.txt
输出,这个是 Linux 的命令,但是 Windows 照样适用。如果直接在命令窗口输出 fc-list
的话会导致中文字体的乱码,应该是 GBK 和 UTF-8 的编码问题。如果用 fc-list : > font.txt
就会把字体记录到一个 txt 文件中,然后中文就不会乱码(记得冒号前面后面还有 > 都有空格),这是刘海洋老师的 《LaTeX 入门》里讲的吧?如果想要查可用的中文字体的话可以用 fc-list :lang=zh > font1.txt
查看,当然记得切换到当前目录去找,要不然很多人可能不大熟练 Linux、Mac 那一套切换。
当然要看清楚用 rcParams
还是用 FontProperties
,然后坐标轴由于设置了字体会导致负号消失,用 plt.rcParams['axes.unicode_minus']=False
去控制。
LaTeX 公式的显示:
figure.text(0.6,0.5,r'y = $\dfrac{1}{1+e^{-x}}$',color='b',fontsize=20)
这个记得加上行间模式就行?美刀配对,记得 r
防止字符转义,因为 LaTeX 好多 \
开头的。
坐标轴的设置
ax = plt.gca()#左右无框ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')
先拿到当前 gca 的句柄,然后设置脊线的颜色为空。设置坐标轴的中心:
ax.spines['bottom'].set_position(('data',0)) #data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置ax.spines['left'].set_position(('axes',0.5))
保存图像:
plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w',orientation='portrait', papertype=None, format=None,transparent=False, bbox_inches=None, pad_inches=0.1,frameon=None, metadata=None)
官网给的 doc ,主要是 bbox_inches
是否设置 tight
属性,因为很多时候出图会有很大的留白,所以需要控制,和 MATLAB 一样。

也就是随便记录玩玩,看看而已,就当成个模板库备着。




