Skip to content

Instantly share code, notes, and snippets.

@Grabber
Created July 11, 2012 02:44
Show Gist options
  • Save Grabber/3087620 to your computer and use it in GitHub Desktop.
Save Grabber/3087620 to your computer and use it in GitHub Desktop.
HighChart - Best Label Angle
from datetime import timedelta
from math import ceil, fabs, acos, sqrt, degrees
import Tkinter as tk
import tkFont
import datetime
import time
from random import randint
def get_chart_segments_from_total_of_days(date_days):
if (date_days <= 31): # format x-axis daily
return date_days
elif (date_days < 217): # format x-axis weekly
return ceil(date_days / 7)
elif (date_days <= 365): # format x-axis as monthly
return ceil(date_days / 31)
def get_string_width_in_pixels(str):
font = tkFont.Font(family="Lucida Grande", size=8)
return (font.measure(str), font.metrics("linespace")) # string width and height in pixels
def calc_vector_module(x, y):
return sqrt(x**2 + y**2)
def get_best_label_angle(date_from, date_to, chart_x_axis_width, chart_x_axis_labels = []):
date_days = timedelta(seconds=(date_to - date_from)).days
chart_x_axis_segments = get_chart_segments_from_total_of_days(date_days)
chart_x_axis_segment_width_in_pixel = chart_x_axis_width / chart_x_axis_segments
label_x_axis_pixel_size = 0
for chart_x_axis_label in chart_x_axis_labels:
chart_label_pixel_size = get_string_width_in_pixels(chart_x_axis_label)
chart_x_axis_label_pixel_size = chart_label_pixel_size[0] # label x-axis lenght
if (chart_x_axis_label_pixel_size > label_x_axis_pixel_size):
label_x_axis_pixel_size = chart_x_axis_label_pixel_size
x_axis_over_segment = (label_x_axis_pixel_size**2) - (chart_x_axis_segment_width_in_pixel**2)
if (x_axis_over_segment <= 0):
return 0.0
(x, y) = (chart_x_axis_segment_width_in_pixel, sqrt(x_axis_over_segment))
scalar_product = chart_x_axis_segment_width_in_pixel**2
angle = degrees(acos(scalar_product/(chart_x_axis_segment_width_in_pixel*calc_vector_module(chart_x_axis_segment_width_in_pixel, x_axis_over_segment))))
return round(angle, 1)
if __name__ == "__main__":
root = tk.Tk()
from_datetime = datetime.datetime.strptime('06-10-2012', '%d-%m-%Y')
from_timestamp = time.mktime(from_datetime.timetuple())
to_datetime = datetime.datetime.strptime('10-10-2012', '%d-%m-%Y')
to_timestamp = time.mktime(to_datetime.timetuple())
chart_labels = []
for x in xrange(1, 2):
day = randint(1, 31)
month = randint(1, 12)
year = randint(2012, 2020)
chart_labels.append('14/1/2020')
print get_best_label_angle(from_timestamp, to_timestamp, 30*4, chart_labels)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment