如何让Plotly极坐标条形图的区块面积与数据值成比例?
解决方案:让Plotly极坐标条形图面积与数据值成比例
问题根源在于极坐标条形的面积是环形区域,面积计算公式为 π(r外² - r内²)。相同的r增量(比如0.1),外圈的平方差远大于内圈,导致面积增幅差异巨大。要实现面积与数据值线性相关,需要将原始r值转换为平方根尺度*——因为面积与r的平方成正比,转换后数据的线性变化会对应面积的线性变化。
具体步骤:
- 对原始频率值取平方根,生成缩放后的径向坐标值
- 替换绘图时的
r参数为缩放后的值 - 调整径向轴刻度,让显示的刻度文本保持原始频率值(而非平方根值)
修改后的完整代码:
import numpy as np import pandas as pd import plotly.express as px df = px.data.wind() df_test = df[df["strength"]=='0-1'] df_test_sectors = pd.DataFrame(columns=df_test.columns) for direction, df_direction in df_test.groupby('direction'): frequency_stop = df_direction['frequency'].tolist()[0] frequencies = np.arange(0.1, frequency_stop+0.1, 0.1) df_sector = pd.DataFrame({ 'direction': [direction]*len(frequencies), 'strength': ['0-1']*len(frequencies), 'frequency': frequencies }) df_test_sectors = pd.concat([df_test_sectors, df_sector]) df_test_sectors = df_test_sectors.reset_index(drop=True) df_test_sectors['direction'] = pd.Categorical( df_test_sectors['direction'], df_test.direction.tolist() ) df_test_sectors['frequency'] = df_test_sectors['frequency'].astype(float) df_test_sectors = df_test_sectors.sort_values(['direction', 'frequency']) # 计算缩放后的径向值,用平方根转换 df_test_sectors['r_scaled'] = np.sqrt(df_test_sectors['frequency']) fig = px.bar_polar(df_test_sectors, r='r_scaled', theta='direction', color='frequency', color_continuous_scale='YlGn') # 调整径向轴刻度,显示原始频率值 max_freq = df_test_sectors['frequency'].max() tick_vals = np.sqrt(np.arange(0.1, max_freq+0.1, 0.1)) tick_text = [f"{val:.1f}" for val in np.arange(0.1, max_freq+0.1, 0.1)] fig.update_layout( polar=dict( radialaxis=dict( tickvals=tick_vals, ticktext=tick_text ) ) ) fig.show()
效果说明:
转换后,每个0.1频率增量对应的区块面积均为0.1π(恒定值),完全实现了面积与数据值的比例对应,内圈的小增量区块也会清晰可见。
内容的提问来源于stack exchange,提问作者User981636
相关产品推荐
相关产品推荐

