使用 plotly in python 绘制具有百分比差异的漏斗图

plot a funnel chart with percentage difference using plotly in python

我的原始数据框看起来与下面的相似:

| Sales_entity | country | id |
|--------------|---------|----|
| sales B      | US      | 1  |
| sales C      | US      | 1  |
| sales C      | US      | 15 |
| sales B      | US      | 20 |
| sales D      | US      | 21 |
| sales C      | US      | 2  |
| sales D      | US      | 2  |
| sales D      | US      | 12 |
| sales D      | US      | 50 |
| sales A      | US      | 25 |
| sales A      | Canada  | 3  |
| sales A      | Canada  | 3  |
| sales A      | Canada  | 9  |
| sales A      | Canada  | 11 |
| sales C      | Canada  | 4  |
| sales C      | Canada  | 4  |
| sales B      | Canada  | 5  |
| sales D      | Canada  | 5  |
| sales B      | Canada  | 6  |
| sales B      | Canada  | 6  |
| sales B      | Canada  | 8  |
| sales C      | Canada  | 7  |
| sales A      | Canada  | 14 |

这是输入数据框:

df= pd.DataFrame({'id' : [1]*2+[15]+[20]+[21] +[2]*2+[12]+[50]+[25] + [3]*2+[9]+[11] + [4]*2 +[5]*2+[6]*2+[8]*1+[7]+[14], 
                 'Sales Entity' : ['sales B','sales C','sales C','sales B','sales D','sales C','sales D','sales D','sales D',
                                   'sales A','sales A','sales A','sales A','sales A','sales C','sales C','sales B','sales D',
                                  'sales B','sales B','sales B','sales C','sales A'],
                'country' : ['US']*10 + ['Canada']*13})

我想按国家/地区分组,sales_entity 并分别计算 ID。为此,我使用了以下代码: df1= df.groupby(['country','Sales Entity'])['id'].nunique().reset_index(name='count') 此代码的输出如下所示:

| country | sales_entity | id |
|---------|--------------|----|
| Canada  | sales A      | 4  |
| Canada  | sales B      | 3  |
| Canada  | sales C      | 2  |
| Canada  | sales D      | 1  |
| US      | sales A      | 1  |
| US      | sales B      | 2  |
| US      | sales C      | 3  |
| US      | sales D      | 4  |

根据此输出,我想分别为加拿大和美国生成漏斗图,以便漏斗显示每个销售实体的价值以及百分比 growth/decline。例如,如果我们查看加拿大,漏斗应以 'sales A' 开头,值为 4,总百分比为 100%。当我们沿着漏斗向下移动到 'sales B' 时,它应该显示值 3 和百分比变化等等。同样,对于美国,漏斗应以 'sales D' 开头,然后是 'sales C'、'sales B' 和 'sales A',显示它们的值和百分比变化。在这种情况下,如何在 Python 中使用 plotly 创建漏斗图,而无需手动输入 table?

中的值

你可以参考这里https://plotly.com/python/funnel-charts/。 对于显示百分比变化,您可以修改文本信息并从中选择任何内容 percent initial, percent previous, percent total, value.textinfo Docs.

如果您需要一些其他列,您可以将其添加到数据中并使用 texttemplate Example

import plotly.graph_objects as go
from plotly.subplots import make_subplots

df= pd.DataFrame({'id' : [1]*2+[15]+[20]+[21] +[2]*2+[12]+[50]+[25] + [3]*2+[9]+[11] + [4]*2 +[5]*2+[6]*2+[8]*1+[7]+[14], 
                 'Sales Entity' : ['sales B','sales C','sales C','sales B','sales D','sales C','sales D','sales D','sales D',
                                   'sales A','sales A','sales A','sales A','sales A','sales C','sales C','sales B','sales D',
                                  'sales B','sales B','sales B','sales C','sales A'],
                'country' : ['US']*10 + ['Canada']*13})

df1= df.groupby(['country','Sales Entity'])['id'].nunique().reset_index(name='count')

USDF = df1[df1['country'] == 'US'].sort_values(['count'], ascending=[False])
CNDF = df1[df1['country'] == 'Canada'].sort_values(['count'], ascending=[False])

fig = make_subplots(rows=1, cols=2,subplot_titles=("US Funnel","Canada Funnel"))


fig.add_trace(
    go.Funnel(
    y = USDF['Sales Entity'],
    x = USDF['count'],
    textposition = "inside",
    textinfo = "value+percent previous",
    marker = {"color": "#1c1847"}
),
    row=1, col=1
)

fig.add_trace(
    go.Funnel(
    y = CNDF['Sales Entity'],
    x = CNDF['count'],
    textposition = "inside",
    textinfo = "value+percent previous",
        marker = {"color": "#ff0000"}
),
    row=1, col=2
)

fig.update_layout(showlegend=False,height=600, width=1000)
fig.show()

输出

我试了一下,参考官方参考。 我做了一个图表来比较两个国家在同一阶段的情况。同时被@venky回答了,但是我敢回答是因为写法不一样。感谢有机会学习这个。 from plotly import graph_objects as go

canada_number = df1.loc[df1['country'] == 'Canada','count']
canada_stage = df1.loc[df1['country'] == 'Canada','Sales Entity']

us_number = df1.loc[df1['country'] == 'US','count']
us_stage = df1.loc[df1['country'] == 'US','Sales Entity']

fig = go.Figure()

fig.add_trace(go.Funnel(
    name = 'Canada',
    y = canada_stage,
    x = canada_number,
    textinfo = "value+percent initial"))

fig.add_trace(go.Funnel(
    name = 'US',
    orientation = "h",
    y = us_stage,
    x = us_number,
    textposition = "inside",
    textinfo = "value+percent previous"))

fig.show()