Alterar a escala dos eixos x em matplotlib

93

Eu criei este enredo usando Matlab

insira a descrição da imagem aqui

Usando matplotlib, os eixos x desenham grandes números, como 100.000, 200.000, 300.000. Gostaria de ter algo como 1, 2, 3 e 10 ^ 5 para indicar que é realmente 100.000, 200.000, 300.000.

Existe uma maneira simples de criar tal escala em matplotlib?

Águia
fonte

Respostas:

145

Tente usar matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Isso se aplica a notação científica (ou seja a x 10^b) às marcas do eixo x

Chris
fonte
9
é possível adicionar um deslocamento? (por exemplo, em vez de 0,0, 0,5, 1,0, 1,5, ... ex 10 ^ b será 0, 5, 10, 15, ... e x 10 ^ {b-1})
Eagle
24
ticklabel_formattambém é um método para os objetos de eixos, você pode tentar algo comoax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich
Como isso pode funcionar se você tem uma subtrama de, digamos, 2 parcelas?
FaCoffee
2
@Eagle, desculpe, sua pergunta de acompanhamento sobre a adição de um deslocamento era o que eu estava me referindo. meu eixo x é [0.1, 0.2, ...]e eu prefiro [1, 2, ...]com um expoente ajustado. você conseguiu encontrar uma solução para isso?
trianta2
@Eagle Também estou interessado na pergunta que trianta2 mencionou
Ben Usman
15

Esta não é tanto uma resposta à sua pergunta original, mas a uma das perguntas que você tinha no corpo da pergunta.

Um pequeno preâmbulo, para que meu nome não pareça estranho:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Como foi mencionado, você pode usar ticklabel_format para especificar que matplotlib deve usar notação científica para valores grandes ou pequenos:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Você pode afetar a maneira como isso é exibido usando os sinalizadores em rcParams (de matplotlib import rcParams) ou definindo-os diretamente. Não encontrei uma maneira mais elegante de mudar entre '1e' e 'x10 ^' notação científica do que:

ax.xaxis.major.formatter._useMathText = True

Isso deve lhe dar mais Matlab-esc e, de fato, sem dúvida uma aparência melhor. Acho que o seguinte deve fazer o mesmo:

rc('text', usetex=True)
Weir_Doe
fonte
11

O formatador escalar suporta a coleta de expoentes. Os documentos são os seguintes:

classe matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Bases: matplotlib.ticker.Formatter

A localização do tique é um número simples e antigo. Se useOffset == True e o intervalo de dados for muito menor do que a média dos dados, um deslocamento será determinado de forma que os rótulos de escala sejam significativos. A notação científica é usada para dados <10 ^ -n ou dados> = 10 ^ m, onde n e m são os limites de potência definidos usando set_powerlimits ((n, m)). Os padrões para eles são controlados pelo parâmetro axes.formatter.limits rc.

sua técnica seria:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Para obter o expoente exibido no formato x10^5, instancie o ScalarFormatter com useMathText=True.

Depois da imagem

Você também pode usar:

xfmt.set_useOffset(10000)

Para obter um resultado como este:

insira a descrição da imagem aqui

Carl F.
fonte
3
Instancie o ScalarFormatter com useMathText=Truepara obter x10^4.
Até Hoffmann,
9

Eu encontro a solução simples

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Cunzhang
fonte