2009-04-21 3 views
247

Я хочу построить график с одной логарифмической осью, используя matplotlib.Логарифмические оси графика с matplotlib в python

Я читал документы, но не могу понять синтаксис. Я знаю, что это, вероятно, что-то простое, как 'scale=linear' в рассуждениях сюжет, но я не могу показаться, чтобы получить это право

Пример программы:

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

ответ

55

Вам просто нужно использовать semilogy вместо участка:

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 для 'semilogy()'. – EOL

+1

LOL, я пытался log (FloatArray) для wholetime, спасибо, что вы спасли мой день – Pradeep

+3

Существует также [semilogx] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.semilogx). Если вам нужно войти в обе оси, используйте [loglog] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.loglog) – drevicko

259

Вы можете использовать метод Axes.set_yscale. Это позволяет изменять масштаб после создания объекта Axes. Это также позволит вам создать элемент управления, чтобы пользователь мог выбрать масштаб, если вам нужно.

Соответствующая линия добавляемая:

ax.set_yscale('log') 

Вы можете использовать 'linear' переключиться обратно в линейном масштабе. Вот что ваш код будет выглядеть следующим образом:

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

Этот метод хорош, так как он работает со всеми видами графиков (например, гистограмм) , а не только с «сюжетным» (что и является полулогами/полулогией) –

+1

Что делать, если бы я хотел иметь экспоненциальную ось? –

+13

Я пришел сюда, чтобы узнать, как использовать ось для двух степеней: pylab.gca(). Set_xscale ('log', basex = 2) – zje

223

Прежде всего, это не очень аккуратно перемешать pylab и pyplot код. Более того, pyplot style is preferred over using pylab.

Вот немного очистили код, используя только pyplot функции:

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

Соответствующая функция pyplot.yscale(). Если вы используете объектно-ориентированную версию, замените ее на метод Axes.set_yscale(). Помните, что вы также можете изменить масштаб оси X, используя pyplot.xscale() (или Axes.set_xscale()).

Проверьте мой вопрос What is the difference between ‘log’ and ‘symlog’?, чтобы увидеть несколько примеров графовых весов, которые предлагает matplotlib.

+0

Если вам трудно было понять, как это сделать. Этот ответ спас мой день! – HWende

+9

'pyplot.semilogy()' более прямой. – EOL

8

Я знаю, что это немного не по теме, так как в некоторых комментариях упоминалось, что ax.set_yscale('log') является «самым приятным» решением. Я думал, что может потребоваться опровержение. Я бы не рекомендовал использовать ax.set_yscale('log') для гистограмм и графиков. В моей версии (0.99.1.1) я сталкиваюсь с некоторыми проблемами рендеринга - не знаю, насколько это вообще проблема. Однако и bar, и hist имеют необязательные аргументы, чтобы установить y-scale в журнал, который работает нормально.

ссылки: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

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

4

Так что, если вы просто используете несведущего API, как я часто (я использую его в IPython много), то это просто

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

Надеюсь, это поможет кому-то найти простой ответ! :).

4

, если вы хотите изменить основание логарифмов, просто добавьте:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log 
Смежные вопросы