Подтвердить что ты не робот

Matplotlib: формат номера с запятой для оси

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

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

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

4b9b3361

Ответ 1

Да, вы можете использовать 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

Ответ 2

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

Для альтернативного решения используйте модуль 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()

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

Ответ 3

Я думаю, что на самом деле вопрос относится к тому, чтобы представить 300000 по оси y как 300 000.

Заимствовать у Андрея ответ, с незначительной настройкой,

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()

Ответ 4

Я хотел бы рассказать о решении Thorsten Kranz, похоже, что matplotlib (2.02) может иметь ошибку, поскольку он не использует поле тысяч sep локали для разделения тысяч. Это происходит, даже если используется set_locale (True).

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

UK ('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': '.'}

Изменить: Рассматривая код в скалярном форматировании, 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