Plotly 雷达图:按级别排列标有字符串的 y 轴

Plotly Radar Chart: arranging y-axis labelled with string by levels

假设我有一个 df:

df = pd.DataFrame({'category': ['Apple', 'Pear', 'Banana', 'Orange', 'Cherry'],
                   'value': [1, 1, 3, 2, 0],
                  'mark': ['Average', 'Average', 'Terrible', 'Bad', 'Good']})

我想做的是通过 Plotly 在雷达图上绘制 df。结果如下所示:

除了这一轮,我将 y 轴或半径替换为字符串,而不是数字。例如:0 是 'good',1 是 'average',2 是 'bad',3 是 'terrible'。然而,一旦我绘制它,订单就会随机化:

如何重新排序 y 轴?

这是我目前使用的代码:

import plotly.express as px
display(px.line_polar(df.sort_values(by= 'category'), theta= 'category', r= 'mark').update_traces(fill='toself'))

使用两种主要技术

  1. mark 视为数据框中的分类。使用有序索引构建极坐标图
  2. 将第 1 步中分配的代码 radialaxis 更新回文本
import pandas as pd
import plotly.express as px

df = pd.DataFrame({'category': ['Apple', 'Pear', 'Banana', 'Orange', 'Cherry'],
                   'value': [1, 1, 3, 2, 0],
                  'mark': ['Average', 'Average', 'Terrible', 'Bad', 'Good']})

# need order of categoricals...
cat = ['Good', 'Average', 'Bad', 'Terrible']

# output radial as an ordered number
df2 = df.assign(mark=pd.Categorical(df["mark"], ordered=True, categories=cat).codes).sort_values(by= 'category')
fig = px.line_polar(df2, theta= 'category', r= 'mark').update_traces(fill='toself')

# change axis back to text
fig.update_layout(polar={"radialaxis":{"tickmode":"array","tickvals":[i for i in range(len(cat))],"ticktext":cat}})

fig

不使用分类

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'category': ['Apple', 'Pear', 'Banana', 'Orange', 'Cherry'],
                   'value': [1, 1, 3, 2, 0],
                  'mark': ['Average', 'Average', 'Terrible', 'Bad', 'Good']})


# output radial as an ordered number
fig = px.line_polar(df.sort_values("category"), theta= 'category', r= 'value').update_traces(fill='toself')

# get mapping of value to mark
df2 = df.loc[:,["value","mark"]].drop_duplicates().sort_values("value")
# change axis to text
fig.update_layout(polar={"radialaxis":{"tickmode":"array","tickvals":df2["value"],"ticktext":df2["mark"]}})

fig