Share

highchart

  |   Source
In [4]:
import json
from collections import defaultdict
from datetime import datetime
from IPython.display import HTML

data = json.loads(open('data/commit_activity.json').read())
series = defaultdict(int)
for d in data:
    month = datetime.fromtimestamp(d['week']).month
    series[month] += d['total']
In [5]:
HTML('''
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>

<div id="chart" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
<script>
    do_chart = function() {

        $('#chart').highcharts({
            chart: {
                type: 'line',
                marginRight: 130,
                marginBottom: 25
            },
            title: {
                text: 'Last Year of commit activity',
                x: -20
            },
            subtitle: {
                text: 'https://github.com/mitsuhiko/flask',
                x: -20
            },
            xAxis: {
                categories: Highcharts.getOptions().lang.shortMonths
            },
            yAxis: {
                title: {
                    text: 'commits'
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },
            tooltip: {
                valueSuffix: 'number'
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'top',
                x: -10,
                y: 100,
                borderWidth: 0
            },
            series: %s
        });

    }
    setTimeout("do_chart()", 50)
</script>
''' % [{'name': 'flask', 'data': series.values()}])
Out[5]:
In [1]:
import json
from collections import defaultdict
from datetime import datetime

import jinja2
from IPython.html.widgets import interact
from IPython.html import widgets
from IPython.display import display, display_pretty, Javascript, HTML
from IPython.utils.traitlets import Any, Bool, Dict, List, Unicode
In [2]:
%%javascript
require.config({
    paths: {
        chartjs: '//code.highcharts.com/highcharts',
        highcharts: '//code.highcharts.com/modules/exporting',
        sandsignika: '//www.highcharts.com/js/themes/sand-signika',
    },
    shim: {
        highcharts: {
            'deps': ['chartjs', 'sandsignika']
        }
    }
});
In [3]:
def display_chart_highcharts(show_javascript, show, div):
    template = """
    require(["highcharts"], function() {
        $('#chart_highcharts').highcharts({
            chart: {
                type: '{{ chart_type }}'
            },
            title: {
                text: '{{ title }}',
                x: -20 //center
            },
            subtitle: {
                text: 'https://github.com/mitsuhiko/flask',
                x: -20
            },
            xAxis: {
                categories: Highcharts.getOptions().lang.shortMonths
            },
            yAxis: {
                title: {
                    text: '{{ yaxis }}'
                }
            },
            plotOptions: {{ plot }},
            series: {{ series }}
        });
    });
    """
    
    with open('data/{}.json'.format(show.replace('by_', ''))) as f:
        data = json.loads(f.read())
    chart_type = 'line'
    plot = '{}'
    if show == 'by_code_frequency':
        pos_series = defaultdict(int)
        nag_series = defaultdict(int)
        for week, pos, nag in data:
            month = datetime.fromtimestamp(week).month
            pos_series[month] += pos
            nag_series[month] += -nag
        series = [{
                'name': 'additions',
                'data': pos_series.values()
            }, {
                'name': 'deletions ',
                'data': nag_series.values()
            }]
        title = 'Get the number of additions and deletions per week'
        yaxis = 'aggregate of the number'
        chart_type = 'column'
        plot = """{
                column: {
                    pointPadding: 0.2,
                    borderWidth: 0
                }
            }"""
    elif show == 'by_contributors':
        data = sorted(data, key=lambda x: x['total'], reverse=True)[:5]
        series = []
        for i in data:
            name = i['author']['login']
            _series = defaultdict(int)
            for d in i['weeks']:
                month = datetime.fromtimestamp(d['w']).month
                _series[month] += (d['a'] + d['c'] + d['d'])
            series.append({
                'name': name.encode('utf-8'),
                'data': _series.values()
            })
        title = 'Get contributors list with additions, deletions, and commit counts'
        yaxis = 'commit number'
            
    rendered_template = jinja2.Template(template).render(
        title=title, yaxis=yaxis, series=series,
        chart_type=chart_type, plot=plot
    )
    
    if show_javascript:
        display(widgets.PopupWidget(children=(widgets.HTMLWidget(
            value='<div style="width:600px; height: 400px; overflow:scroll;"><pre>{}</pre></div>'.format(rendered_template)),)))
    display(Javascript(rendered_template))

i = interact(
    display_chart_highcharts,
    show_javascript=widgets.CheckboxWidget(value=False),
    show=widgets.DropdownWidget(
        values={'Code frequency':'by_code_frequency', 'Contributors': 'by_contributors'},
        value='by_contributors'
    ),
    div=widgets.HTMLWidget(value='<div id="chart_highcharts"></div>')
)
Share