Я пытаюсь изменить формат моей оси, чтобы она была разделена запятой в Matplotlib, работающей под Python 2.7, но я не могу этого сделать.
Я подозреваю, что мне нужно использовать FuncFormatter, но я немного потерял.
Может ли кто-нибудь помочь?
Я пытаюсь изменить формат моей оси, чтобы она была разделена запятой в Matplotlib, работающей под Python 2.7, но я не могу этого сделать.
Я подозреваю, что мне нужно использовать FuncFormatter, но я немного потерял.
Может ли кто-нибудь помочь?
Да, вы можете использовать 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()
В результате получается следующий график:
Я знаю, что вопрос старый, но по мере того, как я в настоящее время ищу аналогичные решения, я решил оставить комментарий для дальнейшего использования, если другим это нужно.
Для альтернативного решения используйте модуль 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, но вы можете быть уверены, что он корректно ведет себя и в угловых шкафах.
Я думаю, что на самом деле вопрос относится к тому, чтобы представить 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()
Я хотел бы рассказать о решении 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