Заполнение верхней области от диаграммы области в питоне - PullRequest
1 голос
/ 04 мая 2019

У меня проблема с раскрашиванием графического участка.

Мои данные следующие:

 class1       class2      class3      class4
    0            0            0          0             
    0            0            1          1             
    1            0            0          3             
    0            0            0          2    
    0            0            0          2
    0            0            0          2
    0            0            0          2
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          2

И я рисую это так:

trace0 = dict(
        x = new_index,
        y = class1['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(58, 203, 215)'),
        stackgroup = 'one',
        name = '[1,{}] '.format(lower_q) ) 
trace1 = dict(
        x = new_index,
        y = class2['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(177, 193, 123)'),
        stackgroup = 'one',
        name = '[{},{}] '.format(lower_q + 1, medium_q) ) 
trace2 = dict(
        x = new_index,
        y = class3['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(243, 161, 203)'),
        stackgroup = 'one',
        name = '[{},{}] '.format(medium_q + 1, upper_q) ) 
trace3 = dict(
        x = new_index,
        y = class4['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(184, 178, 247)'),
        stackgroup = 'one',
        name = '>= {}'.format(upper_q + 1) ) 
trace4 = dict(
        x = new_index,
        y = class4['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(178, 241, 247)'),
        stackgroup = 'one',
        name = 'upper area' )

    data = [trace0, trace1, trace2, trace3, trace4]

Я просто хочу нарисовать заполненную диаграмму области для 4 столбцов информационного кадра, но учтите, что я добавил дополнительный след trace4, чтобы закрасить верхнюю область.Результат, который я получаю, следующий: enter image description here

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

enter image description here

Любая помощь по заполнению верхней части графика будет приветствоваться.

Большое спасибо заранее!

1 Ответ

0 голосов
/ 04 мая 2019

Причина, по которой вы не получаете заполненную область для заполнения 100% диаграммы, заключается в том, как диаграмма с накоплением работает и отображается в виде графика.«Суммарный стек» при каждом значении оси х будет суммой значений по оси у каждого ряда.Если сумма значений каждого из ваших следов не равна одному значению для всех значений x, то заштрихованные области не будут заполнять весь график.

В вашем примере, если вы хотите нарисовать "дополнительная область ", то вам нужно создать трассу, у которой значение y равно max(sum(trace0:trace3)) - sum(trace0:trace3)[x_value].

Код для выполнения этого в вашем примере выглядит следующим образом:

max_value = max(df.sum(axis='columns')) # calculate max y-value in stack area chart
df['extra_fill'] = max_value - df.sum(axis='columns') # calculate "extra fill" value

Вот полный код для выполнения этого в блокноте Jupyter.
Скопируйте его в буфер обмена, чтобы pd.from_clipboard работал.

 class1       class2      class3      class4
    0            0            0          0
    0            0            1          1
    1            0            0          3
    0            0            0          2
    0            0            0          2
    0            0            0          2
    0            0            0          2
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          1
    0            0            0          2
import pandas as pd
import plotly
plotly.offline.init_notebook_mode(connected=True)

# manipulate df to make it look like code in question
df = pd.read_clipboard()
max_value = max(df.sum(axis='columns')) # calculate max y-value in stack area chart
df['extra_fill'] = max_value - df.sum(axis='columns') # calculate "extra fill" value
class1 = df[['class1']].rename(columns={'class1': 'num_users'})
class2 = df[['class2']].rename(columns={'class2': 'num_users'})
class3 = df[['class3']].rename(columns={'class3': 'num_users'})
class4 = df[['class4']].rename(columns={'class4': 'num_users'})
extra_fill = df[['extra_fill']].rename(columns={'extra_fill': 'num_users'})

new_index = pd.date_range('2017-12-31', '2019-01-01', freq='M')

trace0 = dict(
        x = new_index,
        y = class1['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(58, 203, 215)'),
        stackgroup = 'one',
        ) 
trace1 = dict(
        x = new_index,
        y = class2['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(177, 193, 123)'),
        stackgroup = 'one',
        ) 
trace2 = dict(
        x = new_index,
        y = class3['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(243, 161, 203)'),
        stackgroup = 'one',
        ) 
trace3 = dict(
        x = new_index,
        y = class4['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(184, 178, 247)'),
        stackgroup = 'one',
         ) 
trace4 = dict(
        x = new_index,
        y = extra_fill['num_users'],
        hoverinfo = 'x+y',
        mode = 'lines',
        line=dict(width=0.5,
                  color='rgb(178, 241, 247)'),
        stackgroup = 'one',
         ) 

data = [trace0, trace1, trace2, trace3, trace4]
plotly.offline.iplot(data, filename='basic-area')

Отображает stack-area-chart-plotly

...