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