Обе логарифмические c шкала исторических осей - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужно построить гистограмму журнала (бот х и у в масштабе log10) с помощью Matplotlib, но следующий код не показывает желаемый результат:

import matplotlib.pyplot as plt
import numpy as np
fig, ax1 = plt.subplots()
# suppose to have an array x
ax1.hist(x, ec='white', color="red")
plt.xscale("log")
plt.yscale("log")
plt.show()

Мой желаемый результат - это гистограмма, где x = np.log10 (x) и, что то же самое, y = np.log10 (y), где каждый элемент в y является высотой каждого бина. Я даже пытался использовать гистограмму, но я не мог решить проблему перекрывающихся корзин: enter image description here

   import matplotlib.pyplot as plt
    import numpy as np
    frequency_dict = Counter(x)
    new_x = list(frequency_dict.keys())
    y = list(frequency_dict.values())
    ax1.bar(np.log10(new_x), np.log10(y), ec='white', color="red")
    plt.show()

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вы можете создавать корзины, которые распределяются равномерно в пространстве журнала. Эти границы ячеек можно рассчитать с помощью np.logspace(min, max, num_bins).

from matplotlib import pyplot as plt
import numpy as np

x = np.abs(np.random.normal(500, 200, 1000))
assert x.min() > 0, "all values need to be positive for log scale"

plt.hist(x, bins=np.logspace(np.log10(x.min()), np.log10(x.max()), 15), ec='white', color="red")
plt.loglog()

plt.show()

Слева гистограмма с линейными осями и справа с логарифмическими осями. Обе гистограммы с использованием лог-бинов.

demo plot

0 голосов
/ 28 апреля 2020

Вы можете использовать «log = True» в функции Hist, чтобы установить ось Y в логарифмическом масштабе. Вы можете вручную записать данные x перед созданием гистограммы. Так что это пример, который показывает, как это сделать. Я надеюсь, что это то, что вы ищете.

import matplotlib.pyplot as plt
import numpy as np

# Simulate a normally distributed dataset
x = np.random.normal(loc = 500, scale = 200, size = 100)

fig, ax = plt.subplots(ncols = 2, figsize=(12,3))
ax[0].hist(x, ec='white', color="red", log = False)
ax[0].set_xlabel('x')
ax[0].set_ylabel('Freq counts')

ax[1].hist(np.log10(x), ec='white', color="red", log = True)
ax[1].set_xlabel('log10(x)')
ax[1].set_ylabel('Freq counts in log scale')

plt.show()

, что приводит к

enter image description here

...