You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求计算排序数组元素对应y值的公式,用于绘制y值与均值距离成反比的柱状图(0<y<1)

求计算排序数组元素对应y值的公式,用于绘制y值与均值距离成反比的柱状图(0<y<1)

嗨,我完全懂你的需求——就是想做一个柱状图,让离均值越近的柱子越高,而且高度控制在0到1之间,对吧?这其实是个挺常见的可视化需求,不需要复杂的统计知识,用几个简单的公式就能实现,我给你拆解一下:

首先,我们先把基础数值算出来:

  1. 先算出排序数组的均值μ:把所有数加起来除以总数,比如你给的例子[1,2,3,5,5,7,11],均值就是(1+2+3+5+5+7+11)/7 ≈4.857
  2. 对每个元素,计算它到均值的绝对距离d_id_i = |x_i - μ|,比如例子里的1,距离就是|1-4.857|≈3.857,11的距离是|11-4.857|≈6.143
  3. 找到所有距离里的最大值D_max:这个值是把y值归一到0-1区间的关键,例子里D_max就是11对应的≈6.143

接下来就是核心的映射公式了,你可以根据想要的视觉效果选择:

1. 线性映射(最直观,变化均匀)

这个公式会让y值和距离成严格的反比线性关系,离均值最远的元素y直接为0,最近的(如果有元素等于均值)y为1:

y_i = 1 - (d_i / D_max)

用你的例子计算:

  • 1的y≈1 - 3.857/6.143≈0.37
  • 2的y≈1 - 2.857/6.143≈0.54
  • 3的y≈1 - 1.857/6.143≈0.70
  • 5的y≈1 - 0.143/6.143≈0.98
  • 7的y≈1 - 2.143/6.143≈0.65
  • 11的y=0

这个结果和你给的示例y值接近,但如果你想要“距离差大的,y值差也更大”的效果(比如你说的f-e的高度差大于b-c),可以用非线性公式。

2. 幂次非线性映射(强化距离带来的高度差异)

通过给距离的比值加一个指数k(k>1),可以让远的元素y值下降得更快,放大距离带来的高度差:

y_i = 1 - (d_i / D_max)^k

比如取k=2,计算例子里的7:
(2.143/6.143)²≈0.12,所以y≈1 - 0.12≈0.88;如果想要更极端的差异,把k调大到3,7的y≈1 - 0.042≈0.958。要是想让y值下降得更猛,也可以尝试k<1的情况,不过一般k>1更符合“远的柱子降得快”的需求。

3. 指数衰减映射(平滑的非线性变化)

这个公式会让y值随着距离增大平滑下降,而且可以通过调整k来控制下降的快慢:

y_i = exp(-k * d_i / D_max)

比如取k=2,计算例子里的7:
d_i/D_max≈0.349exp(-2*0.349)=exp(-0.698)≈0.49,再微调k到2.1,就能得到接近你示例里的0.45的y值。

另外,你提到的相同元素(比如例子里的两个5),它们的距离d_i相同,所以不管用哪个公式,y值都会一样,完全符合你要的效果。

总结一下,你可以先试试线性映射,要是觉得高度差异不够明显,就换成幂次或者指数的版本,调整参数k直到得到你想要的视觉效果就行。

备注:内容来源于stack exchange,提问作者TomLV

火山引擎 最新活动