0

float 値を色に変換する関数を作成しようとしています。シンプルな線形スケールを作成しました:

float value;
float maxValue;

float scaleStep = maxValue / 5;

if (value < scaleStep) {
    color = blue
}

if (value > scaleStep && value <= scaleStep * 2) {
    color = green
}

if (value > scaleStep * 2 && value <= scaleStep * 3) {
    color = yellow
}

if (value > scaleStep * 3 && value <= scaleStep * 4) {
    color = orange
}

if (value > scaleStep * 4 && value <= scaleStep * 5) {
    color = red
}

しかし、私が表現しようとしているセットの値のほとんど (すべてではない) は、1 つの特定の値に近接しているため、線形スケールを使用したグラフィカル表現はあまり役に立ちません (ほとんどすべてが 1 つの色に変換されます)。

値の違いがより明確になるように非線形スケールを作成するにはどうすればよいですか?

4

5 に答える 5

2

補間はあなたが望むものです。内挿は、データセット内の既知のサンプル間のサンプルを生成します。

ここで、既知のサンプルはあなたの色です。青、緑、黄、オレンジ、赤。これらの既知の色の間の色は、探しているものです。

補間関数の優れたビジュアライザーへのリンクを次に示します。

便宜上、いくつかの補間関数を次に示します。それらと遊んで、あなたに最適なものを見つけてください!

public float linearInterpolation(float start, float end, float normalizedValue) {
    return start + (end - start) * normalizedValue;
}

public float sinInterpolation(float start, float end, float normalizedValue){
    return (start+(end-start)* (1 - Math.cos(normalizedValue * Math.PI)) / 2;
}

//usage
linearInterpolation(red, green, .5f);//halfway between red and green.
//same with other demonstrations.

編集:

ここで、start と end は、開始サンプルと終了サンプルを指します。normalizedValue は、[0, 1] の両端を含む値です (つまり、正確に 0 または 1、または 0 と 1 の間の任意の値に等しくなる可能性があります。これが、この用語normalizedが通常意味することです)。

したがって、あなたにとってstartendは 2 つの色になりnormalizedValue、開始色または終了色にどれだけ近いかを表します。

たとえば、linearInterpolation を取り上げます。

red = 1;
green = 2;
float midway = 1 + (2 - 1) * .5;
//midway = 1.5, which is halfway between red and green.
float allRed = 1 + (2 - 1) * 0;
//allRed = 1, which is the value of red (or start)
float allGreen = 1 + (2 - 1) * 1;
//allGreen = 2, which is the value of green (or end)

したがって、線形補間の場合、normalizedValueが 1 に近づくほど、返される値が に近づきますend。0 に近いnormalizedValueほど、戻り値は に近くなりますstart

これは、他の補間関数には必ずしも当てはまりません。線形補間は、値を接続する単純な線分と考えることができます。これらのセグメントの中間の値が必要ですか? 正規化された 0.5 の値を使用してください。ビオラです!

他の関数は勾配が急であったり、 と の間で振動したりする場合がstartありendます。

色の観点から考えるのをやめて、もっと抽象的に考えてみてください。色は一定の距離離れています。補間は、それらの間の距離にある値を定義するのに役立ちます。

于 2013-08-10T22:06:47.650 に答える
0

あなたの場合の2番目の選択肢(数色だけを使用したいので比較的単純です)はscaleStep、異なる「幅」の s を使用することです。

if( value < greenMin ) color= blue ;
else if( value < yellowMin ) color= green ;
else if( value < orangeMin ) color= yellow ;
else if( value < redMin ) color = orange ;
else color= red ;

私はコードを少し凝縮する自由を取りました。不明な場合はお知らせください。もちろん、greenMin、yellowMin、orangeMin、および redMin の値を決定する必要があります。そのためには、大きな代表的なデータ サンプルを取得して並べ替え、同じサイズの 5 つのグループに分けます。2 番目のグループの最初の値は greenMin、3 番目のグループの最初の値は yellowMin などです。これは 1 回限りの作業であるため、Office スプレッドシート プログラムを使用してこれを行うことができます。

于 2013-08-10T23:10:21.363 に答える
0

対数スケールをお勧めします。基数 10 のログを使用する場合、範囲は -39 から +39 になります。

于 2013-08-10T22:06:20.680 に答える