使用 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()
我的原始数据框看起来与下面的相似:
| 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()