Win10下安装了MiKTEX,Matplotlib需要使用 pgf 后端,将图形导出为可以使用 pdflatex,xelatex 或 lualatex 处理的 pgf 绘图命令。 这里使用XeLaTeX ,其具有完整的 unicode 支持,可以使用安装在操作系统中的任何字体,利用 OpenType,AAT 和 Graphite 的高级排版功能。 由plt.savefig('figure.pgf')
创建的 pgf 图片可以作为原始命令嵌入到 LaTeX 文档中。 图形也可以通过切换到该后端,直接编译并使用plt.savefig('figure.pdf')
保存到 PDF。需注意的是,必须要保存到pgf或pdf图片,Matplotlib中设置的"pgf.texsystem": "xelatex"才有效,否则会使用pdflatex编译,会涉及到Unicode报错(没有深入研究原因)。
具体示例如下:
import matplotlib as mpl
mpl.use("pgf")
mpl.rcParams.update({
"text.usetex": True,# use default xelatex
"pgf.texsystem": "xelatex",
"font.family": "sans-serif",
"font.sans-serif": "Times New Roman",
"pgf.preamble": [
"\\usepackage{xeCJK}", # load CJK package
"\\usepackage{metalogo}",
"\\usepackage{unicode-math}", # unicode math setup
"\\usepackage{fontspec}",
r"\setmainfont{Times New Roman}",
r"\setCJKmainfont{SimHei}", # serif font via preamble
r"\makeatletter \newcommand*{\rom}[1]{\expandafter\@slowromancap\romannumeral #1@} \makeatother",]
})
import matplotlib.pyplot as plt
plt.rcParams['text.latex.preamble']=r'\makeatletter \newcommand*{\rom}[1]{\expandafter\@slowromancap\romannumeral #1@} \makeatother'
figure = plt.figure(figsize=(18, 10))
ax = figure.add_axes([0.05,0.1,0.88,0.72])
ax.clear()
ax.set_xlabel(r'操作电阻'+r'$R$/$m\Omega$', fontsize=20)
ax.set_ylabel(r'熔池功率'+r'$P/MW$', fontsize=20)
ax.set_xlim([0, 50])
ax.set_ylim([0, 25])
x_locator = plt.MultipleLocator(5)
y_locator = plt.MultipleLocator(5)
ax.xaxis.set_major_locator(x_locator)
ax.yaxis.set_major_locator(y_locator)
plt.tick_params(labelsize=18)
plt.xticks(fontfamily="Times New Roman")
plt.yticks(fontfamily="Times New Roman")
plt.title(r"18MVA TENOVA电炉$\rom{4}$"+'\n'+"二次电压"+r'$V_2$:196-651V 13步'+'\n'+r'有效功率:'+r'$P_E=\frac{V_2^2}{(R+r)^2+X^2}R$', fontsize=22)
plt.text(-1.5, 26.0, r'$cos\phi=\frac{R+r}{\sqrt{(R+r)^2+X^2}}$ 线电流$I_2 = \frac{U_2cos\phi}{R+r}=\frac{V_2/\sqrt{3}}{\sqrt{(R+r)^2+X^2}}$'+'\n'+r'$P_E =3U_EI_2=3I_2^2R$ $R=\frac{U_E}{I_2}$ $U_E$:电极至炉膛电压'+'\n短网电阻$r=0.0172m\Omega$ 短网电抗$X=1.71m\Omega$', fontsize=14, bbox=dict(facecolor='gold', alpha=1))
for i in range(9):
plt.vlines(5*(i+1), 0, 25, colors='grey', linestyle="-")
for j in range(0, 20, 5):
plt.hlines((j+5), 0, 50, colors='grey', linestyle="-")
omega = np.arange(0, 50, 0.1)
#短网电阻mΩ
contactR = 0.0172
#短网电抗mΩ
factorR = 1.71
minvolt = 196
maxvolt = 651
powermin = (minvolt**2/((omega+contactR)**2+factorR**2))*omega/1e3
plt.text(12.5, 2.5, str("%sV"%minvolt), fontsize=16, bbox=dict(facecolor='white', alpha=0.5))
powermax = (maxvolt**2/((omega+contactR)**2+factorR**2))*omega/1e3
plt.text(18.0, 22.5, str("%sV"%maxvolt), fontsize=16, bbox=dict(facecolor='white', alpha=0.5))
ax.plot(omega, powermin, linewidth=4, color='r')
ax.plot(omega, powermax, linewidth=4, color='r')
for i in range(231, 651, 35):
power_temp = (i**2/((omega+contactR)**2+factorR**2))*omega/1e3
ax.plot(omega, power_temp, linewidth=1, color='r')
plt.savefig('pic-TENOVA.pdf',dpi=400)