gpt4 book ai didi

图上 "nice"网格线间隔的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:24 24 4
gpt4 key购买 nike

我需要一个相当聪明的算法来为图形(图表)设计出“漂亮”的网格线。

例如,假设一个条形图的值为 10、30、72 和 60。您知道:

最小值:10最大值:72范围:62

第一个问题是:你从什么开始?在这种情况下,0 将是直观的值,但这不会支持其他数据集,所以我猜测:

网格最小值应为 0 或低于范围内数据最小值的“合适”值。或者,可以指定它。

网格最大值应该是范围内最大值之上的“不错”值。或者,可以指定它(例如,如果您要显示百分比,则可能需要 0 到 100,而不考虑实际值)。

范围内的网格线(刻度)数量应指定或给定范围内的数字(例如 3-8),以便值“不错”(即整数)并且您可以最大限度地利用图表区。在我们的示例中,80 是一个合理的最大值,因为它会使用 90% 的图表高度 (72/80),而 100 会造成更多空间浪费。

有人知道一个好的算法吗?语言无关紧要,因为我会根据需要实现它。

最佳答案

我用一种蛮力方法完成了这项工作。首先,计算出您可以放入该空间的最大刻度线数。将值的总范围除以刻度数;这是刻度线的最小间距。现在计算以 10 为底的对数底数以获得刻度的大小,并除以该值。您最终应该得到 1 到 10 范围内的值。只需选择大于或等于该值的整数并将其乘以之前计算的对数即可。这是您的最终刻度间距。

Python 示例:

import math

def BestTick(largest, mostticks):
minimum = largest / mostticks
magnitude = 10 ** math.floor(math.log(minimum, 10))
residual = minimum / magnitude
if residual > 5:
tick = 10 * magnitude
elif residual > 2:
tick = 5 * magnitude
elif residual > 1:
tick = 2 * magnitude
else:
tick = magnitude
return tick

编辑:您可以自由更改“nice”间隔的选择。一位评论者似乎对提供的选择不满意,因为实际的刻度数最多可能比最大值少 2.5 倍。这里有一个轻微的修改,它为 nice 间隔定义了一个表。在示例中,我扩大了选择范围,以便刻度数不会少于最大值的 3/5。

import bisect

def BestTick2(largest, mostticks):
minimum = largest / mostticks
magnitude = 10 ** math.floor(math.log(minimum, 10))
residual = minimum / magnitude
# this table must begin with 1 and end with 10
table = [1, 1.5, 2, 3, 5, 7, 10]
tick = table[bisect.bisect_right(table, residual)] if residual < 10 else 10
return tick * magnitude

关于图上 "nice"网格线间隔的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/361681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com