2012-05-13 5 views
2

2次元の点数を与えたら、対数yスケールで画面上の点をどこに描画するのかを計算するにはどうすればいいですか?ポイントの対数プロット

ポイントのすべてのy値の対数をとって、それらを '通常通り'プロットすることを試みました(プロットポイント[x、log(y)] => on height:height * log(y)/ log (最大))。しかし、このアプローチでは、y値が1未満で問題が発生します。これは私の方法が一般的に正しいアプローチであるかどうか疑問に思う。おそらく、log(y)の代わりにlog(y/min)を使うのもいいでしょう。

改善や改善されたアプローチに関するアドバイスは歓迎します!

+0

1の下のy値で何をしたいですか?あなたはちょうど絶対値を取ることができるので、y軸は1000、100、10、1、0,1,10,100,1000などのようになります。 – Hidde

答えて

2

yの値が肯定的であることを前提とすると、負の値が非常に大きくならないように、小さなバイアスを使用して独自のアプローチを使用してください:height*log(y-min+1)/log(max-min+1)

+0

"-min"定数。これは受け入れられないタスクもあれば、「1」のすべてのダイナミックレンジをシフトしている可能性があります。すべてのグラフデータを保存し、良好な対数変換を受け取ります。 – 23W

2

y/yminを対数プロットすると、最小値を1にスケーリングし、すべての対数値が負でないことを保証します。

+0

バイアスがシフトするのではなく、これが正規化であるため、これはもっと面白いバージョンです。ありがとうございました。 – 23W

0

いくつかの手がかりを提供する可能性があるplotのR実装を確認してください。 plot(x,y,log='y')を使用すると、y軸はログスケールでプロットされます。

ポイントについて< 1については、-ve数値と同じ問題に直面するでしょうか?したがって、基本的に、すべての点が画面上の可視範囲内にあるようにデータを正規化する必要があります。次の変換を使用:

NY = number_of_pixels *(ログ(Y) - 分(対数(Y)))/(MAX(ログ(Y)) - 分(対数(Y)))

+0

この単純なシナリオを考えてみましょう:min(Y)が0に近くても、0.0000001と仮定して、10のようにもう一度maxを小さくすることができます(すべてが基本10であると仮定します)。すべての点。 (正確には、整数への丸めを考慮することによって)。 –

+0

@SaeedAmiri yはログスケールであるので、ログ値を正規化する必要があります。あなたはおおまかにすべてのログ(y)からlog(min(y))を引いてそれをプロットする必要があります。 – ElKamina

+0

ログを減算する必要はありません(min(Y))、OP値の問題(負の値)のように最小値を引いて、1より小さい値をとりminが1よりも小さいので、多くの変更を加えることはできません(例えば私の答えを見てください)。とにかく、私はこの小さな丸めが、おそらく他の多くの情報を失うよりも優れていると思います。 –

0

からあなたはログ(y)をプロットしようとしているようですが、yのようにy軸を保持しているようですね。それは本当に意味をなさない。

あなたがプロットしている方法は問題ありません。ポイントを(x、log(y))にプロットします。

ただし、変更する必要があるのはy軸の制限です。もともとyminからymaxに移行した場合は、log(ymin)からlog(ymax)に移動する必要があります。

y軸の制限を変更すると、その点がうまく収まるようになります。

関連する問題