Plotly Polar Bar Plot - 设置自定义 theta 单位

Plotly Polar Bar Plot - setting custom theta unit

我对 plotly 和尝试制作极坐标条形图相当陌生,其中 theta 值对应于一天中的几个小时。例如:

0°/360° -> 00:00

90° -> 06:00

180° -> 12:00

270° -> 18:00

这是我的代码: 我有一个名为“bins”的 pandas datframe,它记录了那个小时时间段内数据条目的出现:

    index   justtime
0   20  5163
1   21  5007
2   19  4873
3   23  4805
4   0   4587
5   22  4565
6   18  4376
7   1   4101
8   17  4063
9   3   4014
10  2   3972
11  4   3840
12  16  3272
13  5   3239
14  15  2688
15  6   2626
16  7   1988
17  14  1740
18  8   1111
19  13  853
20  9   466
21  12  416
22  10  413
23  11  339

然后我有一些代码来制作绘图:

fig = go.Figure(go.Barpolar(
    r= bins['justtime'],
    theta= [x*15 for x in bins['index']],
    width= [14 for x in bins['index']],
    marker_line_color="black",
    marker_line_width=2,
    opacity=0.8
))

fig.update_layout(
    template=None,
    polar = dict(
        radialaxis = dict(range=[0, bins['justtime'].max()], showticklabels=False, ticks=''),
        angularaxis = dict(showticklabels=True, type='linear', thetaunit='', categoryorder = 'array', categoryarray = [x for x in bins['index']])
    )
)

fig.show()

产生这个:

我不想在圆圈周围的轴标签中显示 theta 度,而是想显示真实的小时时间,即 bins['index']。

我玩过 angularaxis 参数,但无法弄清楚。

我确定它相当简单,但我忽略了它,我们将不胜感激。

  • 已使用 Plotly Express 而不是 图形对象
  • 在数据框中将小时重新表示为度数
  • 包含 hover_data 因此对用户来说更简单
  • 在布局中定义刻度
import pandas as pd
import io
import plotly.express as px

bins = pd.read_csv(io.StringIO("""    index   justtime
0   20  5163
1   21  5007
2   19  4873
3   23  4805
4   0   4587
5   22  4565
6   18  4376
7   1   4101
8   17  4063
9   3   4014
10  2   3972
11  4   3840
12  16  3272
13  5   3239
14  15  2688
15  6   2626
16  7   1988
17  14  1740
18  8   1111
19  13  853
20  9   466
21  12  416
22  10  413
23  11  339"""), sep="\s+")

# add another column which is hour converted to degrees
bins = bins.assign(r=(bins["index"] / 24) * 360)
fig = px.bar_polar(bins, r="justtime", theta="r", hover_data={"Hour":bins["index"]}).update_traces(
    marker={"line": {"width": 2, "color": "black"}}
)

labelevery = 6
fig.update_layout(
    polar={
        "angularaxis": {
            "tickmode": "array",
            "tickvals": list(range(0, 360, 360 // labelevery)),
            "ticktext": [f"{a:02}:00" for a in range(0, 24, 24 // labelevery)],
        }
    }
)