【问题标题】:Plotly Radar Chart: arranging y-axis labelled with string by levelsPlotly 雷达图:按级别排列用字符串标记的 y 轴
【发布时间】:2021-10-22 11:37:58
【问题描述】:

假设我有一个 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 是“好”,1 是“一般”,2 是“差”,& 3 是“糟糕”。然而,一旦我绘制它,订单是随机的:

如何重新排序 y 轴?

这是我目前使用的代码:

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

【问题讨论】:

    标签: python charts plotly radar-chart


    【解决方案1】:

    使用两种主要技术

    1. ma​​rk 视为数据框中的分类。使用有序索引构建极坐标图
    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2023-03-12
      相关资源
      最近更新 更多