[英]plot a funnel chart with percentage difference using plotly in python
我原來的 dataframe 看起來與下面的類似:
| 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 |
這是輸入 dataframe:
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')
My output from this代碼如下所示:
| 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 |
從這個 output,我想分別為加拿大和美國生成一個漏斗圖,以便漏斗顯示每個銷售實體的價值以及百分比增長/下降。 例如,如果我們查看加拿大,漏斗應該以“銷售額 A”開頭,值為 4,百分比總計為 100%。 當我們沿着漏斗向下移動到“銷售 B”時,它應該顯示值 3 和百分比變化等等。 同樣,對於美國,漏斗應該以“銷售 D”開頭,然后是“銷售 C”、“銷售 B”和“銷售 A”,顯示它們的價值和百分比變化。 在這種情況下,如何在 Python 中使用 plotly 創建漏斗圖,而無需手動輸入表中的值?
您可以從此處參考https://plotly.com/python/funnel-charts/ 。 對於 Showing % change 您可以修改 textinfo 並從percent initial
、 percent previous
、 percent total
、 value
中選擇任何內容。 textinfo Docs
。
如果您需要一些其他列,您可以將其添加到數據中並使用texttemplate
示例顯示在 plot 中
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()
Output
我試了一下,參考官方參考。 我做了一個圖表比較了兩個國家在同一階段。 被@venky同時回答了,但我敢回答,因為措辭不同。 感謝有機會學習這個。 從 plotly 導入 graph_objects 作為 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.