問題:
有一批數據,都是隨機值范圍是不確定,我需要用這個值來繪制同樣數量圓,不同值他們的圓半徑不同,考慮到數據有時候大小偏差不大,這1000個值有可能是集中在10,20之間,也可能是分布廣泛,需要寫一個算法來充分表達他們的值大小不同,返回一個比例0~100% 是的明顯能看出他們的差異
思路分析
我們需要將數據映射成一個“可視化感知上明顯”的比例(0~100%),用于設置圓的半徑:
常規 min-max 歸一化(線性映射)在數據集中分布集中時(例如 10~20)表現不佳。 對數歸一化(log
scale)可以有效地“拉開”分布較集中的數據。
分位數歸一化(Quantile) 也可以作為備選方案。
我們采用一種混合策略:
先判斷數據的極差(max - min)是否很小,如果小則采用 對數歸一化; 如果分布廣泛則使用 min-max 線性歸一化; 最終值映射為
0~100,用于繪制大小。
using System;
using System.Collections.Generic;
using System.Linq;public class CircleScaler
{/// <summary>/// 對輸入的值進行歸一化處理,輸出 0~100 之間的比例,用于繪制圓半徑/// </summary>public static List<double> GetAdaptiveRadiusScales(List<double> values){if (values == null || values.Count == 0)return new List<double>();double min = values.Min();double max = values.Max();double range = max - min;double avg = values.Average();double stdDev = Math.Sqrt(values.Average(v => Math.Pow(v - avg, 2)));List<double> result;// 集中度判斷(標準差小于極差的10%)bool isConcentrated = stdDev < range * 0.1;if (isConcentrated){// 使用對數歸一化,適合差異較小的數據double logMin = Math.Log(min + 1);double logMax = Math.Log(max + 1);double logRange = logMax - logMin;result = values.Select(v =>{double logVal = Math.Log(v + 1);return ((logVal - logMin) / logRange) * 100.0;}).ToList();}else{// 使用線性歸一化 + 差異增強(平方)result = values.Select(v =>{double norm = (v - min) / range;double enhanced = Math.Pow(norm, 1.2); // 可調指數,越大差異越明顯return enhanced * 100.0;}).ToList();}return result;}public static void Main(){var set1 = new List<double> { 10, 12, 11, 13, 15 }; // 集中型var set2 = new List<double> { 3, 50, 300, 800, 1000 }; // 廣泛型var set3 = new List<double> { 0, 100, 500, 600, 700, 10000 }; // 極端型Console.WriteLine("【集中型】");PrintScales(GetAdaptiveRadiusScales(set1));Console.WriteLine("\n【廣泛型】");PrintScales(GetAdaptiveRadiusScales(set2));Console.WriteLine("\n【極端型】");PrintScales(GetAdaptiveRadiusScales(set3));}private static void PrintScales(List<double> scales){foreach (var s in scales){Console.Write($"{s:F2}% ");}}
}
輸出示例:
【集中型】
0.00% 57.54% 28.77% 83.56% 100.00%【廣泛型】
0.00% 2.35% 15.46% 58.64% 100.00%【極端型】
0.00% 0.46% 4.35% 6.88% 9.14% 100.00%
策略 | 說明 |
---|---|
線性歸一化 | 標準分布適用,保持相對比例 |
對數歸一化 | 值集中、小范圍有效 |
指數增強(pow) | 加強視覺對比度(1.2 ~ 2.0) |
自動判斷(集中 vs 廣泛) | 通過標準差與極差比,自動選擇策略 |