Построение логарифмических осей с матплотлибом в питоне

369

Я хочу построить график с одной логарифмической осью, используя 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()
Макс Генис
источник

Ответы:

384

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

таблица результатов

Матье
источник
6
Этот метод хорош, так как он работает со всеми видами графиков (например, гистограммы), а не только с «plot» (что и делает semilogx / semilogy)
Тим Уиткомб
16
Я пришел сюда в поисках того, как использовать ось для степеней двойки: pylab.gca (). Set_xscale ('log', basex = 2)
zje
53
Матплотлиб имеет semilogy(). Кроме того, его проще использовать напрямую, pyplot.yscale()чем использовать ax.set_yscale('log'), так как нет необходимости получать axобъект (который не всегда доступен сразу).
Эрик О Лебиго
5
Если вы хотите, чтобы логарифмические шкалы loglog()semilogx()
отображались
10
@EOL Я бы посоветовал обратное. Лучше использовать явный axобъект, который можно использовать, pyplotкоторый может применяться только к тем осям, к которым вы хотите.
Tacaswell
288

Прежде всего, это не очень аккуратно, чтобы смешивать 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.

Денилсон Са Майя
источник
Трудно было понять, как это сделать. Этот ответ спас мой день!
HWende
13
pyplot.semilogy()более прямой.
Эрик О Лебиго
64

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

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()
Скотт МакКэммон
источник
1
LOL, я пытался войти (FloatArray) на все время, спасибо, что спас мой день
Pradeep
5
Существует также полулог . Если вам нужно войти в обе оси, используйте loglog
drevicko
40

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

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log
Dawid
источник
8

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

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

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

user3465408
источник
5

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

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

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

crazy2be
источник
-1

Вы можете использовать ниже код:

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)')
Шайлая Гупта Капур
источник