我为绘图区域图着色时遇到问题。
我的数据如下:
0 < zNear
我正在这样画画:
zNear < zFar
我只想为数据框的4列绘制一个填充区域图,但是请注意,我添加了一个额外的迹线 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
,以绘制上方区域。我得到的结果如下:
但是请注意,预期的输出是蓝色的上部区域覆盖了图形的整个上部,就像在这里所做的那样:
欢迎提供有关如何填充图形上方区域的任何帮助。
非常感谢您!
答案 0 :(得分:0)
之所以没有使堆积面积填充100%的图表,是因为堆积面积图的工作方式以及以散点图方式呈现。每个x轴值处的“总堆栈”将是每个系列中y轴值的总和。如果您的每条迹线的总和不等于所有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')