使用 Latex 在 Matplotlib 图形的标题中格式化比例尺

使用 Latex 在 Matplotlib 图形的标题中格式化比例尺

我在 matplotlib 中有一个图像,我想使用 Latex 语法在标题中放置一个比例尺。使用\vdash\dashv命令,我可以得到比例尺的末端,如图所示,但我希望中间的线条看起来更好。最好我想要一些看起来像平头 tikz 箭头的东西,其中长度可以任意选择,示例包含在图中。

是否可以在 matplotlib 标题中包含 tikz 箭头?

是否有其他可用的命令,不需要额外的包来产生与 tikz 箭头类似的字符?

我的代码用于生成图中的标题。

import matplotlib.pyplot as plt
import matplotlib

# Setup Latex params
preamble = '\n'.join([r"\usepackage{lmodern}", r"\usepackage{tikz}"])
params = {'text.latex.preamble': preamble,
          'text.usetex': True,
          'font.size': 8,
          'font.family': 'lmodern'}
matplotlib.rcParams.update(params)

# Create figure
fig, axes = plt.subplots(2, 2)
axes = axes.flatten()
fig.set_size_inches(3.49, 3.49)

# random data for plotting
X = [1, 8, 4, 6, 2]
Y = [1, 2, 3, 4, 5]
titles = ["%i mm" % (i*3) for i in range(5)]

# Plot, set title, and remove axis numbering
for ax, t in zip(axes, titles):
    ax.set_xticks([])
    ax.set_yticks([])
    ax.scatter(X, Y)
    ax.set_title(r"$\vdash \quad 800 \mu{}m \quad \dashv$")
    # ax.set_title(r"\tikz\draw[|-](0,0)--(1,0);")

plt.show()

Example Image

创建 tikz 箭头的示例取自https://latexdraw.com/exploring-tikz-arrows/

\documentclass[border=0.2cm]{standalone}
 
\usepackage{tikz}
 
\begin{document}
 
\begin{tikzpicture}
    \draw [-|](0,0) -- (1,0);
    \draw [|-](0,-1) -- (1,-1);
\end{tikzpicture}
 
\end{document}

Tikz arrows

需要指出的是,我在绘图时使用了以下 rcParams:

params = {'text.latex.preamble': r"\usepackage{lmodern}",
          'text.usetex': True,
          'font.size': 8,
          'font.family': 'lmodern'}
matplotlib.rcParams.update(params)

答案1

我不知道如何使用默认matplotlib绘图引擎实现这一点,但如果你改变后端,pgf效果会很好(在我自己的作品中,我总是使用pgf后端;但这个答案中的间距是不正确的,因为我不想调整 TiZ 箭头长度):

import matplotlib.pyplot as plt
import matplotlib as mpl

# Setup Latex params
preamble = '\n'.join([r"\usepackage[T1]{fontenc}",
                      r"\usepackage{lmodern}",
                      r"\usepackage{tikz}",
                      r"\usepackage[detect-all]{siunitx}"])
params = {'pgf.preamble': preamble,
          'font.size': 8,
          'font.family': 'serif'}
mpl.use('pgf')
mpl.rcParams.update(params)

# Create figure
fig, axes = plt.subplots(2, 2)
axes = axes.flatten()
fig.set_size_inches(3.49, 3.49)

# random data for plotting
X = [1, 8, 4, 6, 2]
Y = [1, 2, 3, 4, 5]
titles = ["%i mm" % (i*3) for i in range(5)]

# Plot, set title, and remove axis numbering
for ax, t in zip(axes, titles):
    ax.set_xticks([])
    ax.set_yticks([])
    ax.scatter(X, Y)
    # ax.set_title(r"$\vdash \quad 800 \mu{}m \quad \dashv$")
    ax.set_title(r"\tikz\draw[|-](0,0)--(1,0);"
                 r"\SI{800}{\micro\metre}"
                 r"\tikz\draw[-|](0,0)--(1,0);")

# plt.show()
plt.savefig("matplotlibthingy.pdf")

相关内容