Tenho um enredo criado com pandas assim:
df['myvar'].plot(kind='bar')
O eixo y está formatado como flutuante e quero alterar o eixo y para porcentagens. Todas as soluções que encontrei usam a sintaxe ax.xyz e só posso colocar o código abaixo da linha acima que cria o gráfico (não posso adicionar ax = ax à linha acima).
Como posso formatar o eixo y como porcentagens sem alterar a linha acima?
Aqui está a solução que encontrei, mas requer que eu redefina o gráfico :
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()
Link para a solução acima: Pyplot: usando porcentagem no eixo x
python
pandas
matplotlib
plot
Chris
fonte
fonte
Respostas:
Isso está alguns meses atrasado, mas criei PR # 6251 com matplotlib para adicionar uma nova
PercentFormatter
classe. Com esta classe, você só precisa de uma linha para reformatar seu eixo (duas se você contar a importação dematplotlib.ticker
):PercentFormatter()
aceita três argumentos,xmax
,decimals
,symbol
.xmax
permite que você defina o valor que corresponde a 100% no eixo. Isso é bom se você tiver dados de 0,0 a 1,0 e quiser exibi-los de 0% a 100%. Apenas façaPercentFormatter(1.0)
.Os outros dois parâmetros permitem definir o número de dígitos após o ponto decimal e o símbolo. O padrão é
None
e'%'
, respectivamente.decimals=None
irá definir automaticamente o número de casas decimais com base em quantos eixos você está mostrando.Atualizar
PercentFormatter
foi introduzido no Matplotlib na versão 2.1.0.fonte
from matplotlib.ticker import mtick
e assumi que omtick
"módulo" foi removido.O gráfico do dataframe do pandas retornará o
ax
para você, e então você pode começar a manipular os eixos como quiser.fonte
matplotlib.ticker
formatadores de função!A solução de Jianxun funcionou para mim, mas quebrou o indicador de valor y no canto inferior esquerdo da janela.
Acabei usando em
FuncFormatter
vez disso (e também retirei os zeros à direita desnecessários, conforme sugerido aqui ):De modo geral, eu recomendo usar
FuncFormatter
para formatação de etiqueta: é confiável e versátil.fonte
ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format))
. Também conhecido como, não há necessidade de lambda, deixe o formato fazer o trabalho.'{0:.0%}'.format
cria uma função de formatação . O0
antes dos dois pontos informa ao formatador para substituir as chaves e seu conteúdo pelo primeiro argumento passado para a função. A parte após os dois pontos,,.0%
informa ao formatador como renderizar o valor. O.0
especifica 0 casas decimais e%
especifica a renderização como uma porcentagem.Para aqueles que procuram uma linha rápida:
Ou se você estiver usando Latex como o formatador de texto do eixo, você deve adicionar uma barra invertida '\'
fonte
Eu proponho um método alternativo usando
seaborn
Código de trabalho:
fonte
Estou atrasado para o jogo, mas acabei de perceber isso:
ax
pode ser substituídoplt.gca()
por aqueles que não estão usando eixos e apenas subtramas.Ecoando a resposta do @Mad Physicist, usando o pacote
PercentFormatter
seria:fonte