如何解决在 Jupyter 和导出的 PDF 或 PNG 中绘制不同的 LaTeX 字体
我正在尝试创建我在 jupyter 实验室中使用 plotly 完成的图的 PDF,但是我在字体方面遇到了很多麻烦。 Plotly 为浏览器中的所有普通文本使用正确的字体,但所有 LaTeX 代码标签使用不同的字体。这是意料之中的,因为 plotly 使用 MathJax 进行渲染,并且显然它被配置为使用 Stix
。如果与导出的图形一致,我可以接受并将非 LaTeX 字体更改为 Stix
。真正困扰我的是,当我将绘图导出为 PDF 时,LaTeX 标签使用了另一种字体。出于某种原因,MathJax 然后默认为 MathJax_Main
。如果导出为 PNG 或 PDF,为了完全混淆,正常字体默认为 Liberation Serif
。
所以,这里有一些示例代码来创建一个绘图。我在 Debian 11 和 python 3.9 上运行它。如果有任何用处,我可以添加完整的 requirements.txt
。
import plotly.graph_objects as go
from plotly.express.colors import qualitative
layout = go.Layout(
font=dict(
family='Latin Modern Math',color='black',size=20,),colorway=qualitative.D3,width=600,height=320,margin=dict(l=10,r=10,t=10,b=10),paper_bgcolor='rgba(255,255,1)',plot_bgcolor='rgba(0,0)',xaxis=dict(
showline=True,linecolor='black',ticks='inside',exponentformat='e',mirror='ticks',yaxis=dict(
showline=True,legend=dict(
xanchor="left",yanchor="bottom",x=0.1,y=1.01,)
fig = go.figure(layout=layout)
X = np.linspace(0,2 * np.pi,100)
Y1 = np.sin(X)
Y2 = np.cos(X)
fig.add_trace(go.Scatter(x=X,y=Y1,name=r'$\text{The quick brown fox jumps over the lazy dog}$'))
fig.add_trace(go.Scatter(x=X,y=Y2,name='The quick brown fox jumps over the lazy dog'))
fig.show()
浏览器输出
乳胶:Stix
普通:拉丁现代数学
PDF 导出
LaTeX:MathJax_Main
普通:解放衬线
PNG 导出
LaTeX:MathJax_Main
普通:解放衬线
我想问题的根源在于,无论在后台导出(Kaleido,也许)和/或 MathJax,要么找不到正确的字体,要么使用不同的配置。但我不知道该配置在哪里或它应该是什么样子。
编辑 1
我查看了plotly和kaleido的源代码。看起来 kaleido 带有自己的 mathjax,所以这可能是问题所在。如果我理解正确,将图形交给 Kaleido (https://github.com/plotly/plotly.py/blob/24cda54b22b7c541a30fd6a080e4ccf5a0684106/packages/python/plotly/plotly/io/_kaleido.py#L145),它实现了 PlotlyScope
。 Kaleido 然后调用 _perform_transform
(https://github.com/plotly/Kaleido/blob/6a46ecae926b4c004bf7232383cf7c74c70748fd/repos/kaleido/py/kaleido/scopes/plotly.py#L153),它创建一个 JSON 转储并将其通过管道传输到某个子进程,该子进程返回最终图像。您可以看到 PlotlyScope
有一个成员 mathjax
,在我的例子中指向 $HOME/venvs/jupyter/lib/python3.9/site-packages/kaleido/executable/etc/mathjax/MathJax.js
。在这条链中的任何一点我都看不到任何字体规范被改变。所以我假设子进程(Kaleido 正在运行)接收正确的字体规范,但随后默认为任何,因为它找不到字体。不幸的是,当发生这种情况时,不会打印任何错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。