我在matplotib中使用了#text ;usetex':True。这对于具有线性刻度的图是很好的。但是对于对数刻度,y-ticks看起来像这样:
指数中的减号在情节中占据了很多水平空间,这不是很好。我希望它看起来像那样:
那个来自gnuplot,而且它没有使用tex-font。我想使用matplotlib,让它在tex中呈现,但10 ^ { - n}中的减号应该更短。这可能吗?
答案 0 :(得分:3)
减号的长度是LaTeX字体的决定 - 在数学模式二进制和一元缩误具有相同的长度。根据{{3}},您可以制作自己的标签。试试这个:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import ticker
mpl.rcParams['text.usetex']=True
mpl.rcParams['text.latex.unicode']=True
def my_formatter_fun(x, p):
""" Own formatting function """
return r"$10$\textsuperscript{%i}" % np.log10(x) # raw string to avoid "\\"
x = np.linspace(1e-6,1,1000)
y = x**2
fg = plt.figure(1); fg.clf()
ax = fg.add_subplot(1, 1, 1)
ax.semilogx(x, x**2)
ax.set_title("$10^{-3}$ versus $10$\\textsuperscript{-3} versus "
"10\\textsuperscript{-3}")
# Use own formatter:
ax.get_xaxis().set_major_formatter(ticker.FuncFormatter(my_formatter_fun))
fg.canvas.draw()
plt.show()
获取:
答案 1 :(得分:2)
Dietrich
给了你一个很好的答案,但如果你想保留LogFormatter
的所有功能(非基数10,非整数指数),那么你可以创建自己的格式化程序:< / p>
import matplotlib.ticker
import matplotlib
import re
# create a definition for the short hyphen
matplotlib.rcParams["text.latex.preamble"].append(r'\mathchardef\mhyphen="2D')
class MyLogFormatter(matplotlib.ticker.LogFormatterMathtext):
def __call__(self, x, pos=None):
# call the original LogFormatter
rv = matplotlib.ticker.LogFormatterMathtext.__call__(self, x, pos)
# check if we really use TeX
if matplotlib.rcParams["text.usetex"]:
# if we have the string ^{- there is a negative exponent
# where the minus sign is replaced by the short hyphen
rv = re.sub(r'\^\{-', r'^{\mhyphen', rv)
return rv
唯一真正做的是获取通常格式化程序的输出,找到可能的负指数并将数学的LaTeX代码更改为其他内容。当然,如果您使用\scalebox
创建一些具有等效性的创意LaTex,您可以这样做。
此:
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams["text.usetex"] = True
fig = plt.figure()
ax = fig.add_subplot(111)
ax.semilogy(np.linspace(0,5,200), np.exp(np.linspace(-2,3,200)*np.log(10)))
ax.yaxis.set_major_formatter(MyLogFormatter())
fig.savefig("/tmp/shorthyphen.png")
创建:
这个解决方案的好处是它尽可能减少输出。