问题描述
我有一个包含所有数据的 DataFrame,我有以下阶段顺序
order = {0:'NEW',1:'FOLLOW_UP',2:'Demo',3:'QUOTE',4:'CLOSING'}
fig = px.funnel(df,x='count',y='name',color='source',category_orders=order)
我的 DataFrame 与 Order 字典完全按照所需的 Order 顺序排列,但我的图表一直在使用 QUOTE 和 DEMO 切换位置。
如果使用category_orders实际上没有区别,尝试了一堆字典样式和排列但似乎都不起作用。
https://plotly.com/python-api-reference/generated/plotly.express.funnel.html category_orders (dict with str keys and list of str values (default {})) – 默认情况下,在 Python 3.6+ 中,轴、图例和方面中分类值的顺序取决于这些值在 data_frame 中首次遇到的顺序(并且在 Python 3.6 以下默认情况下不保证顺序)。此参数用于强制对每列的值进行特定排序。这个字典的键应该对应列名,值应该是与所需的特定显示顺序对应的字符串列表。
Here is the DataFrame with the issue at the Bottom with Demo and QUOTE
在此处查看我的漏斗图像 Funnel with wrong order by plotly
解决方法
在我看来,问题是由 Ploty 期望输入数据的外观与您的数据框的外观不同造成的。
漏斗图似乎期望出现在漏斗末端的所有类别都出现在每个前一阶段。您的 Closing
source
不存在 QUOTE
,QUOTE
中缺少您来自 Demo
的值。如果将这两个值相加,顺序应该是正确的。
import plotly.express as px
import pandas as pd
import io
data = '''count name source
0 NEW IG
2 NEW 0
1 NEW GCLID
1 NEW UTM
1 NEW UTM
1 NEW GCLID
1 NEW GLCID
7 NEW UTM
1 NEW GLCID
1 NEW GCLID
2 NEW 123
1 NEW GCLID
1 NEW GCLID
1 NEW FB
1 NEW FBCLID
1 NEW UTM
1 NEW UTM
1 NEW DATA
1 NEW R
1 NEW GCLID
11 NEW FB
1 NEW FB
7 NEW FB
1 NEW FB
1 NEW GCLID
1 NEW GCLID
1 NEW GCLID
1 FOLLOW_UP FB
2 FOLLOW_UP FB
1 FOLLOW_UP 0
1 FOLLOW_UP IG
1 FOLLOW_UP FB
1 FOLLOW_UP FB
1 FOLLOW_UP FB
2 FOLLOW_UP 123
3 DEMO FB
1 QUOTE 123
1 QUOTE 123
2 QUOTE 123
3 CLOSING FB'''.splitlines()
df = pd.read_csv(io.StringIO('\n'.join(data)),sep='\t')
px.funnel(df,x='count',y='name',color='source')
# incorrect order
data.insert(-5,'0\tDEMO\t123')
data.insert(-2,'0\tQUOTE\tFB')
df = pd.read_csv(io.StringIO('\n'.join(data)),color='source')