Легенда Matplotlib не учитывает размер содержимого с помощью lualatexPython

Программы на Python
Ответить
Anonymous
 Легенда Matplotlib не учитывает размер содержимого с помощью lualatex

Сообщение Anonymous »

Мне нужно создать графики matplotlib, используя lualatex вместо pdflatex. Помимо прочего, я использую fontspec для изменения шрифтов документа. Ниже я использую это в качестве примера и устанавливаю lmroman10-regular.otf в качестве шрифта. Это создает несколько проблем. Во-первых, маркеры в легендах не полностью центрированы и перед правой границей следуют пробелы:
Изображение

Код Python, создающий промежуточный файл .pgf, выглядит следующим образом:

Код: Выделить всё

import matplotlib
import numpy

from matplotlib import pyplot

x = numpy.linspace(-1, 1)
y = x ** 2

matplotlib.rcParams["figure.figsize"] = (3, 2.5)
matplotlib.rcParams["font.family"] = "serif"
matplotlib.rcParams["font.size"] = 10
matplotlib.rcParams["legend.fontsize"] = 8
matplotlib.rcParams["pgf.texsystem"] = "lualatex"

PREAMBLE = r"""\usepackage{ifluatex}
\ifluatex
\usepackage{fontspec}
\setmainfont{lmroman10-regular.otf}
\fi
"""

matplotlib.rcParams["text.latex.preamble"] = PREAMBLE
matplotlib.rcParams["pgf.preamble"] = PREAMBLE
matplotlib.rcParams["text.usetex"] = True

pyplot.plot(x, y, label="this is the data")
pyplot.legend()
pyplot.xlabel("xlabel")
pyplot.tight_layout()
pyplot.savefig("lualatex_test.pgf")
Файл .pgf затем встраивается в латексный документ. Кажется, что невозможно напрямую скомпилировать в .pdf, так как тогда шрифт документа не будет выбранным шрифтом, который можно увидеть, например, установив для шрифта что-то более отличное, например AntPoltExpd-Italic.otf. Также обратите внимание, что оператор \ifluatex должен быть добавлен вокруг кода, предназначенного только для lualatex, поскольку matplotlib использует pdflatex для определения размеров фрагментов текста, как будет видно ниже.
Для этого простого примера файл .tex для визуализации .pgf может быть просто:

Код: Выделить всё

\documentclass[11pt]{scrbook}
\usepackage{pgf}
\usepackage{fontspec}
\setmainfont{lmroman10-regular.otf}
\newcommand{\mathdefault}[1]{#1}
\begin{document}
\input{lualatex_test.pgf}
\end{document}
который можно набрать с помощью lualatex и получить в результате рисунок, показанный выше (без красной стрелки).
I думал, что нашел причину этого, но, похоже, я что-то упустил. Как упоминалось выше, matplotlib вычисляет размеры текстовых фрагментов, фактически помещая их в шаблон латекса и компилируя его с помощью pdflatex. Это происходит, например, в классе matplotlib.texmanager.TexManager в соответствующем файле в основной ветке. Я думал, что смогу это исправить вот так:

Код: Выделить всё

class TexManager:

...

@classmethod
def get_text_width_height_descent(cls, tex, fontsize, renderer=None):
"""Return width, height and descent of the text."""
if tex.strip() == '':
return 0, 0, 0
dvifile = cls.make_dvi(tex, fontsize)
dpi_fraction = renderer.points_to_pixels(1.) if renderer else 1
with dviread.Dvi(dvifile, 72 * dpi_fraction) as dvi:
page, = dvi
# A total height (including the descent) needs to be returned.
w = page.width
# !!!
if tex == "this is the data":
w /= 1.14
print("fixed width")
# !!!
return w, page.height + page.descent, page.descent
что, насколько я понимаю, должно заставить matplotlib думать, что текст короче в 1,14 раза (просто предположение, его следует адаптировать, как только решение сработает). Код определенно вызывается, поскольку печатается «фиксированная ширина». Но пробел не устранен:
Изображение

Как решить эту проблему? Как matplotlib вычисляет ширину содержимого легенды и могу ли я исправить это, чтобы учесть правильную ширину? Предположим, я знаю, что коэффициент ошибки ширины для размера шрифта 8 составляет примерно 1,14. Я легко могу определить это для других шрифтов и размеров шрифтов.

Подробнее здесь: https://stackoverflow.com/questions/793 ... h-lualatex
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»