Plotly: Как построить кумулятивную гистограмму "шагов"? - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь построить кумулятивную гистограмму, используя Plotly в python, но сделать так, чтобы она выглядела как «шаги», то есть столбцы без цвета и отображается только верхняя линия.Примерно так:

enter image description here

По сути, я пытаюсь воспроизвести поведение следующего кода matplotlib:

import matplotlib.pyplot as plt
plt.hist(x, cumulative=True, histtype='step')

Пока что лучшее, что я смог сделать, это:

import plotly.graph_objs as go
from plotly.offline import iplot
h = go.Histogram(x=x,
                         cumulative=dict(enabled=True),
                         marker=dict(color="rgba(0,0,0,0)",
                                     line=dict(color="red", width=1)))
iplot([h])

Что приводит к чему-то вроде:
enter image description here

Так что жетрюк?

1 Ответ

2 голосов
/ 19 марта 2019

Если вы хотите обработать биннинг и накопление до того, как построит график, вы можете использовать объект go.Scatter со свойством shape линии, установленным в 'hvh'.

Участок:

enter image description here

Код: Настройка для ноутбука Jupyter

#imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

import numpy as np
import pandas as pd

# qtconsole for debugginh
#%qtconsole -- style vim

# Notebook settings
init_notebook_mode(connected=True)

# Some sample data
x = np.random.normal(50, 5, 500)
binned = np.histogram(x, bins=25, density=True)
plot_y = np.cumsum(binned[0])

# Line
trace1 = go.Scatter(
    x=binned[1],
    y=plot_y,
    mode='lines',
    name="X",
    hoverinfo='all',
    line=dict(color = 'rgb(1255, 0, 0)', shape='hvh'
    )
)

data = [trace1]

# Layout
layout = dict(title = 'Binned data from normal distribution',
    legend=dict(
        y=0.5,
        traceorder='reversed',
        font=dict(
            size=16
        )
    )
)

# Make figure
fig = dict(data=data, layout=layout)

# Plot
iplot(fig, filename='line-shapes')

Надеюсь, это то, что вы можете использовать!

Не стесняйтесь, дайте мне знать, если нет.

Некоторые детали:

Образец данных сделан с использованием np.random.normal(). x - выборочное нормальное распределение со средним = 50, сигма = 5 и 500 наблюдений. x затем помещается в 50 бинов, используя np.histogram(), который возвращает два массива. Они используются в качестве источника данных для графика.

Возможные альтернативные подходы:

Я также попытался использовать ваш фрагмент с некоторыми случайными выборочными данными и включить shape='hvh' в ваш line=dict(color="red", width=1). Это не похоже на работу, хотя. Я также подумал об изменении макета вашего go.Histogram(), чтобы была построена только верхняя линия столбцов, но я не думаю, что это возможно.

...