Trazar ejes logarítmicos con matplotlib en python

456

Quiero trazar un gráfico con un eje logarítmico usando matplotlib.

He estado leyendo los documentos, pero no puedo entender la sintaxis. Sé que probablemente sea algo simple como 'scale=linear'en los argumentos de la trama, pero parece que no puedo hacerlo bien.

Programa de muestra:

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()
0
495

Puedes usar el Axes.set_yscalemétodo. Eso le permite cambiar la escala después de Axesque se crea el objeto. Eso también le permitiría construir un control para permitir que el usuario elija la escala si lo necesita.

La línea relevante para agregar es:

ax.set_yscale('log')

Puede utilizar 'linear'para volver a una escala lineal. Así es como se vería su 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

9
  • 7
    Este método es bueno ya que funciona con todo tipo de gráficos (por ejemplo, histogramas), no solo con "gráfico" (que es lo que hace semilogx / semilogy) 26 de julio de 2009 a las 0:18
  • 18
    Vine aquí buscando cómo usar un eje para potencias de dos: pylab.gca (). Set_xscale ('log', basex = 2)
    zje
    12/04/12 a las 20:16
  • 62
    Matplotlib tiene semilogy(). Además, es más fácil de usar directamente pyplot.yscale()que de usar ax.set_yscale('log'), ya que no es necesario obtener el axobjeto (que no siempre está disponible de inmediato). 28 de febrero de 2013 a las 5:43
  • 5
    Si desea escalas de registro en ambos ejes, intente loglog()o en el eje x solo intentesemilogx() 28 de junio de 2013 a las 7:00
  • 12
    @EOL Aconsejaría lo contrario. Es mejor usar un axobjeto explícito que usar, pyplotque solo podría aplicarse a los ejes que desee. 3 de mayo de 2016 a las 4:08
325

En primer lugar, no es muy ordenado mezclar pylaby pyplotcodificar. Además, se prefiere el estilo pyplot sobre el uso de pylab .

Aquí hay un código ligeramente limpiado, usando solo pyplotfunciones:

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()

La función relevante es pyplot.yscale(). Si usa la versión orientada a objetos, reemplácela por el método Axes.set_yscale(). Recuerde que también puede cambiar la escala del eje X, usando pyplot.xscale()(o Axes.set_xscale()).

Verifique mi pregunta ¿Cuál es la diferencia entre 'log' y 'symlog'? para ver algunos ejemplos de las escalas de gráficos que ofrece matplotlib.

2
  • Me costó mucho tratar de averiguar cómo hacerlo. ¡Esta respuesta me salvó el día!
    HWende
    5/06/12 a las 10:57
  • 14
    pyplot.semilogy() es más directo. 28 de febrero de 2013 a las 5:43
71

Simplemente necesita usar semilogía en lugar de trama:

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()
2
  • 1
    LOL, estaba probando log (FloatArray) durante todo el tiempo, gracias por salvarme el día
    Pradeep
    6 de septiembre de 2013 a las 9:29
  • 8
    También hay semilogx . Si necesita iniciar sesión en ambos ejes, use loglog 19 de enero de 2015 a las 0:24
61

si desea cambiar la base del logaritmo, simplemente agregue:

plt.yscale('log',base=2) 

Antes de Matplotlib 3.3, tendría que usar basex / basey como bases de log

9

Sé que esto está un poco fuera de tema, ya que algunos comentarios mencionaron que la ax.set_yscale('log')solución era "más agradable" y pensé que podría deberse a una refutación. No recomendaría usarlo ax.set_yscale('log')para histogramas y diagramas de barras. En mi versión (0.99.1.1) me encuentro con algunos problemas de renderizado, no estoy seguro de cuán general es este problema. Sin embargo, tanto bar como hist tienen argumentos opcionales para configurar la escala y en log, que funcionan bien.

referencias: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

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

7

Entonces, si simplemente está usando la API no sofisticada, como lo hago a menudo (la uso mucho en ipython), entonces esto es simplemente

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

¡Espero que esto ayude a alguien que busque una respuesta simple! :).