You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:25:23