Подтвердить что ты не робот

Matplotlib - ступенчатая гистограмма с уже обработанными данными

Я пытаюсь получить гистограмму с уже закодированными данными. Я пытался использовать bar() для этого, но я не могу понять, как сделать его ступенчатой ​​гистограммой как это из примеров вместо заполненной гистограммы.

enter image description here

4b9b3361

Ответ 1

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

from matplotlib import pyplot
import numpy as np

#sample data:
x = np.arange(30)
y = np.cumsum(np.arange(30))
#offset the x for horizontal, repeat the y for vertical:
x = np.ravel(zip(x,x+1))
y = np.ravel(zip(y,y))

pyplot.plot(x,y)
pyplot.savefig('plt.png')

график:

enter image description here

Ответ 2

Самое простое решение состоит в том, чтобы преобразовать ваш бит-набор данных в нераспределенный взвешенный набор данных (с количеством элементов == количество ящиков). Нераспределенный набор данных будет состоять из значений данных, равных центрам бинов, и весов, равных значениям в каждом бункере. Например, скажем, что ваши данные с биннами,

binedges = [0.0, 1.0, 2.0, 3.0]
ybinned = [11., 22., 33.]

Соответствующий взвешенный набор данных будет,

y =       [0.5, 1.5, 2.5]
weights = [11., 22., 33.]

Обратите внимание, что выбор использования центра bin произволен, вы можете использовать любую точку внутри корзины. После того, как вы сгенерировали нерасширенный набор данных, вы можете использовать обычную графику гистограммы matplotlib (то есть Axes.hist).

Ниже приведен пример реализации в python:

def plot_binned_data(axes, binedges, data,
               *args, **kwargs):
    #The dataset values are the bin centres
    x = (binedges[1:] + binedges[:-1]) / 2.0
    #The weights are the y-values of the input binned data
    weights = data
    return axes.hist(x, bins=binedges, weights=weights,
               *args, **kwargs)

Теперь вы можете получить полный доступ ко всем параметрам графика Axes.Histogram, включая histtype="step", чтобы создать ступенчатую гистограмму, которую вы хотели.

Пример использования этой функции:

import numpy
import matplotlib.pyplot as plt

#Create a dataset
dataset = numpy.random.normal(size=100)
#Bin the dataset
binedges = numpy.linspace(-5.0, 5.0, num=10)
y, binedges = numpy.histogram(dataset, binedges)

#Plot the dataset
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plot_binned_data(ax, binedges, y, histtype="step")
plt.show()

Надеюсь, что это поможет!

Ответ 3

Из сопроводительного источника в http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

вот как они нарисовали этот график:

[надрез]

и бит, который вы хотите, будет

pylab.hist(x, bins=bins, histtype='step')
                            ^
                        right here

Изменить:, если вы хотите узнать, как работает hist(), посмотрите на источник - он определен в matplotlib/axes.py, начиная с строки 7407.

Рассматривая строку 7724,

x = np.zeros( 2*len(bins), np.float )
y = np.zeros( 2*len(bins), np.float )

для N баров, бит - это numpy.ndarray из значений N + 1, являющийся ребрами для каждого бара. Они близки значениям для каждого бара (это то, что делает fraxel с np.ravel ниже) и сдвиньте точки данных на половину бара влево, чтобы центрировать их

x[0::2], x[1::2] = bins, bins
x -= 0.5*(bins[1]-bins[0])

установить высоту каждого бара, двойникованного, но смещенного на единицу (относительно значений х), чтобы создать эффект шага

# n is an array of arrays containing the number of items per bar
patches = []    # from line 7676
for m, c in zip(n, color):
    y[1:-1:2], y[2::2] = m, m
    patches.append(self.fill(x, y, closed=False, edgecolor=c, fill=False))

и бит self.fill - это то, что на самом деле рисует линии.

Ответ 4

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

def make_bar_contour_plot(ax,x_input,y_input):

    x = list(np.ravel(zip(x_input[:-1],x_input[:-1]+1)))[1:]
    x += [x[-1]+20] + [300] 
    y = list(np.ravel(zip(y_input,y_input))) +[0]
    ax.plot(x,y,ls='steps')

    return ax

Добавленные 20 и 300 - это мои значения binsize и конечное значение соответственно, и их нужно настроить, если кто-то захочет использовать это. x_input и y_input - возвращаемые значения из np.histogram. Мой итоговый график (в синем контур, нанесенный с использованием выше функции. В красном, штрих-код с теми же данными):

My result in contourplotting a histogram