def genBoxPlot(plotTitle, srcPath, svgName, plotStartDate):
    dirs = os.listdir(srcPath)

    dictHoursWeekday = {0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],\
                   10:[],11:[],12:[],13:[],14:[],15:[],16:[],17:[],18:[],19:[],\
                   20:[],21:[],22:[],23:[]}

    dictHoursWeekend = {0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],\
                   10:[],11:[],12:[],13:[],14:[],15:[],16:[],17:[],18:[],19:[],\
                   20:[],21:[],22:[],23:[]}

    filterPath = srcPath + 'filter.txt'
    filterList = open(filterPath, 'r').read().split('\n')

    for file in dirs:
        if file.endswith('.pcap'):
            if (file not in filterList) and (datetime.datetime.strptime(
                    file[0:10], '%Y-%m-%d').date() >= plotStartDate):
                #print file + ',',
                #print file[0:10] + ',',
                #print datetime.datetime.strptime(file[0:10], '%Y-%m-%d').strftime('%a') + ',',
                #print file[15:17] + ',',
                statinfo = os.stat(srcPath + file)
                #print '{}{}'.format(statinfo.st_size, ','),
                #print float(statinfo.st_size)/1073741824
                if datetime.datetime.strptime(file[0:10], '%Y-%m-%d').strftime('%a') != 'Sat'\
                    and datetime.datetime.strptime(file[0:10], '%Y-%m-%d').strftime('%a') != 'Sun':
                    dictHoursWeekday[int(file[15:17])].append(
                        float(statinfo.st_size) / 1073741824)
                else:
                    dictHoursWeekend[int(file[15:17])].append(
                        float(statinfo.st_size) / 1073741824)
            #else:
            #print 'file in list'

    print plotTitle

    box_plot = pygal.Box(config,
                         style=custom_style,
                         title='Weekday ' + plotTitle)
    for hr in sorted(dictHoursWeekday):
        print hr,
        box_plot.add(hr, dictHoursWeekday[hr])
    box_plot.render_to_file('/mnt/sniffs/www/Network/' + svgName +
                            'Weekday.svg')
    print

    box_plot = pygal.Box(config,
                         style=custom_style,
                         title='Weekend ' + plotTitle)
    for hr in sorted(dictHoursWeekend):
        print hr,
        box_plot.add(hr, dictHoursWeekend[hr])
    box_plot.render_to_file('/mnt/sniffs/www/Network/' + svgName +
                            'Weekend.svg')
    print

    return
def candlesGraph(candles):

    box_plot = pygal.Box(show_legend=False, style=darken_style)
    box_plot.title = '1-Month Candlestick Graph (USD)'

    # [::-1] to reverse date order
    count = 0
    for row in candles[-31:-1]:
        box_plot.add(row['timestamp'][0:10], [
            float(row['low']),
            float(row['high']),
            float(row['open']),
            float(row['close'])
        ])
        count += 1
        if count == 30:
            break

    box_plot.render()

    path = os.path.abspath(os.path.dirname(__file__)) + '/static/images/'
    filename = 'candles.svg'
    url = path + filename
    box_plot.render_to_file(url)

    return box_plot
Beispiel #3
0
def generate_box_chart_security(libraries):
    box_chart = pygal.Box(range=(0, 1),
                          title='Percentage Of Total Security Related Issues',
                          x_title='Total Security Issues',
                          y_title='Percentage',
                          x_label_rotation=-45,
                          style=invis_style)

    count = 0
    unsorted_list = []
    for library in libraries:
        for issue in library.issue_data:
            if issue.security_issue == 'Yes':
                count += 1
        unsorted_list.append(
            (count / len(library.issue_data), library.name, count))
        count = 0

    sorted_list = sorted(unsorted_list,
                         key=lambda library: library[0],
                         reverse=False)

    labels = []
    for library in sorted_list:
        box_chart.add(library[1], library[0])
        labels.append(library[1] + ': ' + str(library[2]))

    box_chart.x_labels = labels
    return box_chart
Beispiel #4
0
def graph():
    _charts = [
        pygal.Line(),
        pygal.Bar(),
        pygal.Histogram(),
        pygal.XY(),
        pygal.Pie(),
        pygal.Radar(),
        pygal.Box(),
        pygal.Dot(),
        pygal.Funnel(),
        pygal.SolidGauge(),
        pygal.Gauge(),
        pygal.Pyramid(),
        pygal.Treemap()
    ]
    charts = []
    for chart in _charts:
        chart.title = '% Change Coolness of programming languages over time.'
        chart.x_labels = ['2011', '2012', '2013', '2014', '2015', '2016']
        chart.add('Python', [15, 31, 89, 200, 356, 900])
        chart.add('Java', [15, 45, 76, 80, 91, 95])
        chart.add('C++', [5, 51, 54, 102, 150, 201])
        chart.add('All others combined!', [5, 15, 21, 55, 92, 105])
        charts.append(chart.render_data_uri())
    return render_template('part2/graph.html',
                           charts=charts,
                           root_path=root_path)
Beispiel #5
0
def generate_box_chart_last_discussed(libraries):
    box_chart = pygal.Box(title='Days Since Last Discussed On Stack Overflow',
                          x_title='Total Discussions',
                          y_title='',
                          x_label_rotation=-45,
                          style=invis_style)

    now = datetime.now()
    unsorted_list = []
    for library in libraries:
        if library.last_discussed_on_stack_overflow[0] != None:
            f_date = date(library.last_discussed_on_stack_overflow[0].year,
                          library.last_discussed_on_stack_overflow[0].month,
                          library.last_discussed_on_stack_overflow[0].day)
            l_date = date(now.year, now.month, now.day)
            time_from_release_all = l_date - f_date
            time_from_release = time_from_release_all.days
            unsorted_list.append(
                (time_from_release, time_from_release, library.name,
                 library.last_discussed_on_stack_overflow[1]))
        else:
            unsorted_list.append(([], 0, library.name,
                                  library.last_discussed_on_stack_overflow[1]))

    sorted_list = sorted(unsorted_list,
                         key=lambda library: library[1],
                         reverse=False)

    labels = []
    for library in sorted_list:
        box_chart.add(library[2], library[0])
        labels.append(library[2] + ': ' + str(library[3]))

    box_chart.x_labels = labels
    return box_chart
def make_graph():
    """make graph in section center"""

    #open worksheet
    book = open_workbook('C:/projet_psit.xlsx')
    sheet = book.sheet_by_index(0)  #code select sheet
    primary = [sheet.cell(1, col_index).value for col_index in range(1, 13)]
    junior = [sheet.cell(2, col_index).value for col_index in range(1, 13)]
    senior = [sheet.cell(3, col_index).value for col_index in range(1, 13)]
    vocational = [sheet.cell(4, col_index).value for col_index in range(1, 13)]
    high_vocational = [
        sheet.cell(5, col_index).value for col_index in range(1, 13)
    ]
    undergraduate = [
        sheet.cell(6, col_index).value for col_index in range(1, 13)
    ]

    #make graph
    line_chart = pygal.Box()  #รูปแบบของ graph
    line_chart.title = sheet.cell(0, 0).value
    year = []
    for i in ["2556", "2557", "2558"]:
        for j in range(1, 5):
            year.append(i + "/" + str(j))

    line_chart.x_labels = map(str, year)
    line_chart.add(sheet.cell(1, 0).value, primary)
    line_chart.add(sheet.cell(2, 0).value, junior)
    line_chart.add(sheet.cell(3, 0).value, senior)
    line_chart.add(sheet.cell(4, 0).value, vocational)
    line_chart.add(sheet.cell(5, 0).value, high_vocational)
    line_chart.add(sheet.cell(6, 0).value, undergraduate)
    line_chart.render_to_file('education.svg')
Beispiel #7
0
    def draw_box(self, imdir, x_title=None):
        ds = self.req.durations

        graph_x_title = '{} iterations'.format(len(list(ds.values())[0]))
        if x_title:
            graph_x_title = x_title

        box = pygal.Box(x_title=graph_x_title,
                        y_title='Response time in sec',
                        style=STYLE)
        box.title = '{}'.format(self.req.type.name)

        for name in self.req.durations.keys():
            box.add(name, self.req.durations[name])

        img = os.path.join(imdir, '{}_box'.format(self.req.name))

        if self.svg:
            img = '{}.{}'.format(img, 'svg')
            box.render_to_file(img)
        else:
            img = '{}.{}'.format(img, 'png')
            box.render_to_png(img)

        self.imgs.append(os.path.join('graph', os.path.basename(img)))
Beispiel #8
0
def plot_normalized_box(array1, array2, label1='', label2=''):
    import numpy as np
    box = pygal.Box()
    box.title = 'Jormun Bench Box Comparaison (in ms)'
    box.add('Time Ratio: {}/{}'.format(label2, label1),
            np.array(array2) / np.array(array1))
    box.render_to_file('output_box.svg')
Beispiel #9
0
def render_box(subject, main_title):
    box_chart = pygal.Box()

    for i in range(4):
        if i == 0:
            title_mean = 'Input Disc'
            title_dev = 'Input Color'
        elif i == 1:
            title_mean = 'E-GAN Disc'
            title_dev = 'E-GAN Color'
        elif i == 2:
            title_mean = 'DeepLPF Disc'
            title_dev = 'DeepLPF Color'
        else:  # 3
            title_mean = 'CUD-NET Disc'
            title_dev = 'CUD-NET Color'

        insert_box_chart(title_mean, box_chart, subject.disc_mean[i],
                         subject.disc_dev[i])
        insert_box_chart(title_dev, box_chart, subject.color_mean[i],
                         subject.color_dev[i])

    box_chart.add('trash', [0.5, 4.3])  # set the threshold of output image.

    box_chart.render_to_file(main_title + '.svg')
Beispiel #10
0
def aggr_plot():
    params = parseReq(request)
    day_start = params.get('day_start')
    day_end = params.get('day_end')
    key = params.get('key')
    aggregate = params.get('aggregate')

    if key and aggregate:
        if day_start:
            day_start = datetime.datetime.fromisoformat(day_start)
        else:
            day_start = datetime.datetime(2020, 3, 1)
        if day_end:
            day_end = datetime.datetime.fromisoformat(day_end)
        else:
            day_end = datetime.datetime.today()
        entries = analysis.getAllEntriesOfDayRange(day_start, day_end)
        try:
            results = analysis.aggregateMultiple(entries, key, aggregate)
        except ValueError as e:
            print(e)
            abort(400)

        results = analysis.padMissingDays(results)

        if aggregate == "all" and not type(key) is list:
            # make a box plot
            graph = pygal.Box(x_label_rotation=35, truncate_label=-1)
            graph.title = "distribution of " + listToVerboseStr(
                key) + " over time."
            graph.x_labels = [x["timestamp"] for x in results]
            for day in results:
                # if not day["values"][key+"_"+aggregate][0]:
                #     graph.add(day["timestamp"],None, allow_interruptions=True)
                # else:
                graph.add(day["timestamp"],
                          day["values"][key + "_" + aggregate],
                          allow_interruptions=True)
        elif aggregate == "all" or "all" in aggregate:
            abort(400)
        else:
            graph = pygal.Line(x_label_rotation=35, truncate_label=-1)
            graph.title = listToVerboseStr(
                aggregate) + " of " + listToVerboseStr(key) + " over time."
            graph.x_labels = [x["timestamp"] for x in results]

            if not type(key) is list:
                key = [key]
            if not type(aggregate) is list:
                aggregate = [aggregate] * len(key)

            for k, a in zip(key, aggregate):
                data = [x["values"][k + "_" + a] for x in results]
                graph.add(k + " " + a, data, allow_interruptions=True)

        graph_data = graph.render_response()
        return graph_data
    else:
        abort(400)
Beispiel #11
0
def box():
    box_plot = py.Box()
    box_plot.title = 'V8 benchmark results'
    box_plot.add('Chrome', [6395, 8212, 7520, 7218, 12464, 1660, 2123, 8607])
    box_plot.add('Firefox', [7473, 8099, 11700, 2651, 6361, 1044, 3797, 9450])
    box_plot.add('Opera', [3472, 2933, 4203, 5229, 5810, 1828, 9013, 4669])
    box_plot.add('IE', [43, 41, 59, 79, 144, 136, 34, 102])
    return Response(response=box_plot.render(), content_type='image/svg+xml')
    def __init__(self, **kwargs):
        self.data = {}

        self.chart = pygal.Box(**kwargs)
        self.chart.style = DefaultStyle(tooltip_font_size=14)
        self.chart.legend_at_bottom = True
        self.chart.box_mode = "tukey"
        self.chart.legend_at_bottom_columns = 3
Beispiel #13
0
def plot_normalized_box(data):
    box = pygal.Box()
    box.title = 'Jormun Bench Box'

    for label, array in data:
        box.add(label, array)

    box.render_to_file('output_box.svg')
Beispiel #14
0
def show_player(player_id):
    player = Player.query.filter_by(id=player_id).one()

    plot = pygal.Box()
    for deal in ['six', 'seven', 'eight', 'nine', 'ten', 'score']:
        plot.add(deal, [getattr(game, deal) for game in player.scores])

    return render_template('player.html',
                           player=player,
                           plot=plot.render(disable_xml_declaration=True))
    def show(data):
        seleccionados = data.getSeleccionados()
        #chart = pygal.Box(box_mode="pstdev")    # stander desviation
        chart = pygal.Box()

        chart.title = data.getTitle()
        #chart.x_labels = data.getEje(data.getSeleccionEjeX(), 0)

        for selec in seleccionados:
            chart.add(selec, data.getEje(data.getSeleccionEjeY(), selec))
        chart.render_to_file('output/box_pygal.html')
Beispiel #16
0
def boxplot(args):
    import pygal

    benchmark_results = __plot(args, use_mean=False)

    box_plot = pygal.Box()
    box_plot.title = 'Language benchmark results'
    [box_plot.add(lang, results) for lang, results in benchmark_results]

    print("Opening table in web browser...")
    box_plot.render_to_file('./result/chart.svg')
    print("Done")
Beispiel #17
0
    def plot_box_plot(self, flats, quarter):
        data = self.query_distribution_data(flats, quarter)

        box_plot = pygal.Box(box_mode="stdev", style=style)
        box_plot.title = f'Distribution of median resale prices in the Q{quarter} (All Time)'
        box_plot.x_labels = flats
        for flat in flats:
            box_plot.add(flat, data[flat])

        box_plot.render_to_file(
            Plot.generate_plot_name(
                f'resale_price_distribution_box_Q{quarter}_all_time'))
Beispiel #18
0
def plot(stock_data):
    'plot'
    data = stock_data['dataset']['data']
    box_plot = pygal.Box()
    box_plot.title = stock_data['dataset']['name']
    lowest = 999999
    for daily_data in data:
        box_plot.add(
            daily_data[0],
            [daily_data[1], daily_data[2], daily_data[3], daily_data[4]])
        lowest = min(lowest, daily_data[3])
    box_plot.zero = int(lowest)
    return box_plot.render_data_uri()
Beispiel #19
0
 def render_chart(environ, start_response):
     stats = bp_perf.stats
     chart_name = pop_path_info(environ)
     if chart_name not in stats:
         start_response('404 Not Found', [('content-type', 'text/plain; charset=ascii')])
         return [b"Chart not found"]
     else:
         data = stats[chart_name]
         chart = pygal.Box(box_mode='tukey', width=1200, height=600)
         chart.title = chart_name
         for bp, data in data.items():
             chart.add(bp, data)
         start_response('200 OK', [('content-type', 'image/svg+xml')])
         return [chart.render()]
Beispiel #20
0
def generate_box_chart_backwards_compatibility(libraries):
    box_chart = pygal.Box(title='Number Of Breaking Changes Per Version',
                          x_title='Total Number Of Versions',
                          y_title='',
                          x_label_rotation=-45,
                          style=invis_style)

    labels = []
    for library in libraries:
        box_chart.add(library.name, library.backward_compatibilty)
        labels.append(library.name + ': ' +
                      str(len(library.backward_compatibilty)))

    box_chart.x_labels = labels
    return box_chart
def csv_to_boxplot(input_path, output_path, column_id=None, title=None):
    df = pd.read_csv(input_path)
    df.set_index('Id', inplace=True)

    box_plot = pygal.Box()

    if title:
        box_plot.title = title

    if column_id:
        box_plot.add(column_id, df[column_id])
    else:
        for column in df:
            box_plot.add(column, df[column])

    box_plot.render_to_file(output_path)
Beispiel #22
0
def make_boxplots(alldistpropspertext, boxplotfile):
    for feature in alldistpropspertext.columns[:-1].values:
        currentboxplotfile = boxplotfile + "_" + feature + ".svg"
        distribution = alldistpropspertext.loc[:,[feature,"label"]]
        distributionspertext = pd.groupby(distribution, "label")
        boxplot = pygal.Box(style=threeway_style,
                            title = "Verteilung für \'" + feature + "\'",
                            x_title = "Partitionen",
                            y_title = "Verteilung der Anteile",
                            legend_at_bottom=True,
                            legend_at_bottom_columns = 3,
                            )
        for name, group in distributionspertext:
            groupprops = list(group.loc[:,feature])
            boxplot.add(name, groupprops)
        boxplot.render_to_file(currentboxplotfile)
def boxplot(args):
    import pygal

    benchmark_results = __plot(args, use_mean=False)

    box_plot = pygal.Box()
    box_plot.title = 'Language benchmark results\n({})'.format(
        __get_additional_title_info(args))

    [box_plot.add(lang, results) for lang, results in benchmark_results]
    result_data = {lang: results for lang, results in benchmark_results}
    result_data['_metadata'] = __get_run_metadata(args, 'boxplot')

    __render_and_save(box_plot, result_data)

    print("Done")
def makeChart(term):
    chart = pygal.Box(range=(-1, 1))
    chart.title = 'News Sentiments for Term \'' + term + '\''

    cnn = NewsSentiment.Cnn()
    fox = NewsSentiment.Fox()

    threads = [
        threader.makeThread(generateSentiment, (chart, cnn, term)),
        threader.makeThread(generateSentiment, (chart, fox, term))
    ]
    threader.joinThreads(threads)

    filename = term + '.png'
    chart.render_to_png(filename)
    webbrowser.open(filename)
Beispiel #25
0
def box_fruit_2013():
    """Show the product prices in 2013"""
    box_plot = pygal.Box()
    box_plot.title = 'Fruit prices in 2013'
    box_plot.add('Kiwi, 1 kg', [
        1.90, 1.97, 2.00, 2.07, 2.32, 2.45, 3.16, 4.38, 4.73, 5.12, 5.96, 6.19
    ])
    box_plot.add('Apple, 1 kg', [
        2.25, 2.33, 2.37, 2.41, 2.56, 2.58, 2.72, 2.96, 3.24, 3.60, 3.81, 4.12
    ])
    box_plot.add('Banana, 1 kg', [
        2.53, 2.54, 2.55, 2.56, 2.64, 2.65, 2.67, 2.67, 2.67, 2.68, 2.78, 2.80
    ])
    box_plot.add('Lettuce, 1 kg', [
        2.55, 2.61, 2.77, 2.85, 3.07, 3.56, 3.65, 3.74, 4.23, 6.56, 6.73, 9.18
    ])
    box_plot.render_to_file('./Plotting/box_fruit_2013.svg')
    return box_plot
Beispiel #26
0
def generate_box_chart_issue_response_time(libraries):
    box_chart = pygal.Box(title='Days Taken To Respond To Issue',
                          x_title='Total Issues Responsed To',
                          y_title='Days',
                          x_label_rotation=-45,
                          style=invis_style)
    all_response_times = []
    for library in libraries:
        response_times = []
        for issue in library.issue_data:
            if issue.issue_closing_date != None:
                response_times.append(issue.time_to_response)

        box_chart.add(library.name, response_times)
        all_response_times.append(library.name + ': ' +
                                  str(len(response_times)))
    box_chart.x_labels = all_response_times
    return box_chart
    def plot(self):
        single_factor_df = self._single_factor_df.dropna().sort_values(
            self.factor_name, ascending=False)
        # 画因子原始分布图
        line_chart = pygal.Bar()
        line_chart.title = self.factor_name
        line_chart.x_labels = single_factor_df.index.values
        single_factor_values = single_factor_df.values[:, 0]
        line_chart.add(self.factor_name, single_factor_values)
        line_chart.render_to_file('output\\' + self.factor_name +
                                  '_chart_original.svg')

        single_factor_df = self.winsorize(2.0).dropna().sort_values(
            self.factor_name, ascending=False)
        # 画因子去极值分布图
        line_chart = pygal.Bar()
        line_chart.title = self.factor_name
        line_chart.x_labels = single_factor_df.index.values
        single_factor_values = single_factor_df.values[:, 0]
        single_factor_values[single_factor_values < np.percentile(
            single_factor_values, 2.0)] = np.percentile(
                single_factor_values, 2.0)  # 去极小值
        single_factor_values[single_factor_values > np.percentile(
            single_factor_values, 98.0)] = np.percentile(
                single_factor_values, 98.0)  # 去极大值
        line_chart.add(self.factor_name, single_factor_values)
        line_chart.render_to_file('output\\' + self.factor_name +
                                  '_chart_winsorize.svg')

        # 统计个行业指标信息
        single_factor_df[self.factor_name] = list(
            single_factor_values)  # 引如去极值的因子
        factor_industry_mean = single_factor_df.groupby('industry').mean()
        factor_industry_std = single_factor_df.groupby('industry').std()
        # 行业统计信息画图
        box_plot = pygal.Box(height=1000, width=1500, legend_box_size=20)
        box_plot.title = 'industry statitics of ' + self.factor_name
        for industry, group in single_factor_df.groupby('industry'):
            box_plot.add(industry, group[self.factor_name].values)
        box_plot.render_to_file('output\\' + self.factor_name +
                                '_chart_box.svg')
Beispiel #28
0
def make_pcboxplot(transformed, variance, groups, idnos, pcboxplotfile):
    print("----make_pcboxplot")
    values = []
    for i in range(0,391):
        value = transformed[i][0]
        values.append(value)
    data = pd.DataFrame({"group" : groups, "value" : values, "idnos" : idnos})
    # print(data.head())
    data = data.groupby("group")
    boxplot = pygal.Box(style=threeway_style,
                        title="Verteilung der Texte",
                        # x_title="X",
                        y_title="PC 1",
                        legend_at_bottom=True,
                        print_labels = True,
                        legend_at_bottom_columns=3)
    for name, group in data:
        groupscores = list(group.loc[:, "value"])
        boxplot.add(name, groupscores)
    boxplot.render_to_file(pcboxplotfile)
    return data
Beispiel #29
0
def create_review_length_boxplot(reviews, filename, box_mode='tukey'):
    """
     Creates a boxplot chart with five entries that show the distribution of the review lengths for all possible scores
     Reviews longer than 1500 words are ignored in this example
     Chart documentation: http://www.pygal.org/en/latest/documentation/types/box.html
    :param reviews: list of review dictionaries
    :param filename: string
    :param box_mode: type of boxchart, e.g. None, 'tukey', 'stdv'
    """
    one_star_review_lengths = []
    two_star_review_lengths = []
    three_star_review_lengths = []
    four_star_review_lengths = []
    five_star_review_lengths = []

    for review in reviews:
        score = int(review['review/score'])
        review_length = len(review['review/text'].split(' '))
        if review_length > 1500:  # ignore some outliers
            continue
        if score == 1:
            one_star_review_lengths.append(review_length)
        elif score == 2:
            two_star_review_lengths.append(review_length)
        elif score == 3:
            three_star_review_lengths.append(review_length)
        elif score == 4:
            four_star_review_lengths.append(review_length)
        elif score == 5:
            five_star_review_lengths.append(review_length)

    box_plot = pygal.Box(box_mode=box_mode)
    box_plot.title = 'Review Lengths by Review Score'
    box_plot.add('1 Star Reviews', one_star_review_lengths)
    box_plot.add('2 Star Reviews', two_star_review_lengths)
    box_plot.add('3 Star Reviews', three_star_review_lengths)
    box_plot.add('4 Star Reviews', four_star_review_lengths)
    box_plot.add('5 Star Reviews', five_star_review_lengths)
    box_plot.x_labels = ['1 Star', '2 Stars', '3 Stars', '4 Stars', '5 Stars']
    box_plot.render_to_file(filename)
Beispiel #30
0
def generate_box_chart_release_frequency(libraries):
    box_chart = pygal.Box(title='Days Between Releases',
                          x_title='Total Releases',
                          y_title='Days',
                          x_label_rotation=-45,
                          style=invis_style)

    all_release_times = []
    release_tuples = []
    for library in libraries:
        release_times = []
        for i in range(len(library.release_frequency) - 1):
            f_date = date(library.release_frequency[i].year,
                          library.release_frequency[i].month,
                          library.release_frequency[i].day)
            l_date = date(library.release_frequency[i + 1].year,
                          library.release_frequency[i + 1].month,
                          library.release_frequency[i + 1].day)
            time_to_release_all = l_date - f_date
            time_to_release = time_to_release_all.days
            release_times.append(time_to_release)

        avg_release_time = sum(release_times) / len(release_times)
        release_tuples.append((release_times, avg_release_time,
                               len(release_times), library.name))
        # box_chart.add(library.name, release_times)
        # all_release_times.append(library.name + ': ' + str(len(release_times)))

    sorted_release_tuples = sorted(release_tuples,
                                   key=lambda release: release[1],
                                   reverse=False)
    for release_tuple in sorted_release_tuples:
        box_chart.add(release_tuple[3], release_tuple[0])
        all_release_times.append(release_tuple[3] + ': ' +
                                 str(release_tuple[2]))

    box_chart.x_labels = all_release_times
    return box_chart