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)],
}
}
)
我对 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)],
}
}
)