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


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.