我有一个名称为df
的数据框,其中包含colmns categories
和weight
。我的目标是从df
的行数据中绘制一个类似于列出的here(但更大!)之一的图形,其中每种颜色仅属于一行,并且半径与{{1 }}值。
我已经多次需要这个grpah(并且之前我已经使用LaTeX手动完成过),并且我想一劳永逸地解决此问题(这意味着,请执行python脚本来绘制此图形)< / p>
为什么会阴谋?因为它具有交互式图形,可以让用户操纵数据。
如果运行此示例
weight
您可以单击图例值(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
,输出为
此输出没有第一个示例那样的交互式行为,也没有正确的大小比例,每列都没有颜色。 如何改进此代码?
答案 0 :(得分: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)
您将获得: