我需要一种方法来对齐两个单独轴上的刻度线,同时能够控制“步长”值(刻度线之间的值),其中两个轴从标记 0 开始并以不同的最大值结束。
为什么会出现这个问题:
Flot,JS 图表包有一个对齐刻度线的选项,但是当我这样做时,我无法控制步长值。然而,我可以直接控制步长值,但随后我就失去了对齐刻度线的能力。不过,我可以恢复定义自己的最大值和步长值,以获得我需要的内容(对齐刻度线,同时保持所需的步长值),但我需要一些帮助。产生这个问题(继续阅读以了解详细信息)。
示例
设a为A轴上的最大值,b为B轴上的最大值。
在此示例中,设 a = 30,b = 82。 假设我想要 6 个刻度线(不计算轴末端的额外刻度线)。事实上,在尝试了几次之后我猜是 6。
一旦我有了所需数量的刻度线,我就可以这样做:
- 30/6 = 5(我只是选择 A 轴所需的步长值)
- 现在需要计算 B 轴的刻度对齐
- 82/6 = 13.67(不是一个好的值,我更喜欢更圆润的东西)
- 将 B 的最大值移动到 90 ,其中 90/6 = 15 (很好 - 我刚刚获得了 B 轴所需的步长值)
最终结果
输入:
- a_max = 30,b_max = 82
- (实际上 a_max 可能是 28.5、29.42,b_max 可能是 84、85.345 等)
输出:
- a_adjusted_max = 30,b_adjusted_max = 90,
- a_step = 5,b_step = 15
- 刻度数= 6(如果计数结束则+1)
视觉:
|---------|---------|---------|---------|---------|---------> A
0 5 10 15 20 25 30
|---------|---------|---------|---------|---------|---------> B
0 15 30 45 60 75 90
“要求”摘要
- 需要
step value
每个轴为 1、2、5、10、15、20、25、50、100 之一(示例中 A 为 5,B 为 15) - 需要
adjusted max value
每个轴(示例中 A 为 30,B 为 90) - 需要刻度数
match
对于两个轴 - (可选)刻度数是灵活的,但应在 4 到 12 之间作为最佳点
- 调整后的最大值等于或大于原始最大值,并且位于“四舍五入数字”处(即,如上面的示例所示,90 优于 82)
问题(问题)
- 我需要消除大部分猜测并自动生成刻度线。
- 即首先,我需要更好的方法来获取刻度线数量,因为我猜测了上面我想要的刻度线数量,因为我想要一个好的“步长”值,可以是 1, 2 , 5, 10, 15, 20, 25, 50, 100。最大值从 4 开始,最高可达 100。在极少数情况下最高可达 500。大多数情况下,最大值保持在 30-90 之间。<
我该怎么做?
最佳答案
这是我想出的一个程序。我假设您只想要整数。
- 选择 4 到 12 之间的刻度数
- 使用此刻度数计算 A 和 B 轴所需的步数
- 使用这些步长值找出我们必须将轴 A 和轴 B 延伸多少;将这些数字相加并记住结果
- 从头开始重复下一个刻度值
- 我们选择给出最低分数的刻度数;如果平局,我们选择较小的刻度数
以下是一些示例结果:
a=30, b=82
给出 4 个刻度
0 10 20 30
0 28 56 84
a=8, b=5
给出 6 个刻度
0 2 4 6 8 10
0 1 2 3 4 5
这是伪代码:
a = range of A axis
b = range of B axis
tickList[] = {4,5,6,7,8,9,10,11,12}
// calculate the scores for each number of ticks
for i from 0 to length(tickList)-1
ticks = tickList[i]
// find the number of steps we would use for this number of ticks
Astep = ceiling(a/(ticks-1))
Bstep = ceiling(b/(ticks-1))
// how much we would need to extend the A axis
if (a%Astep != 0)
Aextend[i] = Astep - a%Astep
else
Aextend[i] = 0
end
// how much we would need to extend the B axis
if (b%Bstep != 0)
Bextend[i] = Bstep - b%Bstep
else
Bextend[i] = 0
end
// the score is the total extending we would need to do
score[i] = Aextend[i] + Bextend[i]
end
// find the number of ticks that minimizes the score
bestIdx = 0
bestScore = 1000;
for i from 0 to length(tickList);
if (score[i] < bestScore)
bestIdx = i
bestScore = score[i]
end
end
bestTick = tickList[bestIdx]
bestAstep = ceiling(a/(bestTick-1))
bestBstep = ceiling(b/(bestTick-1))
A 轴从 0
经 bestAstep
到 bestAstep*bestTick
B 轴从 0
经 bestBstep
到 bestBstep*bestTick
关于algorithm - 如何从现有的 "step list"定义匹配轴槽口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285412/