如何根据现有 "step list" 定义匹配轴槽口
How to define matching axis notches from existing "step list"
我需要一种方法来对齐两个单独轴上的刻度线,同时能够控制 "step" 值(刻度线之间的值),其中两个轴都从标记 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
摘要 "Demands"
- 每个轴需要
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 之间的任何地方 作为最佳点
- 调整后的最大值等于或大于原始最大值,并且位于 "rounded number"(即在我上面的示例中,90 优于 82)
问题(问题)
- 我需要删除大部分猜测并自动生成刻度线。
- 即一开始,我需要更好的方法来获取刻度线的数量,因为我在上面猜到了我想要的刻度线数量,因为我想要一个好的 "step" 值,它可以是类似于 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
我需要一种方法来对齐两个单独轴上的刻度线,同时能够控制 "step" 值(刻度线之间的值),其中两个轴都从标记 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
摘要 "Demands"
- 每个轴需要
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 之间的任何地方 作为最佳点
- 调整后的最大值等于或大于原始最大值,并且位于 "rounded number"(即在我上面的示例中,90 优于 82)
问题(问题)
- 我需要删除大部分猜测并自动生成刻度线。
- 即一开始,我需要更好的方法来获取刻度线的数量,因为我在上面猜到了我想要的刻度线数量,因为我想要一个好的 "step" 值,它可以是类似于 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