diff --git a/panoramix/highchart.py b/panoramix/highchart.py deleted file mode 100644 index e2fdd7596a4c4..0000000000000 --- a/panoramix/highchart.py +++ /dev/null @@ -1,230 +0,0 @@ -from collections import defaultdict -import copy -from pandas.io.json import dumps - - -class BaseHighchart(object): - stockchart = False - tooltip_formatter = "" - target_div = 'chart' - - @property - def json(self): - js = dumps(self.chart) - return ( - js.replace('"{{TOOLTIP_FORMATTER}}"', self.tooltip_formatter) - .replace("\n", " ") - ) - - @property - def javascript_cmd(self): - js = self.json - if self.stockchart: - return "new Highcharts.StockChart(%s);" % js - return "new Highcharts.Chart(%s);" % js - - -class Highchart(BaseHighchart): - def __init__( - self, df, - chart_type="spline", - target_div="#chart", - polar=False, - width=None, - height=None, - show_legend=True, - stockchart=False, - title=None, - tooltip=None, - sort_columns=False, - secondary_y=None, - mark_right=False, - compare=False, - stacked=False, - logx=False, - logy=False, - xlim=None, - ylim=None, - sort_legend_y=False, - grid=False, - zoom=None): - self.df = df - self.chart_type = chart_type - self.chart = chart = {} - self.stockchart = stockchart - self.sort_columns = sort_columns - self.secondary_y = secondary_y or [] - self.mark_right = mark_right - self.compare = compare - self.logx = logx - self.logy = logy - self.xlim = xlim - self.ylim = ylim - self.zoom = zoom - self.polar = polar - self.grid = grid - self.stacked = stacked - self.sort_legend_y = sort_legend_y - - chart['chart'] = {} - chart['chart']["type"] = chart_type - chart['chart']['renderTo'] = target_div - - if width: - chart['chart']["width"] = width - if height: - chart['chart']["height"] = height - - chart['chart']['polar'] = polar - - chart["legend"] = { - "enabled": show_legend - } - chart["title"] = {"text": title} - - if tooltip: - chart['tooltip'] = tooltip - if sort_legend_y: - if 'tooltip' not in chart: - chart['tooltip'] = { - #'formatter': "{{TOOLTIP_FORMATTER}}" - } - if self.zoom: - chart["zoomType"] = self.zoom - - self.serialize_series() - self.serialize_xaxis() - self.serialize_yaxis() - - self.chart = chart - - @property - def tooltip_formatter(self): - if self.compare == 'percent': - tf = """ - function() { - var s = '' + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', new Date(this.x))+'
'; - var sortedPoints = this.points.sort(function(a, b){ - return ((a.point.change > b.point.change) ? -1 : ((a.point.change < b.point.change) ? 1 : 0)); - }); - $.each(sortedPoints , function(i, point) { - s += '\u25CF ' + point.series.name + ': ' + f(point.y) + ' (' + Highcharts.numberFormat(point.point.change, 2) + '%)' + '
'; - }); - - return s; - } - """ - else: - tf = """ - function() { - var s = '' + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', new Date(this.x))+'
'; - var sortedPoints = this.points.sort(function(a, b){ - return ((a.y > b.y) ? -1 : ((a.y < b.y) ? 1 : 0)); - }); - $.each(sortedPoints , function(i, point) { - s += '\u25CF ' + point.series.name + ': ' + f(point.y) + '
'; - }); - - return s; - } - """ - return tf - - def serialize_series(self): - df = self.df - chart = self.chart - if self.sort_columns: - df = df.sort_index() - series = df.to_dict('series') - chart["series"] = [] - for name, data in series.items(): - if df[name].dtype.kind not in "biufc": - continue - sec = name in self.secondary_y - d = { - "name": - name if not sec or self.mark_right else name + " (right)", - "yAxis": int(sec), - "data": zip(df.index, data.tolist()) - } - if self.polar: - d['data'] = [v for k, v in d['data']] - if self.compare: - d['compare'] = self.compare # either `value` or `percent` - if self.chart_type in ("area", "column", "bar") and self.stacked: - d["stacking"] = 'normal' - chart["series"].append(d) - - def serialize_xaxis(self): - df = self.df - x_axis = { - 'ordinal': False, - } - if df.index.name: - x_axis["title"] = {"text": df.index.name} - if df.index.dtype.kind in "M": - x_axis["type"] = "datetime" - if df.index.dtype.kind == 'O': - x_axis['categories'] = sorted( - list(df.index)) if self.sort_columns else list(df.index) - if self.grid: - x_axis["gridLineWidth"] = 1 - x_axis["gridLineDashStyle"] = "Dot" - if self.logx: - x_axis["type"] = 'logarithmic' - if self.xlim: - x_axis["min"] = self.xlim[0] - x_axis["max"] = self.xlim[1] - self.chart['xAxis'] = x_axis - - def serialize_yaxis(self): - yAxis = {} - chart = self.chart - if self.grid: - yAxis["gridLineWidth"] = 1 - yAxis["gridLineDashStyle"] = "Dot" - if self.logy: - yAxis["type"] = 'logarithmic' - if self.ylim: - yAxis["min"] = self.ylim[0] - yAxis["max"] = self.ylim[1] - chart["yAxis"] = [yAxis] - if self.secondary_y: - yAxis2 = copy.deepcopy(yAxis) - yAxis2["opposite"] = True - chart["yAxis"].append(yAxis2) - - -class HighchartBubble(BaseHighchart): - def __init__(self, df, target_div=None, height=None): - self.df = df - self.chart = { - 'chart': { - 'type': 'bubble', - 'zoomType': 'xy' - }, - 'title': {'text': None}, - 'plotOptions': { - 'bubble': { - 'tooltip': { - 'headerFormat': '{series.name}
', - 'pointFormat': '{point.name}: {point.x}, {point.y}, {point.z}' - } - } - }, - } - chart = self.chart - chart['series'] = self.series() - chart['chart']['renderTo'] = target_div - if height: - chart['chart']["height"] = height - - def series(self): - df = self.df - series = defaultdict(list) - for row in df.to_dict(orient='records'): - series[row['group']].append(row) - l = [] - for k, v in series.items(): - l.append({'data': v, 'name': k}) - return l