Matplotlib: разделенный запятыми числовой формат для оси - PullRequest
14 голосов
/ 25 ноября 2011

Я пытаюсь изменить формат моей оси, чтобы разделить запятыми в Matplotlib, работающем под Python 2.7, но я не могу это сделать.

Я подозреваю, что мне нужно использовать FuncFormatter, но я немного растерялся.

Может кто-нибудь помочь?

Ответы [ 5 ]

13 голосов
/ 13 сентября 2012

Я знаю, что вопрос старый, но, поскольку я сейчас ищу подобные решения, я решил оставить комментарий для дальнейшего использования, если это понадобится другим.

Для альтернативного решения используйте модуль locale и активируйте форматирование локали в matplotlib.

Например, в большинстве стран Европы запятая является желаемым разделителем. Вы можете использовать

#Locale settings
import locale
locale.setlocale(locale.LC_ALL, "deu_deu")
import matplotlib as mpl
mpl.rcParams['axes.formatter.use_locale'] = True

#Generate sample plot
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,501)
y = np.sin(x)
ax = plt.subplot(111)
ax.plot(x,y)
ax.yaxis.set_major_formatter(y_format)  # set formatter to needed axis

plt.show()

для создания того же графика, что и в решении Андрея, но вы можете быть уверены, что он ведет себя правильно и в угловых случаях.

12 голосов
/ 25 ноября 2011

Да, вы можете использовать matplotlib.ticker.FuncFormatter для этого.

Вот пример:

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

def func(x, pos):  # formatter function takes tick label and tick position
    s = str(x)
    ind = s.index('.')
    return s[:ind] + ',' + s[ind+1:]   # change dot to comma

y_format = tkr.FuncFormatter(func)  # make formatter

x = np.linspace(0,10,501)
y = np.sin(x)
ax = plt.subplot(111)
ax.plot(x,y)
ax.yaxis.set_major_formatter(y_format)  # set formatter to needed axis

plt.show()

Это приводит к следующему графику:

funcformatter plot

5 голосов
/ 01 марта 2013

Я думаю, что вопрос на самом деле относится к представлению, скажем, 300000 на оси Y как 300000.

Чтобы позаимствовать из ответа Андрея, с небольшим изменением,

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

def func(x, pos):  # formatter function takes tick label and tick position
   s = '{:0,d}'.format(int(x))
   return s


y_format = tkr.FuncFormatter(func)  # make formatter

x = np.linspace(0,10,501)
y = np.sin(x)
ax = plt.subplot(111)
ax.plot(x,y)

ax.yaxis.set_major_formatter (y_format) # установить форматер на нужную ось

plt.show ()

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

Я хотел бы опубликовать здесь другое решение, похожее на предложенное Торстеном Кранцем.

Используйте следующие первые строки в вашем коде:

import locale
locale.setlocale(locale.LC_ALL, "Portuguese_Brazil.1252")
import matplotlib as mpl
mpl.rcParams['axes.formatter.use_locale'] = True

Таким образом, ваш код будет соответствовать стандартному форматированию текста в Бразилии. Я верю, что это может помочь вам.

0 голосов
/ 03 августа 2017

Я хотел бы подробнее остановиться на ответе Торстена Кранца, похоже, что у matplotlib (2.02) может быть ошибка, заключающаяся в том, что он не использует поле тысяча сентябрь для разделения тысяч. Это происходит, даже если используется set_locale (True).

Поэтому, если вы установите локаль в локали Великобритании, она все равно должна разделять тысячи запятой, но это не так. Это делается для немецкого языка, поскольку используется десятичная точка.

Великобритания ('English_United Kingdom.1252') Язык:

{'currency_symbol': '\xa3',
 'decimal_point': '.',
 'frac_digits': 2,
 'grouping': [3, 0],
 'int_curr_symbol': 'GBP',
 'int_frac_digits': 2,
 'mon_decimal_point': '.',
 'mon_grouping': [3, 0],
 'mon_thousands_sep': ',',
 'n_cs_precedes': 1,
 'n_sep_by_space': 0,
 'n_sign_posn': 3,
 'negative_sign': '-',
 'p_cs_precedes': 1,
 'p_sep_by_space': 0,
 'p_sign_posn': 3,
 'positive_sign': '',
 'thousands_sep': ','}

Немецкий ('German_Germany.1252') языковой стандарт:

{'currency_symbol': '\x80',
 'decimal_point': ',',
 'frac_digits': 2,
 'grouping': [3, 0],
 'int_curr_symbol': 'EUR',
 'int_frac_digits': 2,
 'mon_decimal_point': ',',
 'mon_grouping': [3, 0],
 'mon_thousands_sep': '.',
 'n_cs_precedes': 0,
 'n_sep_by_space': 1,
 'n_sign_posn': 1,
 'negative_sign': '-',
 'p_cs_precedes': 0,
 'p_sep_by_space': 1,
 'p_sign_posn': 1,
 'positive_sign': '',
 'thousands_sep': '.'}

Edit: Глядя на код в скалярном форматере, Matplotlib не использует флаг группировки:

def pprint_val(self, x):
"""The last argument should be True"""
    xp = (x - self.offset) / (10. ** self.orderOfMagnitude)
    if np.absolute(xp) < 1e-8:
        xp = 0
    if self._useLocale:
        return locale.format_string(self.format, (xp,)) # <-- there should be a True as the last argument to this method which sets to grouping to True
    else:
        return self.format % xp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...