图解:修改后的玫瑰图(半径可变的饼图)

问题描述 投票:1回答:1

我有一个名称为df的数据框,其标题为categoriesweight。我的目标是从here中的行数据中绘制一个类似于列出的df(但更大!)之一的图形,其中每种颜色仅属于一行,并且半径与weight值成比例。

samples

我已经多次需要这个grpah(并且我之前已经用LaTeX手动完成过,我想一劳永逸地解决这个问题(这意味着,做一个python脚本来绘制它)]

为什么会阴谋?因为它具有交互式图形,可以让用户操纵数据。

如果运行此示例

import plotly.express as px
df = px.data.wind()
fig = px.bar_polar(df, r="frequency", theta="direction",
                   color="strength", template="plotly_dark",
                   color_discrete_sequence= px.colors.sequential.Plasma_r)
fig.show()

您可以单击图例值(strength),然后触摸的标签将从图形中消失,此功能非常适合我要显示的数据。

实际上,这是我的代码和测试数据:

import pandas as pd
import plotly.graph_objs as go
from random import uniform as unif

df = pd.DataFrame({"categories":"First Height Points Nominal_Value Price Number1 Number2".split(" "),
                   "weight":[unif(0,1) for i in range(7)]})
def rose_chart(df):
    trace = go.Area(
        r = df.weight.values,
        t = df.caegories.values,
        name= 'Peso de las variables de entrada', 
        marker=dict(color='royalblue'),
        opacity=0.5)   

    data = [trace]

    layout = go.Layout(
            title = 'Contribución de cada variable para el clasificador',
        font=dict(
            size=16
            ),
        polar = dict(
            radialaxis = dict(
                visible = True,
                range = [min(df.weight),max(df.weight)], ticksuffix='%', tickangle=0, tickfont=dict(size=13)
            ),
        angularaxis=dict(
            nticks=12
            )
    ))

    fig = go.Figure(data=data, layout=layout)
    fig.show()

rose_chart(df)

并且输出为

image

此输出没有第一个示例那样的交互式行为,也没有正确的大小比例,每列都没有颜色。如何改进此代码?

python python-3.x plotly rose-diagram
1个回答
1
投票

您可以尝试此代码:

import pandas as pd
from random import uniform as uni
import plotly.graph_objects as go
import plotly.express as px
from plotly.graph_objs import Data as Data

df = pd.DataFrame({"etiquetas":["a","b","c","d","e","f"],
                   "pesos":[uni(0.4,1) for i in range(6)]})

def rose_chart1(df):
    traces = []
    df_ = df.pivot(columns = "etiquetas",values="pesos")
    for ind,meta in df_.iterrows():
        trace = {
              "name": meta.index[ind], 
              "r": meta.values, 
              "type": "barpolar", 
              "opacity": 1, 
              "theta": df_.columns.values, 
              "hoverinfo": "r+theta",
              "opacity" : 0.68
              }
        traces.append(trace)
    layout = {
      "font": {
        "size": 16, 
        "family": "Overpass"
      }, 
      "polar": {
        "hole": 0.0, 
        "bargap": 0.05,  ## % del total que no se toma en cada area
        "radialaxis": {
          "visible":True,
          "type": "linear", 
          "title": {"text": "<br>"}, 
          "tickmode": "auto", 
          "tickfont": {"size": 14}, 
          "autorange": True, 
          "gridwidth": 2,  # ancho de las lineas radiales
          "linewidth": 0
        }, 
        "angularaxis": {
          "type": "category", 
          "ticklen": 12, 
          "tickmode":"auto",
          "tickfont": {"color": "rgb(22, 22, 22)"}, 
          "direction": "counterclockwise", 
          "gridwidth": 2, 
          "tickwidth": 1, 
          "tickprefix": ""
        }
      }, 
      "title": {"text": "Contribución en pesos de las variables"}, 
      "xaxis": {
        "range": [-1, 6], 
        "autorange": True
      }, 
      "yaxis": {
        "range": [-1, 4], 
        "autorange": True
      }, 
      "legend": {
        "x": 1, 
        "y": 1, 
        "font": {
          "size": 14, 
          "family": "Roboto"
        }, 
        "title": {
          "font": {
            "size": 16, 
            "color": "rgb(67, 36, 167)", 
            "family": "Overpass"
          }, 
          "text": "Variables"
        }, 
        "xanchor": "auto", 
        "itemsizing": "trace", 
        "traceorder": "normal", 
        "borderwidth": 0, 
        "orientation": "v"
      }, 
      "modebar": {
        "color": "rgba(68, 68, 68, 0.3)", 
        "bgcolor": "rgba(118, 6, 6, 0.5)", 
        "orientation": "h"
      }, 
      "autosize": True, 
      "template": {
        "data": {
          "bar": [
            {
              "type": "bar", 
              "marker": {"colorbar": {
                  "len": 0.2, 
                  "ticks": "inside", 
                  "ticklen": 6, 
                  "tickcolor": "rgb(237,237,237)", 
                  "outlinewidth": 0
                }}
            }
          ], 
          "carpet": [
            {
              "type": "carpet", 
              "aaxis": {
                "gridcolor": "white", 
                "linecolor": "white", 
                "endlinecolor": "rgb(51,51,51)", 
                "minorgridcolor": "white", 
                "startlinecolor": "rgb(51,51,51)"
              }, 
              "baxis": {
                "gridcolor": "white", 
                "linecolor": "white", 
                "endlinecolor": "rgb(51,51,51)", 
                "minorgridcolor": "white", 
                "startlinecolor": "rgb(51,51,51)"
              }
            }
          ], 
        }, 
        "layout": {
          "geo": {
            "bgcolor": "white", 
            "showland": True, 
            "lakecolor": "white", 
            "landcolor": "rgb(237,237,237)", 
            "showlakes": True, 
            "subunitcolor": "white"
          }, 
          "font": {"color": "rgb(51,51,51)","family": "Overpass"}, 
          "polar": {
            "bgcolor": "rgb(237,237,237)", 
            "radialaxis": {
              "ticks": "outside", 
              "showgrid": True, 
              "gridcolor": "white", 
              "linecolor": "white", 
              "tickcolor": "rgb(51,51,51)"
            },
          },   
          "hovermode": "closest", 
          "plot_bgcolor": "rgb(237,237,237)", 
          "paper_bgcolor": "white", 
          "shapedefaults": {
            "line": {"width": 0}, 
            "opacity": 0.3, 
            "fillcolor": "black"}, 
          "annotationdefaults": {
            "arrowhead": 0, 
            "arrowwidth": 1}
        }
      }, 
      "radialaxis": {"ticksuffix": "%"}, 
      "separators": ", ", 
      "orientation": 0
    }    

    data = Data(traces)
    fig = go.Figure(data,layout)
    fig.show()

然后,如果您运行

rose_chart1(df)

您将获得:

output

© www.soinside.com 2019 - 2024. All rights reserved.