Сюжетні логарифмічні осі з маплотлібом у пітоні


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
Цей метод є приємним, оскільки він працює з усілякими сюжетами (наприклад, гістограмами), а не лише з "сюжетом" (що і робить напівлогікс / семіологія)
Тім

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

53
Матплотліб має semilogy(). Крім того, його легше безпосередньо використовувати, pyplot.yscale()ніж використовувати ax.set_yscale('log'), оскільки немає необхідності діставати axоб’єкт (який не завжди є відразу).
Ерік О Лебігот

5
Якщо ви хочете мати ваги з обох осей, спробуйте loglog()або лише на осі x спробуйтеsemilogx()
drevicko

10
@EOL Я б порадив навпаки. Краще використовувати явний axоб'єкт, для використання pyplotяких тільки може застосовуватися до Axes ви хочете його.
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
Також є напівлогікс . Якщо вам потрібен журнал на обох осях, використовуйте журнал
drevicko

40

якщо ви хочете змінити основу логарифму, просто додайте:

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

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


5

Отже, якщо ви просто використовуєте непрофілізований API, як я часто є (я багато використовую його в ipython), то це просто

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

Сподіваюся, це допоможе комусь, хто шукає просту відповідь! :).


-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)')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.