Python проблема с цифрами при установке «matplotlib.rcParams ['text.usetex'] = True» для использования LaTeX в метках И использования немецкой локали для использования запятой - PullRequest
0 голосов
/ 23 февраля 2020

Я хочу создать цифры, на которых метки x и y показывают их числовые значения, правильно отформатированные для немецкого языка, т. Е. Используя запятую в качестве десятичного разделителя. Я также хочу использовать элементы LaTeX, например, в метке оси x или y или в легенде графика. Следующий код показывает, что первая цифра создается по желанию для языковой версии Engli sh.

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

import locale

#  Set to German locale to get comma decimal separater
locale.setlocale(locale.LC_NUMERIC, "deu_deu")

# Use LaTeX elements
matplotlib.rcParams['text.usetex'] = True

t = np.linspace(0.0, 1.0, 100)
s = t*np.cos(4 * np.pi * t) + 2

fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(t, s)

ax.set_xlabel(r'Time $t$ with $t \le 1$')
ax.set_ylabel('Velocity $v(t)$')

plt.show()

fig.savefig("Mein_Test1.pdf")


fig2, ax2 = plt.subplots(figsize=(6, 4))
ax2.plot(t, s)

ax2.set_xlabel(r'Time $t$ with $t \le 1$')
ax2.set_ylabel('Velocity $v(t)$')

plt.ticklabel_format(useLocale=True)

plt.show()

fig2.savefig("Mein_Test2.pdf")

Первая цифра выглядит так, как нужно, с хорошими точками Engli sh в качестве десятичных разделителей. и хороший интервал в метках осей, и я могу использовать символ LaTeX "\ le" в метке оси x:

Однако на втором рисунке показано некрасивое расстояние в числах меток оси, со слишком большим пространством позади десятичного разделителя:

Если я делаю , а не , используйте "matplotlib.rcParams ['text.usetex'] = True", затем У меня не может быть элементов LaTeX в метке, то есть нет символа "\ le", но тогда интервал будет правильным даже для немецких запятых. Так что, похоже, здесь есть некоторый конфликт между немецким языком и «text.usetex». Любые идеи, чтобы получить оба права? Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2020

В конце концов я нашел способ достичь желаемого результата, посмотрев на ответ на этот вопрос, используя также лямбда-функцию. Вот код:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

import locale

# Set to German locale to get comma decimal separater
locale.setlocale(locale.LC_NUMERIC, "deu_deu")

# Use LaTeX elements
mpl.rcParams['text.usetex'] = True

t = np.linspace(0.0, 1.0, 100)
s = t*np.cos(4 * np.pi * t) + 2

fig2, ax2 = plt.subplots(figsize=(6, 4))

ax2.ticklabel_format(useLocale=True)

ax2.plot(t, s)

ax2.set_xlabel(r'Time $t$ with $t \le 1$')
ax2.set_ylabel('Velocity $v(t)$')

plt.ticklabel_format(useLocale=True)


ax2.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%1.3f', x, 1)))
ax2.get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%0.2f', x, 2)))

plt.show()

fig2.savefig("Mein_Test2.png")

Теперь я получаю желаемый результат:

...