Как включить химические фигуры (пакет LaTeX) в matplotlib? - PullRequest
3 голосов
/ 01 апреля 2019

Я сейчас нахожусь в состоянии обучения matplotlib.pyplot, и было бы неплохо иметь интеграцию LaTeX, чтобы работать максимально безупречно.

Это то, что у меня сейчас есть:

import numpy as np
import matplotlib.pyplot as plt

# Latex implementation
plt.rc('text', usetex=True)
plt.rc('text.latex', preamble=r'\usepackage{chemfig},\usepackage{siunitx}')

# import data from file
with open ('vanillin.dat') as dat:
    lines = dat.readlines()
    wavenumbers = [float(line.split()[0]) for line in lines]
    absorption = [float(line.split()[1]) for line in lines]


# axis labels and plot title
plt.title("IR Spectrum of Vanillin", fontsize=22)

plt.xlabel('Wavenumber in cm$^{-1}$', fontsize=16)
plt.ylabel('Absorption in \%', fontsize=16)


# axis limits (Wavenumber on x coordinate has to be reversed)
plt.ylim(0,100)
plt.xlim(4000,600)

# grid and plot drawing
plt.grid(color='gray', linestyle=':')

plt.plot(wavenumbers, absorption, c='black', linewidth=0.5)

# save plot
plt.savefig('output.png')

Приведенный выше код приводит к следующему спектру:

Plain plot

Теперь, если я хочу добавить текст (который включает макросы из включенного пакета LaTeX, а именно siunitx), это работает отлично. Это добавленная строка (добавлена ​​ниже plt.ylabel()) и ниже получившегося графика:

plt.text(3700, 80, r'Peak at \SI{1600}{\per\centi\meter} $\rightarrow$ carbonyl', fontsize=12)

Plot with added text using

Теперь я хочу включить структуру для ванилина, которая генерируется с помощью кода chemfig ниже:

\chemfig{*6((-HO)=(-O-[:-30])-=(-=[2]O)-=-)}

Вот как это выглядит:

Chemical structure of vanillin

Если я теперь включу код в свой график, то как-то будет невозможно правильно его отобразить:

plt.text(3300, 80, r'\chemfig{*6((-HO)=(-O-[:-30])-=(-=[2]O)-=-)}')

plot with chemfig structure which is not displayed correctly

У кого-нибудь есть идеи, как решить эту проблему?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...