格式y轴为百分比

我有一个现有的用熊猫创建的图,像这样:

df['myvar'].plot(kind='bar')

y轴是浮点格式我想把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轴上的百分比

268981 次浏览

pandas数据框架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

Jianxun的解决方案为我做了这项工作,但打破了窗口左下角的y值指示器。

我最终使用了__abc0(并根据在这里去掉了不必要的尾随零):

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进行标签格式化:它是可靠的,通用的。

enter image description here

这迟了几个月,但我已经用matplotlib创建了公关# 6251,以添加一个新的PercentFormatter类。在这个类中,你只需要一行来重新格式化你的轴(如果你计算matplotlib.ticker的导入,则需要两行):

import ...
import matplotlib.ticker as mtick


ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())

PercentFormatter()接受三个参数,xmaxdecimalssymbolxmax允许你在轴上设置对应于100%的值。如果您有从0.0到1.0的数据,并且您想要显示从0%到100%的数据,这是很好的方法。只要做PercentFormatter(1.0)

另外两个参数允许您设置小数点和符号之后的位数。它们分别默认为None'%'decimals=None将自动设置小数点的数量基于多少轴你显示。

更新

PercentFormatter在2.1.0版中被引入Matplotlib中。

对于那些正在寻找简单语句的人来说:

plt.gca().set_yticklabels([f'{x:.0%}' for x in plt.gca().get_yticks()])

这个假设

  • 进口:from matplotlib import pyplot as plt
  • Python >=3.6用于f-String格式。对于旧版本,将f'{x:.0%}'替换为'{:.0%}'.format(x)

我建议使用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

我来晚了,但我刚刚意识到这一点:对于那些不使用坐标轴而只是子图的人来说,ax可以用plt.gca()代替。

呼应@疯狂物理学家的回答,使用包PercentFormatter,它将是:

import matplotlib.ticker as mtick


plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(1))
#if you already have ticks in the 0 to 1 range. Otherwise see their answer

基于@erwanp的答案,你可以使用Python 3的格式化字符串字面量

x = '2'
percentage = f'{x}%' # 2%

FuncFormatter()中,并与λ表达式结合。

所有的包装:

ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: f'{y}%'))
你可以在一行中做到这一点,而不导入任何东西: plt.gca().yaxis.set_major_formatter(plt.FuncFormatter('{}%'.format)) < / p >

如果你想要整数百分比,你可以做: plt.gca().yaxis.set_major_formatter(plt.FuncFormatter('{:.0f}%'.format)) < / p >

你可以使用ax.yaxisplt.gca().yaxisFuncFormatter仍然是matplotlib.ticker的一部分,但你也可以使用plt.FuncFormatter作为快捷方式。

如果符号在0到1之间,另一个一行解:

plt.yticks(plt.yticks()[0], ['{:,.0%}'.format(x) for x in plt.yticks()[0]])