Traçar eixos logarítmicos com matplotlib em python

369

Quero plotar um gráfico com um eixo logarítmico usando matplotlib.

Eu tenho lido os documentos, mas não consigo descobrir a sintaxe. Eu sei que provavelmente é algo simples como 'scale=linear'nos argumentos da trama, mas não consigo acertar

Programa de exemplo:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()
Max Ghenis
fonte

Respostas:

384

Você pode usar o Axes.set_yscalemétodo Isso permite alterar a escala após a Axescriação do objeto. Isso também permitiria criar um controle para permitir que o usuário escolha a escala, se necessário.

A linha relevante a ser adicionada é:

ax.set_yscale('log')

Você pode usar 'linear'para voltar para uma escala linear. Aqui está a aparência do seu código:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

gráfico de resultados

Mathieu
fonte
6
Este método é bom, uma vez que trabalha com todos os tipos de terrenos (por exemplo histogramas), e não apenas com "plot" (que é o que semilogx / semilogy faz)
Tim Whitcomb
16
Eu vim aqui à procura de como usar um eixo de potências de dois:. Pylab.gca () set_xscale ( 'log', Basex = 2)
zje
53
O Matplotlib possui semilogy(). Além disso, é mais fácil usar diretamente pyplot.yscale()do que usar ax.set_yscale('log'), pois não há necessidade de obter o axobjeto (que nem sempre está disponível imediatamente).
Eric O Lebigot
5
Se você quiser escalas de log em ambos os eixos, tente loglog()ou no eixo X única tentarsemilogx()
drevicko
10
@EOL Aconselho o contrário. É melhor usar um axobjeto explícito do que usar o pyplotque pode ser aplicado apenas aos eixos que você deseja.
tacaswell
288

Primeiro de tudo, não é muito arrumado misturar pylabe pyplotcodificar. Além disso, o estilo pyplot é preferido em vez de usar o pylab .

Aqui está um código ligeiramente limpo, usando apenas pyplotfunções:

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

A função relevante é pyplot.yscale(). Se você usar a versão orientada a objetos, substituí-lo pelo método Axes.set_yscale(). Lembre-se de que você também pode alterar a escala do eixo X usando pyplot.xscale()(ou Axes.set_xscale()).

Verifique minha pergunta Qual é a diferença entre 'log' e 'symlog'? para ver alguns exemplos das escalas gráficas oferecidas pelo matplotlib.

Denilson Sá Maia
fonte
Tive dificuldade em descobrir como fazê-lo. Esta resposta salvou meu dia!
precisa saber é o seguinte
13
pyplot.semilogy()é mais direto.
Eric O Lebigot
64

Você simplesmente precisa usar a semilogia em vez do enredo:

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()
Scott McCammon
fonte
11
LOL, eu estava tentando log (FloatArray) para wholetime, graças você salvou meu dia
Pradeep
5
Há também semilogx . Se você precisar fazer logon nos dois eixos, use loglog
drevicko
40

se você quiser alterar a base do logaritmo, basta adicionar:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log
Dawid
fonte
8

Eu sei que isso é um pouco fora de tópico, já que alguns comentários mencionaram a ax.set_yscale('log')solução mais "agradável" que eu pensei que poderia ser uma refutação. Eu não recomendaria o uso ax.set_yscale('log')de histogramas e gráficos de barras. Na minha versão (0.99.1.1), encontro alguns problemas de renderização - não tenho certeza de quão geral é esse problema. No entanto, bar e hist têm argumentos opcionais para definir a escala y para logar, o que funciona bem.

referências: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist

user3465408
fonte
5

Portanto, se você está simplesmente usando a API não sofisticada, como eu frequentemente (uso muito no ipython), isso é simplesmente

yscale('log')
plot(...)

Espero que isso ajude alguém que procura uma resposta simples! :).

crazy2be
fonte
-1

Você pode usar o código abaixo:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
Shailaja Gupta Kapoor
fonte