0

Построение гистограммы на логарифмической шкале с помощью Matplotlib

11

Я работаю с DataFrame в Pandas и у меня есть следующая последовательность значений в серии:

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]

Мне было указано построить два гистограммы в Jupyter Notebook с использованием Python 3.6. Я использовал следующий код для первой гистограммы:

x.plot.hist(bins=8)
plt.show()

Я выбрал 8 корзин, так как это, на мой взгляд, выглядело лучше всего. Также мне было указано построить еще одну гистограмму, используя логарифм от x:

x.plot.hist(bins=8)
plt.xscale('log')
plt.show()

Однако эта гистограмма выглядит УЖАСНО. Я не понимаю, что делаю не так? Я пробовал изменять настройки графика, но все, что я пытался, только ухудшало внешний вид гистограммы. Например, я пробовал вот это:

x.plot(kind='hist', logx=True)

У меня не было никаких других указаний, кроме как "построить логарифм X в виде гистограммы". Чтобы было понятно, я импортировал Pandas, NumPy и Matplotlib и указал, что график должен отображаться встраиваемым (inline).

Помогите, пожалуйста! Как мне правильно построить логарифмическую гистограмму, чтобы она выглядела более адекватно?

1 ответ(ов)

0

Согласно моим экспериментам, использование функции np.histogram может быть излишним, поскольку крайние значения массива x являются точно минимальным и максимальным, и для их вычисления нет необходимости вызывать np.histogram.

В примере кода ниже демонстрируется, как использовать логарифмические интервалы для построения гистограммы без необходимости в дополнительном вычислении:

import numpy as np
from matplotlib import pyplot as plt

def plot_loghist(x, bins):
    logbins = np.logspace(np.log10(np.min(x)), np.log10(np.max(x)), bins + 1)
    plt.hist(x, bins=logbins)
    plt.xscale('log')

plot_loghist(np.random.rand(200), 10)

Этот код генерирует случайные значения и строит их гистограмму с использованием логарифмических интервалов, что позволяет избежать лишних вычислений.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь