Я прочитал кучу уроков о том, как правильно сгенерировать логарифмическое распределение весов tagcloud. Большинство из них группируют теги по шагам. Это кажется мне несколько глупым, поэтому я разработал свой собственный алгоритм, основанный на том, что я прочитал, чтобы он динамически распределял количество тегов по логартмической кривой между порогом и максимумом. Вот суть этого в Python:
from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, threshold=0, maxsize=1.75, minsize=.75):
countdist = []
# mincount is either the threshold or the minimum if it's over the threshold
mincount = threshold<min(count) and min(count) or threshold
maxcount = max(count)
spread = maxcount - mincount
# the slope of the line (rise over run) between (mincount, minsize) and ( maxcount, maxsize)
delta = (maxsize - minsize) / float(spread)
for c in count:
logcount = log(c - (mincount - 1)) * (spread + 1) / log(spread + 1)
size = delta * logcount - (delta - minsize)
countdist.append({'count': c, 'size': round(size, 3)})
return countdist
По сути, без логарифмического расчета отдельного счета, он будет генерировать прямую линию между точками (mincount, minsize) и (maxcount, maxsize).
Алгоритм хорошо аппроксимирует кривую между двумя точками, но имеет один недостаток. Mincount является особым случаем, и его логарифм дает ноль. Это означает, что размер mincount будет меньше, чем minsize. Я пытался придумать числа, чтобы попытаться раскрыть этот особый случай, но, похоже, не могу понять, что это правильно. В настоящее время я рассматриваю mincount как особый случай и добавляю "or 1
" в строку logcount.
Есть ли более правильный алгоритм для рисования кривой между двумя точками?
Обновление 3 марта : Если я не ошибаюсь, я беру журнал счета и затем включаю его в линейное уравнение. Чтобы поместить описание частного случая другими словами, в y = lnx при x = 1, y = 0. Это то, что происходит на mincount. Но mincount не может быть нулем, тэг не использовался 0 раз.
Попробуйте проверить код и введите свои номера. Я прекрасно отношусь к mincount как к особому случаю, я чувствую, что это будет проще, чем какое-либо реальное решение этой проблемы. Я просто чувствую, что должно быть решением этого вопроса и что кто-то, вероятно, придумал решение.
ОБНОВЛЕНИЕ Апр 6 : простой поиск google приводит ко многим прочитанным мною учебникам, но этот , возможно, является наиболее полным примером ступенчатые облака тегов.
ОБНОВЛЕНИЕ 28 апреля : В ответ на решение antti.huima: при построении графика кривая, которую создает ваш алгоритм, лежит ниже линии между двумя точками. Я пытался совмещать числа вокруг, но все еще не могу найти способ перевернуть эту кривую на другую сторону линии. Я предполагаю, что если бы функция была изменена на некоторую форму логарифма вместо экспоненты, она бы сделала именно то, что мне нужно. Это верно? Если да, может кто-нибудь объяснить, как этого добиться?