2009-04-21 36 views
247

Quiero trazar un gráfico con un eje logarítmico usando matplotlib.Trazar los ejes logarítmicos con matplotlib en python

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

programa

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

Respuesta

55

Usted sólo tendrá que utilizar semilogy en lugar de parcela:

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 para 'semilogy()'. – EOL

+1

LOL, estaba intentando registrar (FloatArray) para wholetime, gracias a que ha guardado mi día – Pradeep

+3

También hay [semilogx] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.semilogx). Si necesita iniciar sesión en ambos ejes, use [loglog] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.loglog) – drevicko

259

Puede usar el método Axes.set_yscale. Eso le permite cambiar la escala después de crear el objeto Axes. Eso también te permitiría construir un control para que el usuario pueda elegir la báscula si es necesario.

La línea correspondiente a añadir es:

ax.set_yscale('log') 

Puede utilizar 'linear' para cambiar de nuevo a una escala lineal. Esto es lo que el código se vería así:

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

result chart

+6

Este método es bueno ya que funciona con todo tipo de gráficos (por ejemplo, histogramas) , no solo con "plot" (que es lo que hace semilogx/semilogy) –

+1

¿Qué pasa si quiero tener un eje exponencial? –

+13

Vine aquí buscando cómo usar un eje para potencias de dos: pylab.gca(). Set_xscale ('log', basex = 2) – zje

223

En primer lugar, no es muy ordenado para mezclar pylab y pyplot código. Además, pyplot style is preferred over using pylab.

Aquí es un código ligeramente limpiado, utilizando sólo pyplot funciones:

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

Consulte mi pregunta What is the difference between ‘log’ and ‘symlog’? para ver algunos ejemplos de las escalas de gráfico que ofrece matplotlib.

+0

Tuve un momento difícil tratando de descubrir cómo hacerlo. ¡Esta respuesta salvó mi día! – HWende

+9

'pyplot.semilogy()' es más directo. – EOL

8

Sé que esto es un poco fuera de tema, ya que algunos comentarios mencionaron que el ax.set_yscale('log') es la solución "más agradable" que pensé que podría deberse a una refutación. No recomendaría usar ax.set_yscale('log') para histogramas y gráficos 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 para el registro, que funcionan bien.

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

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

4

Así que si usted simplemente está utilizando la API de poco sofisticado, como estoy a menudo (lo uso en ipython mucho), entonces esto es simplemente

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

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

4

si desea cambiar la base del logaritmo, sólo tiene que añadir:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log 
Cuestiones relacionadas