Created
July 11, 2012 02:44
-
-
Save Grabber/3087620 to your computer and use it in GitHub Desktop.
HighChart - Best Label Angle
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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