Есть ли способ динамического создания трасс, например, для гистограммы с накоплением? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть код, с которым я работаю:

Это трассы для создания гистограммы с накоплением.Теперь я ищу способ, чтобы эти трассы были динамическими в зависимости от переменной, которая подается из выпадающего меню.

Проблема в том, что не все трассы необходимы для каждого выбора в выпадающем меню.Например, выбор A не имеет значений для «жилой», и это дает мне ошибку.

  pv = pd.pivot_table(
        df_plot,
        index=['Year'],
        columns=["Market segment"],
        values=['Value'],
        aggfunc=sum,
        fill_value=0)

trace1 = go.Bar(x=pv.index, y=pv[("Value", "Residential")], name="Residential")
trace2 = go.Bar(x=pv.index, y=pv[("Value", "Business – small")], name="Business – small")
trace3 = go.Bar(x=pv.index, y=pv[("Value", "Business – medium")], name="Business - medium")
trace4 = go.Bar(x=pv.index, y=pv[("Value", "Business – micro")], name="Business - micro")
trace5 = go.Bar(x=pv.index, y=pv[("Value", "Business – SME")], name="Business - SME")
trace6 = go.Bar(x=pv.index, y=pv[("Value", "Business")], name="Business")


return {
    'data': [trace1, trace2, trace3, trace4, trace5, trace6],
    'layout':
    go.Layout(
        title='Metric: {}'.format(Metric),
        barmode='stack')
}

1 Ответ

0 голосов
/ 28 мая 2018

Вам просто нужно добавить условие if при подготовке трассировки и фактически проверить, есть ли данные в сводной таблице.Если данных нет, мы присваиваем пустой объект трассировке, см. Приведенный ниже минимальный рабочий пример, пожалуйста, дайте мне знать, если это решит вашу проблему!

import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()

df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])

pv = pd.pivot_table(
        df_plot,
        index=['A'],
        columns=["B"],
        values=['C'],
        aggfunc=sum,
        fill_value=0)

if 2 in list(pv.columns.levels[1]):
    trace1 = go.Bar(x=pv.index, y=pv[("C", 2)], name="Two")
else:
    trace1 = {}
if 5 in list(pv.columns.levels[1]):
    trace2 = go.Bar(x=pv.index, y=pv[("C", 5)], name="Five")
else:
    trace2 = {}

py_offline.iplot({
    'data': [trace1, trace2],
    'layout':
    go.Layout(
        barmode='stack')
})

Дополнительные сведения:

Результат приведенного ниже кода сводной таблицы:

pv = pd.pivot_table(
        df_plot,
        index=['A'],
        columns=["B"],
        values=['C'],
        aggfunc=sum,
        fill_value=0)

pivot table result

Таким образом, когда вы делаете pv.columns, мы получаем детали всех отдельныхстолбцы сводной таблицы, которая выглядит следующим образом.

pv.columns

MultiIndex (уровни = [['C'], [2, 4, 6, 8]], метки = [[0, 0, 0, 0], [0, 1, 2, 3]], names = [None, 'B'])

Вы можете просто создать цикл for для просмотра спискамассива параметров и примените проверку if condition, описанную в предыдущем примере, и, наконец, нанесите ее на график, обратитесь к приведенному ниже коду и дайте мне знать, если есть какие-либо проблемы.

import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()

df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])

pv = pd.pivot_table(
        df_plot,
        index=['A'],
        columns=["B"],
        values=['C'],
        aggfunc=sum,
        fill_value=0)
arr = []
params = [{'name': "Two", 'val': 2},{'name': "Five", 'val': 5}]
for param in params:
    if param['val'] in list(pv.columns.levels[1]):
        temp = go.Bar(x=pv.index, y=pv[("C", param['val'])], name=param['name'])
    else:
        temp = {}
    arr.append(temp)
py_offline.iplot({
    'data': arr,
    'layout':
    go.Layout(
        barmode='stack')
})
...