Creating the blog tags for this website was a bit tricky because I wasn’t sure how to make the tags have different sizes according to their significance. I started off with 5 spans and ordered the tags in terms of frequency and divided them equally into the spans. However tags are not evenly distributed, so instead I calculated the normalized weight of the tag according to the others, and made the font size a percentage of that.
In the model:
@staticmethod def generateSpans(): counts = session.query(Tag, func.count(Tag.id)).join(blog_tags).group_by(Tag).all() smallest = min(count for (tag, count) in counts) scale = max(count for (tag, count) in counts) - smallest scaled = [] for tag, count in counts: if scale != 0: scaled.append((tag, (count - smallest)/float(scale))) else: scaled.append((tag, 1)) return scaled
In the view:
<p> % for tag, weight in tags: <span style="font-size: ${int(70 + (80 * weight))|h}%"><a href= "${urls.build('tag.entries', dict(tag=tag.link))|h}">${tag.name|h}</a> </span> % endfor </p>
It looks pretty good when there are at least 3 different weightings as you can see to the right.
EDIT in 2021: As you can no longer see the tags as this website has moved to WordPress, a screenshot is here:
