2012-05-13 31 views
2

我想知道是否给出了许多二维点,如何计算在对数y尺度上在屏幕上绘制点的位置?点的对数绘图

我试图取对数的所有y值的点,并比'平常'(绘图点[x,log(y)] =>在高度上绘制它们:height * log(y)/ log (最大值))。但是这种方法会导致y值小于1的问题。所以这让我怀疑我的方法总的来说是否是正确的方法。我可能会使用的一个调整是使用日志(y/min)而不是log(y)。

欢迎任何有关改进或更好方法的建议!

+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

查看可能为您提供一些线索的情节的R实现。如果您使用plot(x,y,log='y'),则y轴以对数刻度绘制。

关于积分< 1,您将面临同样的问题 - -ve数字,对不对?所以基本上你需要对数据进行标准化,使得所有的点都在屏幕的可见范围内。使用下面的变换:

NY = number_of_pixels *(日志(Y) - 分钟(日志(Y)))/(最大(日志(Y)) - 分钟(日志(Y)))

+0

假设这个简单的场景:min(Y)可能接近于零,假设为0.0000001,max也可能很小,如10(假设所有事情都以10为底),那么对于这种状态,您的方法会导致“number_of_pixels”所有点。 (可能正好,考虑四舍五入到整数)。 –

+0

@SaeedAmiri由于在日志范围内,您必须对日志值进行标准化。您需要从每个日志(y)中粗略减去log(min(y))并绘制它。 – ElKamina

+0

不需要减去log(min(Y)),你可以减去最小值,正如OPs问题(负值)所示,他有一些小于'1'的值,所以min小于'1',所以这个减法不会不会做出很多改变(例如,看我的答案)。无论如何,我认为这个小小的舍入要比可能丢失那么多其他信息要好。 –

0

从我的理解是,你似乎试图绘制日志(y),但保持y轴与y轴一样?这并没有什么意义。

你绘图的方式很好:你在(x,log(y))上绘制一个点。

但你需要改变的是y轴的极限。如果它最初从ymin到ymax,现在需要从log(ymin)到log(ymax)。

如果你改变y轴的限制,那么这些点就可以适应了。