Формат оси y в процентах
У меня есть существующий сюжет, который был создан с помощью pandas следующим образом:
df['myvar'].plot(kind='bar')
Ось y имеет формат как float, и я хочу изменить ось y на проценты. Все найденные решения используют синтаксис ax.xyz и Я могу разместить код ниже строки выше, которая создает график (я не могу добавить ax = ax в строку выше.)
Как отформатировать ось y в процентах без изменения строки выше?
Вот решение, которое я нашел , но требует переопределения графика:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mtick
data = [8,12,15,17,18,18.5]
perc = np.linspace(0,100,len(data))
fig = plt.figure(1, (7,4))
ax = fig.add_subplot(1,1,1)
ax.plot(perc, data)
fmt = '%.0f%%' # Format you want the ticks, e.g. '40%'
xticks = mtick.FormatStrFormatter(fmt)
ax.xaxis.set_major_formatter(xticks)
plt.show()
Ссылка на приведенное выше решение: Pyplot: использование процента по оси x
Ответы
Ответ 1
Pandas dataframe plot вернет вам ax
, и тогда вы сможете начать управлять осями так, как вам хочется.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(100,5))
# you get ax from here
ax = df.plot()
type(ax) # matplotlib.axes._subplots.AxesSubplot
# manipulate
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])
![enter image description here]()
Ответ 2
Jianxun решение выполнило эту задачу для меня, но сломало индикатор значения y в левом нижнем углу окна.
В итоге я использовал FuncFormatter
(а также разделил ненужные конечные нули, как предлагалось здесь):
import pandas as pd
import numpy as np
from matplotlib.ticker import FuncFormatter
df = pd.DataFrame(np.random.randn(100,5))
ax = df.plot()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y)))
Вообще говоря, я бы рекомендовал использовать FuncFormatter
для форматирования меток: он надежный и универсальный.
![введите описание изображения здесь]()
Ответ 3
Это на несколько месяцев позже, но я создал PR # 6251 с помощью matplotlib, чтобы добавить новый класс PercentFormatter
. С этим классом вам просто нужна одна строка для переформатирования вашей оси (две, если вы посчитаете импорт matplotlib.ticker
):
import ...
import matplotlib.ticker as mtick
ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
PercentFormatter()
принимает три аргумента: xmax
, decimals
, symbol
. xmax
позволяет установить значение, соответствующее 100% на оси. Это хорошо, если у вас есть данные от 0,0 до 1,0, и вы хотите отобразить их от 0% до 100%. Просто сделай PercentFormatter(1.0)
.
Два других параметра позволяют вам установить количество цифр после десятичной точки и символа. По умолчанию они None
и '%'
соответственно. decimals=None
автоматически устанавливает количество десятичных знаков в зависимости от того, сколько осей вы показываете.
Ответ 4
Для тех, кто ищет быстрый однострочник:
plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()])
Или, если вы используете Latex в качестве средства форматирования текста оси, вы должны добавить одну обратную косую черту '\'
plt.gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in plt.gca().get_yticks()])
Ответ 5
Я предлагаю альтернативный метод с использованием seaborn
Рабочий код:
import pandas as pd
import seaborn as sns
data=np.random.rand(10,2)*100
df = pd.DataFrame(data, columns=['A', 'B'])
ax= sns.lineplot(data=df, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='title')
#changing ylables ticks
y_value=['{:,.2f}'.format(x) + '%' for x in ax.get_yticks()]
ax.set_yticklabels(y_value)
![enter image description here]()