From fb70570cfbb4c82eacc3319736a311a6f6e5b7c9 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Fri, 3 Feb 2012 14:53:40 +0100 Subject: [PATCH] Better range calc --- pygal/css/graph.css | 17 +++++++++++++---- pygal/line.py | 26 ++++++++++++++------------ pygal/test/test_line.py | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/pygal/css/graph.css b/pygal/css/graph.css index bfb1cef..830dceb 100644 --- a/pygal/css/graph.css +++ b/pygal/css/graph.css @@ -1,3 +1,9 @@ +svg * { + -webkit-transition: 250ms; + -moz-transition: 250ms; + transition: 250ms; +} + .graph > .background { fill: black; } @@ -7,7 +13,7 @@ } .graph { - fill: #777; + fill: #999; } .title { @@ -51,14 +57,16 @@ } .axis.x .guide.line { - stroke: none; + opacity: 0; } .axis .guides:hover .guide.line { stroke: #aaa; + opacity: 1; } .axis .guides:hover text { + opacity: 1; fill: #aaa; } @@ -68,15 +76,16 @@ } .series .dots .dot text { + opacity: 0; font-size: 10px; text-anchor: middle; alignment-baseline: baseline; stroke: none; - fill: none; + fill: #ccc; } .series .dots .dot:hover text { - fill: #ccc; + opacity: 1; } .series .line { diff --git a/pygal/line.py b/pygal/line.py index 03deeae..f08a1ff 100644 --- a/pygal/line.py +++ b/pygal/line.py @@ -6,11 +6,12 @@ from pygal.base import BaseGraph class Line(BaseGraph): """Line graph""" - def __init__(self, width, height): + def __init__(self, width, height, scale_int=False): self.width = width self.height = height self.svg = Svg(width, height) self.label_font_size = 12 + self.scale_int = scale_int self.series = [] self.x_labels = self.title = None @@ -18,17 +19,13 @@ class Line(BaseGraph): self.series.append( Serie(title, values)) - def set_labels(self, labels): - values = float(len(labels) - 1) - self.x_labels = [Label(label, i / values) - for i, label in enumerate(labels)] - def y_labels(self, ymin, ymax): step = (ymax - ymin) / 20. label = ymin labels = [] while label < ymax: - labels.append(Label(str(label), label)) + lbl = int(label) if self.scale_int else label + labels.append(Label(str(lbl), lbl)) label += step return labels @@ -41,16 +38,20 @@ class Line(BaseGraph): def draw(self): self.validate() - + x_step = len(self.series[0].values) + x_pos = [x / float(x_step - 1) for x in range(x_step)] vals = [val for serie in self.series for val in serie.values] margin = Margin(*(4 * [10])) ymin, ymax = min(vals), max(vals) - x_labels = self.x_labels + if self.x_labels: + x_labels = [Label(label, x_pos[i]) + for i, label in enumerate(self.x_labels)] y_labels = self.y_labels(ymin, ymax) series_labels = [serie.title for serie in self.series] margin.left += 10 + max( map(len, [l.label for l in y_labels])) * 0.6 * self.label_font_size - margin.bottom += 10 + self.label_font_size + if self.x_labels: + margin.bottom += 10 + self.label_font_size margin.right += 20 + max( map(len, series_labels)) * 0.6 * self.label_font_size margin.top += 10 + self.label_font_size @@ -58,12 +59,13 @@ class Line(BaseGraph): # Actual drawing self.svg.set_view(margin, ymin, ymax) self.svg.graph(margin) - self.svg.x_axis(x_labels) + if self.x_labels: + self.svg.x_axis(x_labels) self.svg.y_axis(y_labels) self.svg.legend(margin, series_labels) self.svg.title(margin, self.title) for serie_index, serie in enumerate(self.series): serie_node = self.svg.serie(serie_index) self.svg.line(serie_node, [ - (x_labels[i].pos, v) + (x_pos[i], v) for i, v in enumerate(serie.values)]) diff --git a/pygal/test/test_line.py b/pygal/test/test_line.py index 9fe49fe..f0adc71 100644 --- a/pygal/test/test_line.py +++ b/pygal/test/test_line.py @@ -7,6 +7,6 @@ def test_simple_line(): line.add('test1', [cos(x / 10.) for x in range(-30, 30, 5)]) line.add('test2', [sin(x / 10.) for x in range(-30, 30, 5)]) line.add('test3', [cos(x / 10.) - sin(x / 10.) for x in range(-30, 30, 5)]) - line.set_labels(map(str, range(-30, 30, 5))) + line.x_labels = map(str, range(-30, 30, 5)) line.title = "cos sin and cos - sin" line._in_browser()