从python中的面积图填充上部区域

时间:2019-05-04 15:15:25

标签: pandas graph plotly

我为绘图区域图着色时遇到问题。

我的数据如下:

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 ,以绘制上方区域。我得到的结果如下: enter image description here

但是请注意,预期的输出是蓝色的上部区域覆盖了图形的整个上部,就像在这里所做的那样:

enter image description here

欢迎提供有关如何填充图形上方区域的任何帮助。

非常感谢您!

1 个答案:

答案 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')

渲染器 stack-area-chart-plotly