Построение логарифмических осей с матплотлибом в питоне - PullRequest
293 голосов
/ 21 апреля 2009

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

Я читал документы, но не могу понять синтаксис. Я знаю, что это, вероятно, что-то простое, как '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()

Ответы [ 6 ]

310 голосов
/ 26 июля 2009

Вы можете использовать метод 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

259 голосов
/ 18 августа 2010

Прежде всего, смешивать код pylab и pyplot не очень удобно. Более того, стиль pyplot предпочтительнее, чем использование 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()).

Проверьте мой вопрос В чем разница между «log» и «symlog»? , чтобы увидеть несколько примеров масштабов графика, которые предлагает matplotlib.

61 голосов
/ 21 апреля 2009

Вам просто нужно использовать полулогию вместо сюжета:

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()
16 голосов
/ 25 декабря 2017

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

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log
8 голосов
/ 08 апреля 2014

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

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

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

5 голосов
/ 22 марта 2017

Так что, если вы просто используете простой API, как я часто (я часто использую его в ipython), то это просто

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

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

...