Установите точность для пользовательских тиков с научным стилем - PullRequest
0 голосов
/ 25 февраля 2019

Я создал этот код для генерации следующего графика:

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1/10000, 1/2000, 13)
y = x**2
plt.plot(x, y, 'ro')
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)

Correct precision, wrong tick positions

Я хотел бы установить метки в позицииданные.Если я тогда сделаю plt.xticks(x, rotation=45), я получу галочки в нужных местах, но со слишком большим количеством десятичных знаков (см. Следующую картинку).Как получить галочки в указанных местах, но с контролируемой точностью?

Wrong precision, correct tick positions

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Простой способ сделать это - округлить значения x в назначении тиков:

plt.xticks(np.round(x,decimals=6))

работает для меня, например.

Обратите внимание, что это на самом деле переместит тики вуказанные позиции.Только с одним десятичным знаком это будет ясно видно.

0 голосов
/ 25 февраля 2019

Чтобы получить предопределенный формат для меток при сохранении научного множителя , вы можете использовать упрощенную версию OOMFormatter из моего ответа здесь .

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker

class FFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, fformat="%1.1f", offset=True, mathText=True):
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)

x = np.linspace(1/10000, 1/2000, 13)
y = x**2
plt.plot(x, y, 'ro')
plt.xticks(x, rotation=45)

fmt = plt.gca().xaxis.set_major_formatter(FFormatter(fformat="%1.1f"))
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)

plt.show()

enter image description here

0 голосов
/ 25 февраля 2019

Мне удалось решить проблему, вручную указав научные пределы и затем создав пользовательские метки:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1/10000, 1/2000, 13)
y = x**2
e = 4

plt.plot(x, y, 'ro')
# plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)
plt.xticks(x, ['{:.1f}'.format(10**e*s) for s in x])
plt.text(1.01, 0, 'x$10^{{:d}}$'.format(e), transform=plt.gca().transAxes)

enter image description here

Это решает проблему, хотятребуется указание экспоненты вручную.

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