我想以对数刻度绘制Y值,其中值包括负数和正数。这是可能的吗?将min设置为负值没有任何效果,它始终从零开始
tsm1rwdh1#
查看代码,对数刻度将最小值设置为0(最小值和最大值)。https://github.com/chartjs/Chart.js/blob/master/src/scales/scale.logarithmic.js#L85-L96
6rqinv9w2#
我最近遇到了同样的问题,我最初使用的是这个Log 2轴实现,根据这个github issue,他们不打算支持对数轴上的负值。我有自己的想法,但经过一番研究后找不到类似的解决方案,所以我决定制作自己的Log 2Axis版本,它在最新版本v3.9.1中运行得很好(特别是使用参数beginAtZero时)。
beginAtZero
base
[-1,1]
y = x / 2
"log(0) = 0"
-2
Math.sign(v) * Math.log2( Math.abs(v) )
这样,我们就可以在同一个区域中同时获得正值和负值、大值和小值,下面是一个示例:第一个
EDIT我最初的解决方案不适用于[-base,base]之间的值(其中base是以2为底数的对数,以10为底数,等等),但只有经过一些彻底的研究之后,我才能通过修改转换函数最终使其工作,我扩展了转换函数以适用于任何自定义的log函数,而不仅仅是log 2(请阅读下面的内容),下面是log 2版本:
x => Math.sign(x) * Math.log2(x) , for Math.abs(x) >= 2 x => x/2 , for Math.abs(x) <= 2
现在,您只需在options > scales > y中设置“log”参数,而无需触及初始类LogAxis,它将以相同的方式工作,我发现log 2更方便,因为与log 10相比,它对小值具有更高的可见性。为了更好地理解它的工作原理,可以使用online graph maker,其中的滑块帮助可视化区间[-base,base]沿着log函数和“填充”函数y = x / l。
options > scales > y
LogAxis
y = x / l
在连接所有3个部分后,我们得到this function。
为了使中间部分更平滑,可以将getLogVal函数中的y=x/l修改为类似this的内容:
getLogVal
y=x/l
唯一的区别是接近0的值彼此之间会更接近,但重要的是在[-base,base]中只使用单调函数,验证f(0)=0以保持0和值的符号!
f(0)=0
2条答案
按热度按时间tsm1rwdh1#
查看代码,对数刻度将最小值设置为0(最小值和最大值)。
https://github.com/chartjs/Chart.js/blob/master/src/scales/scale.logarithmic.js#L85-L96
6rqinv9w2#
我最近遇到了同样的问题,我最初使用的是这个Log 2轴实现,根据这个github issue,他们不打算支持对数轴上的负值。
我有自己的想法,但经过一番研究后找不到类似的解决方案,所以我决定制作自己的Log 2Axis版本,它在最新版本v3.9.1中运行得很好(特别是使用参数
beginAtZero
时)。base
“2”之间的值将转换为[-1,1]
,以在从log 2转换为y = x / 2
时保持连续性(请阅读下文),因此,Zero将为0(不是"log(0) = 0"
,而是由于使用对数轴主要原因是一起查看大值和小值,受负值的对数限制是没有意义的!)。-2
以下的负值将简单地转换为正值,同时保留它们的符号,如下所示:Math.sign(v) * Math.log2( Math.abs(v) )
这样,我们就可以在同一个区域中同时获得正值和负值、大值和小值,下面是一个示例:
第一个
EDIT我最初的解决方案不适用于[-base,base]之间的值(其中base是以2为底数的对数,以10为底数,等等),但只有经过一些彻底的研究之后,我才能通过修改转换函数最终使其工作,我扩展了转换函数以适用于任何自定义的log函数,而不仅仅是log 2(请阅读下面的内容),下面是log 2版本:
现在,您只需在
options > scales > y
中设置“log”参数,而无需触及初始类LogAxis
,它将以相同的方式工作,我发现log 2更方便,因为与log 10相比,它对小值具有更高的可见性。为了更好地理解它的工作原理,可以使用online graph maker,其中的滑块帮助可视化区间[-base,base]沿着log函数和“填充”函数
y = x / l
。在连接所有3个部分后,我们得到this function。
为了使中间部分更平滑,可以将
getLogVal
函数中的y=x/l
修改为类似this的内容:唯一的区别是接近0的值彼此之间会更接近,但重要的是在[-base,base]中只使用单调函数,验证
f(0)=0
以保持0和值的符号!