Вопрос по scipy, python, matplotlib, numpy – Matplotlib - ступенчатая гистограмма с уже сохраненными данными

16

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

enter image description here

Ваш Ответ

4   ответа
8

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

@madtowneast, вы заслуживаете больше голосов за этот комментарий. Это такая скрытая особенность.matplotlib.org/api/…
Я выяснил второй способ. Просто установитеls = "steps" заplot(), Спасибо за ответ, хотя! madtowneast
0

http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

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

[Надрез]

и бит, который вы хотите, кажется,

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

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

Глядя на строку 7724,

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

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

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

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

# 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 бит это то, что на самом деле рисует линии.

@HughBothwell У него есть данные в корзинах, а не в непарнированных. С твоей правкой это кажется полезным для меня.
Насколько я понимаю пример, данные еще не сгруппированы. У меня уже есть данные в двоичном виде, поэтомуhist() не помогает madtowneast
@Jonas Wielicki: приведенный код приводит к изображению, о котором он спрашивал. Как это не применимо?
-1, не относится к вопросу
0

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

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 добавлены мои размеры и конечное значение соответственно, и их нужно скорректировать, если кто-то захочет использовать это.x_input а такжеy_input возвращаемые значения изnp.histogram, Мой результирующий график (синим контуром, нанесенным с помощью вышеупомянутой функции. Красным цветом изображена полоса тех же данных):

My result in contourplotting a histogram

3

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

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

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

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

Обратите внимание, что выбор для использования центра корзины является произвольным, вы можете использовать любую точку внутри корзины. После того, как вы сгенерировали набор данных без привязки, вы можете использовать нормальное построение гистограммы 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()

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

Похожие вопросы