ChartJS 图表是否支持对数刻度的负值?

uelo1irk  于 2022-11-06  发布在  Chart.js
关注(0)|答案(2)|浏览(228)

我想以对数刻度绘制Y值,其中值包括负数和正数。
这是可能的吗?将min设置为负值没有任何效果,它始终从零开始

tsm1rwdh

tsm1rwdh1#

查看代码,对数刻度将最小值设置为0(最小值和最大值)。
https://github.com/chartjs/Chart.js/blob/master/src/scales/scale.logarithmic.js#L85-L96

6rqinv9w

6rqinv9w2#

我最近遇到了同样的问题,我最初使用的是这个Log 2轴实现,根据这个github issue,他们不打算支持对数轴上的负值。
我有自己的想法,但经过一番研究后找不到类似的解决方案,所以我决定制作自己的Log 2Axis版本,它在最新版本v3.9.1中运行得很好(特别是使用参数beginAtZero时)。

  • 对于正值〉2〉〉无变化
  • “-2”和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版本:

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

在连接所有3个部分后,我们得到this function

为了使中间部分更平滑,可以将getLogVal函数中的y=x/l修改为类似this的内容:

唯一的区别是接近0的值彼此之间会更接近,但重要的是在[-base,base]中只使用单调函数,验证f(0)=0以保持0和值的符号!

相关问题