Issue
I have a dataframe with name df
with colmns categories
and weight
. My goal is to do a graph like one of the listed here (but larger!) from the row data in df
, where every color belongs to only one row and the radius is proportional to weight
value.
I've been needing this grpah in several times (and I've done it before with LaTeX, manually) and I want to solve this problem once and for all (It means, do a python script to plot this)
Why Plotly? Because it has interactive graphs which can allow user to manipulate data.
If you run this example
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()
you can click on legend values (strength
) and the label touched will dissapear from graph, and this feature is perfect for the data I want to show.
Actually, this is my code and test data:
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)
and the output is
this output doesnt have interactive behaivor like the first example, also doesnt have correct size proportion, neither color for every column. How to improve this code?
Solution
You can try this code:
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()
then, if you run
rose_chart1(df)
you will get:
Answered By - L F
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.