我正在开发一个 dataviz 项目,我偶然发现了 Last.FM 生成的报告,其中有一个时钟图表来表示按小时记录的分布情况。
有问题的图表是这样的:
这是一个交互式图表,所以我尝试使用 Plotly 库尝试复制图表,但没有成功。
有没有办法在 Plotly 中复制它?这是我需要表示的数据
listeningHour = df.hour.value_counts().rename_axis('hour').reset_index(name='counts') listeningHour hour counts 0 17 16874 1 18 16703 2 16 14741 3 19 14525 4 23 14440 5 22 13455 6 20 13119 7 21 12766 8 14 11605 9 13 11575 10 15 11491 11 0 10220 12 12 7793 13 1 6057 14 9 3774 15 11 3476 16 10 1674 17 8 1626 18 2 1519 19 3 588 20 6 500 21 7 163 22 4 157 23 5 26
Plotly 提供的图表是一个极坐标图。我已经用你的数据编写了一个代码。在我研究的时候,似乎没有办法把蜱虫放在甜甜圈里。代码的要点是在角度轴方向上从 0:00 开始。时钟显示是一个包含 24 个刻度位置的列表,其中包含一个空字符串和每 6 小时一个字符串。角度网格与条形图的中心对齐。
import plotly.graph_objects as go r = df['counts'].tolist() theta = np.arange(7.5,368,15) width = [15]*24 ticktexts = [f'$\large{i}$' if i % 6 == 0 else '' for i in np.arange(24)] fig = go.Figure(go.Barpolar( r=r, theta=theta, width=width, marker_color=df['counts'], marker_colorscale='Blues', marker_line_color="white", marker_line_width=2, opacity=0.8 )) fig.update_layout( template=None, polar=dict( hole=0.4, bgcolor='rgb(223, 223,223)', radialaxis=dict( showticklabels=False, ticks='', linewidth=2, linecolor='white', showgrid=False, ), angularaxis=dict( tickvals=np.arange(0,360,15), ticktext=ticktexts, showline=True, direction='clockwise', period=24, linecolor='white', gridcolor='white', showticklabels=True, ticks='' ) ) ) fig.show()