首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为图表生成标签

为图表生成标签
EN

Stack Overflow用户
提问于 2013-10-31 22:41:59
回答 1查看 71关注 0票数 0

我正在尝试寻找一种算法来为我正在编写的图表引擎生成Y轴,目前正处于拔出头发的阶段。

搜索产生了各种各样的解决方案,但是我很难找到一种适合所有数据范围的解决方案。

这是我到目前为止所得到的:

代码语言:javascript
复制
// Raise the max and lower the min so that we get a prettier looking chart.
var tickRangeMinMax = maxValue - minValue;
var min = tickRangeMinMax * Math.round(minValue / tickRangeMinMax);
var max = tickRangeMinMax * Math.round(1 + (maxValue / tickRangeMinMax));

这给了我一个新的范围,我想为它生成一个Y轴。

代码语言:javascript
复制
var ticks = tickRange(min, max, labelCount);

function tickRange(minVal, maxVal, tickCount) {        
    var range = maxVal - minVal;
    var unRoundedTicksSize = range / (tickCount - 1);
    var x = Math.ceil(log10(unRoundedTicksSize) - 1);
    var pow10X = Math.pow(10, x);
    var roundedTickRange = Math.ceil(unRoundedTicksSize / pow10X) * pow10X;

    return roundedTickRange;
}

我也尝试过使用简单得多的算法来计算节拍:

代码语言:javascript
复制
return (max - min) / labelCount

前一种方法适用于小范围,比如23 -> 200,但是当我得到的范围是0 -> 3000时,这两种方法都不适合我。

我将标签添加到标签集合中,方法是循环遍历labelCount,在本例中为5,然后从前一个标签值中减去刻度范围。我从最大值开始。

EN

回答 1

Stack Overflow用户

发布于 2013-10-31 23:34:56

作为参考,只是在Python中和你的一样(不要说JS):

代码语言:javascript
复制
import math

def ticks (low, high, labels):
        nlabels = len(labels)
        tick = (high - low) / (nlabels - 1)
        x = math.floor(math.log10(tick))
        pow10x = math.pow(10,x)
        tick = int(math.ceil(tick/pow10x)*pow10x)
        return zip (range(low,high+tick,tick), labels)


print (ticks (0, 225, ['a', 'b', 'c', 'd', 'e']))

PS。也许对数上的floor更好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19709512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档