我需要可视化一个数字列表,这个列表每 x 分钟生成一次。我目前使用一条带有数字的单行。这样做是正确的,但是在进行实时分析时会对眼睛产生困扰。
经过一番思考,我想到了给这些数字上色的想法:大的负数为红色,大的正数为绿色,普通的正数为浅绿色,略大于普通数字的数字则介于绿色和浅绿色之间。
我制作了一张图片来说明:
我的问题是:如果我们有:
50: Color.green
0: Color.white
-50: Color.red
我该如何计算代表25的颜色?
我需要可视化一个数字列表,这个列表每 x 分钟生成一次。我目前使用一条带有数字的单行。这样做是正确的,但是在进行实时分析时会对眼睛产生困扰。
经过一番思考,我想到了给这些数字上色的想法:大的负数为红色,大的正数为绿色,普通的正数为浅绿色,略大于普通数字的数字则介于绿色和浅绿色之间。
我制作了一张图片来说明:
我的问题是:如果我们有:
50: Color.green
0: Color.white
-50: Color.red
为了在红、白、绿三者之间实现严格的线性表示,
import java.awt.Color;
/* Define the MAXIMUM saturation of RED and GREEN shades
* Range (0-255)
*/
final int RED_MAX = 255;
final int GREEN_MAX = 255;
/* input val varies from -MAX to MAX */
/* output valColor varies from
* -MAX = red
* ^
* |
* v
* 0 = white
* ^
* |
* v
* MAX = green
*/
/* Normalised normVal varies from -255 to 255 */
normVal = (val*255)/MAX
if(val < 0) {
/* Make it red-ish */
valColor = new Color( RED_MAX,
255 + normVal,
255 + normVal );
} else if (val > 0) {
/* Make it green-ish */
valColor = new Color( 255 - normVal),
GREEN_MAX,
255 - normVal );
} else {
/* Absolute White */
valColor = new Color( 255, 255, 255 );
}
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
public class ColorPicker
{
public static List<Color> chooseDistinguishableColors( int numberOfColors )
{
List<Color> colors = new ArrayList<>();
float gap = 1.0f / (float) ((numberOfColors / 2) + (numberOfColors % 2));
for ( int i = 0; colors.size() < numberOfColors; i++ )
{
float hue = i * gap;
colors.add( new Color( Color.HSBtoRGB( hue, 1.0f, 0.90f ) ) );
colors.add( new Color( Color.HSBtoRGB( hue, 1.0f, 0.65f ) ) );
}
return colors;
}
}
1.8*Math.abs(power-0.5)
。 - Vesper