def create_bar_chart(details, base=None):
    print("This is bar chart function")
    if len(details["categories"]) != len(details["values"]):
        return False, "Couldn't create the bar chart as the number of categories and values are not equal"

    try:
        prs = Presentation('./Final - Presentation.pptx')
    except exc.PackageNotFoundError as err:
        # print(f'No presentation file: {err}')
        prs = Presentation(base)
    slide = prs.slides.add_slide(prs.slide_layouts[10])

    chart_data = CategoryChartData()

    try:
        values = (float(i) for i in details["values"])
    except ValueError as err:
        print(f'Cannot extract values from list: {err}')
        return False, "Couldn't create the bar chart due to invalid numeric values"

    chart_data.add_series('Series 1', values)
    chart_data.categories = details["categories"]

    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

    slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy,
                           chart_data)

    if 'title' in details:
        slide.placeholders[0].text = details['title'].title()
        # chart.chart_title.text_frame.text = details['title'].title()

    prs.save('Final - Presentation.pptx')
    print("Hello")
    return True, "Created the Bar Chart"
Пример #2
0
    def pie_simple(self, question, slide):
        categories = []
        frequencies = []
        for response in question.responses:
            categories.append(str(response.response))
            for year, frequency in response.frequencies.items():
                frequencies.append(frequency)
        chart_data = CategoryChartData()
        chart_data.categories = categories
        chart_data.add_series('Series 1', iter(frequencies))
        left, top, width, height = Inches(6.75), Inches(2), Inches(
            6.5), Inches(5)

        chart = slide.shapes.add_chart(XL_CHART_TYPE.PIE, left, top, width,
                                       height, chart_data).chart
        chart.chart_title.has_text_frame = True
        chart.chart_title.text_frame.text = "Q: " + str(question.prompt)
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(12)
        chart.has_legend = True
        chart.legend.position = XL_LEGEND_POSITION.BOTTOM
        chart.legend.font.size = Pt(12)
        chart.legend.include_in_layout = False
        chart.plots[0].has_data_labels = True
        data_labels = chart.plots[0].data_labels
        if question.stat == 'percent':
            data_labels.number_format = '0%'
        data_labels.font.size = Pt(12)
Пример #3
0
    def bar_clustered_matrix_by_scale_points(self, question, slide):
        sub_questions = question.questions
        series_names = []  # responses
        series_lists = []  # frequencies for each scale point
        categories = []  # scale points
        is_first = True

        for sub_question in sub_questions:
            #series_names.append(str(sub_question.prompt) + " (n=" + str(sub_question.n) + ")")
            if is_first:
                for response in sub_question.responses:
                    categories.append(response.response)
                question.stat = sub_question.stat
            is_first = False

        for name in series_names:
            frequencies = []
            series_lists.append([])
        response_idx = 0
        for sub_question in sub_questions:
            frequencies = series_lists[response_idx]
            for response in sub_question.responses:
                if response.has_frequency is True:
                    for year, frequency in response.frequencies.items():
                        frequencies.append(frequency)
                else:
                    frequencies.append(0)
            response_idx += 1

        chart_data = CategoryChartData()
        chart_data.categories = categories
        for idx in range(0, len(series_names)):
            chart_data.add_series(series_names[idx], iter(series_lists[idx]))
        left, top, width, height = Inches(6.75), Inches(2), Inches(
            6.5), Inches(5)

        chart = slide.shapes.add_chart(XL_CHART_TYPE.BAR_CLUSTERED, left, top,
                                       width, height, chart_data).chart
        chart.chart_title.has_text_frame = True
        chart.chart_title.text_frame.text = "Q: " + str(question.prompt)
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(12)

        category_axis = chart.category_axis
        category_axis.has_minor_gridlines = False
        category_axis.has_major_gridlines = False
        category_axis.tick_labels.font.size = Pt(12)
        value_axis = chart.value_axis
        value_axis.has_minor_gridlines = False
        value_axis.has_major_gridlines = False
        value_axis.tick_labels.font.size = Pt(12)
        chart.plots[0].has_data_labels = True
        data_labels = chart.plots[0].data_labels
        if question.stat == 'percent':
            data_labels.number_format = '0%'
        data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
        data_labels.font.size = Pt(12)
        chart.has_legend = True
        chart.legend.position = XL_LEGEND_POSITION.BOTTOM
        chart.legend.font.size = Pt(12)
        chart.legend.include_in_layout = False
def create_bar_chart(slide,
                     x_axis,
                     y_axis,
                     values,
                     chart_dim,
                     chart_type,
                     cp,
                     title=None,
                     label_flag=None):
    chart_data = CategoryChartData()
    chart_data.categories = x_axis
    for i in range(len(y_axis)):
        chart_data.add_series(y_axis[i], values[i])
    x, y, cx, cy = chart_dim[0], chart_dim[1], chart_dim[2], chart_dim[3]
    graphic_frame = slide.shapes.add_chart(chart_type, x, y, cx, cy,
                                           chart_data)
    chart = graphic_frame.chart
    if title:
        title_tf = chart.chart_title.text_frame
        title_tf.text = title
        title_font = title_tf.paragraphs[0].font
        title_font.size, title_font.bold, title_font.name = Pt(
            14), True, "Proxima Nova"
        title_font.color.rgb = RGBColor(128, 128, 128)
    cp(chart, y_axis, label_flag)
Пример #5
0
def when_I_call_placeholder_insert_chart(context):
    chart_data = CategoryChartData()
    chart_data.categories = ["Yes", "No"]
    chart_data.add_series("Series 1", (42, 24))
    placeholder = context.shape
    context.placeholder = placeholder.insert_chart(XL_CHART_TYPE.PIE,
                                                   chart_data)
Пример #6
0
 def rewrite_fixture(self):
     ser_xml, expected_xml = snippet_seq('rewrite-ser')[:2]
     chart_data = CategoryChartData()
     chart_data.categories = ('foo', 'bar')
     series_data = chart_data.add_series('Series 1', (1, 2))
     rewriter = _CategorySeriesXmlRewriter(chart_data)
     ser = parse_xml(ser_xml)
     return rewriter, ser, series_data, expected_xml
Пример #7
0
 def rewrite_fixture(self):
     ser_xml, expected_xml = snippet_seq('rewrite-ser')[:2]
     chart_data = CategoryChartData()
     chart_data.categories = ('foo', 'bar')
     series_data = chart_data.add_series('Series 1', (1, 2))
     rewriter = _CategorySeriesXmlRewriter(chart_data)
     ser = parse_xml(ser_xml)
     return rewriter, ser, series_data, expected_xml
Пример #8
0
 def df2chart_data(df):
     """index转换为chart_data的categories,columns转为chart_data的series"""
     chart_data = CategoryChartData()
     df.fillna('', inplace=True)
     chart_data.categories = df.index.tolist()
     for col in df:
         chart_data.add_series(col, df[col].tolist())
     return chart_data
Пример #9
0
def given_a_CategoryChartData_object_having_date_categories(context):
    chart_data = CategoryChartData()
    chart_data.categories = [
        datetime.date(2016, 12, 27),
        datetime.date(2016, 12, 28),
        datetime.date(2016, 12, 29),
    ]
    context.chart_data = chart_data
Пример #10
0
def when_I_call_placeholder_insert_chart(context):
    chart_data = CategoryChartData()
    chart_data.categories = ['Yes', 'No']
    chart_data.add_series('Series 1', (42, 24))
    placeholder = context.shape
    context.placeholder = placeholder.insert_chart(
        XL_CHART_TYPE.PIE, chart_data
    )
Пример #11
0
def given_a_CategoryChartData_object_having_date_categories(context):
    chart_data = CategoryChartData()
    chart_data.categories = [
        datetime.date(2016, 12, 27),
        datetime.date(2016, 12, 28),
        datetime.date(2016, 12, 29),
    ]
    context.chart_data = chart_data
Пример #12
0
def when_I_assign_shapes_add_chart_to_shape(context):
    chart_data = CategoryChartData()
    chart_data.categories = ('Foo', 'Bar')
    chart_data.add_series('East', (1.0, 2.0))
    chart_data.add_series('West', (3.0, 4.0))

    context.shape = context.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED,
                                             Inches(1), Inches(1), Inches(8),
                                             Inches(5), chart_data)
Пример #13
0
    def pandas_to_ppt_chart_data(dataframe):
        assert isinstance(dataframe, pd.DataFrame)

        data = CategoryChartData()
        col_lst = dataframe.columns.to_list()
        data.categories = col_lst

        for i, r in dataframe.iterrows():
            data.add_series(str(i), tuple([r[col] for col in col_lst]))

        return data
Пример #14
0
 def rewrite_fixture(self, request):
     snippet_offset, categories = request.param
     chart_data = CategoryChartData()
     chart_data.categories = categories
     rewriter = _CategorySeriesXmlRewriter(chart_data)
     snippets = snippet_seq('rewrite-ser')
     ser_xml = snippets[snippet_offset]
     ser = parse_xml(ser_xml)
     series_data = chart_data.add_series('Series 1', (1, 2))
     expected_xml = snippets[snippet_offset+1]
     return rewriter, ser, series_data, expected_xml
Пример #15
0
 def rewrite_fixture(self, request):
     snippet_offset, categories = request.param
     chart_data = CategoryChartData()
     chart_data.categories = categories
     rewriter = _CategorySeriesXmlRewriter(chart_data)
     snippets = snippet_seq("rewrite-ser")
     ser_xml = snippets[snippet_offset]
     ser = parse_xml(ser_xml)
     series_data = chart_data.add_series("Series 1", (1, 2))
     expected_xml = snippets[snippet_offset + 1]
     return rewriter, ser, series_data, expected_xml
Пример #16
0
def addSerieToChart(presentation, index_chart, serie_name, serie):
    count_chart = 0
    for _slide_i, slide in enumerate(presentation.slides):
        for shape in slide.shapes:
            if shape.has_chart:
                if count_chart == index_chart:
                    chart_data = CategoryChartData()
                    chart_data.categories = ("Critical", "Major", "Important", "Minor")
                    chart_data.add_series(serie_name, serie)
                    shape.chart.replace_data(chart_data)
                    shape.chart.value_axis.maximum_scale = max(serie)+1
                    return True
                count_chart += 1
    return False
Пример #17
0
def _(values: DataFrame, chart: Chart) -> None:
    """Renders into the given chart the values in the DataFrame."""

    chart_data = CategoryChartData()

    chart_data.categories = list(values.index)

    for label in list(values):
        chart_data.add_series(label, list(values[label].values))

    if hasattr(values, 'title'):
        chart.chart_title.text_frame.text = values.title

    chart.replace_data(chart_data)
Пример #18
0
def _(values: DataFrame, chart: Chart) -> None:
    """Renders into the given chart the values in the DataFrame."""

    chart_data = CategoryChartData()

    chart_data.categories = values['categories']

    for label, series in values['data'].items():
        chart_data.add_series(label, series)

    if 'title' in values:
        chart.chart_title.text_frame.text = values['title']

    chart.replace_data(chart_data)
Пример #19
0
def when_I_assign_shapes_add_chart_to_shape(context):
    chart_data = CategoryChartData()
    chart_data.categories = ("Foo", "Bar")
    chart_data.add_series("East", (1.0, 2.0))
    chart_data.add_series("West", (3.0, 4.0))

    context.shape = context.shapes.add_chart(
        XL_CHART_TYPE.COLUMN_CLUSTERED,
        Inches(1),
        Inches(1),
        Inches(8),
        Inches(5),
        chart_data,
    )
Пример #20
0
def buildChartData(series, database, start_date):
    df = Haver.data(series, database, start_date)
    ##Temp fix
    if series.__contains__('csent'):
        df = df[:-1]
    df = df.asfreq('D', how='start')
    df.index = df.index.strftime('%m/%d/%Y')
    df.index = pd.to_datetime(df.index)
    chart_data = CategoryChartData()
    chart_data.categories = df.index
    
    for x in series:
        chart_data.add_series(x, df[x])
    
    return df, chart_data
Пример #21
0
def make_category_chart_data(cat_count, ser_count):
    """
    Return a |CategoryChartData| instance populated with *cat_count*
    categories and *ser_count* series. Values are auto-generated.
    """
    category_names = ('Foo', 'Bar', 'Baz', 'Boo', 'Far', 'Faz')
    point_values = count(1.1, 1.1)
    chart_data = CategoryChartData()
    chart_data.categories = category_names[:cat_count]
    for idx in range(ser_count):
        series_title = 'Series %d' % (idx + 1)
        series_values = tuple(islice(point_values, cat_count))
        series_values = [round(x * 10) / 10.0 for x in series_values]
        chart_data.add_series(series_title, series_values)
    return chart_data
Пример #22
0
def make_category_chart_data(cat_count, ser_count):
    """
    Return a |CategoryChartData| instance populated with *cat_count*
    categories and *ser_count* series. Values are auto-generated.
    """
    category_names = ('Foo', 'Bar', 'Baz', 'Boo', 'Far', 'Faz')
    point_values = count(1.1, 1.1)
    chart_data = CategoryChartData()
    chart_data.categories = category_names[:cat_count]
    for idx in range(ser_count):
        series_title = 'Series %d' % (idx+1)
        series_values = tuple(islice(point_values, cat_count))
        series_values = [round(x*10)/10.0 for x in series_values]
        chart_data.add_series(series_title, series_values)
    return chart_data
Пример #23
0
    def bar_chart(self, categories, values, title, number):

        # define chart data ---------------------
        #slide = self.presentation.slides.add_slide(self.presentation.slide_layouts[5])
        slide = self.presentation.slides[number]
        shapes = slide.shapes
        shapes.title.text = title
        # define chart data ---------------------
        chart_data = CategoryChartData()
        chart_data.categories = categories
        chart_data.add_series('Series 2', (element for element in values))

        # add chart to slide --------------------
        x, y, cx, cy = Inches(2), Inches(1), Inches(6), Inches(4.5)
        slide.shapes.add_chart(
            XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data)
Пример #24
0
    def __pandas_genelate_linechart(self, df):
        '''
        プライベートメソッド。
        pandasのデータフレームをpptxのchartに変換

        Args:
            df (pandas.DataFrame): 出力したいdataframe

        return:
            chart_data (pptx.chart.data.CategoryChartData): chartデータ
        '''
        chart_data = CategoryChartData()
        chart_data.categories = df.index
        for column in df.columns:
            chart_data.add_series(column, df[column])
        return chart_data
Пример #25
0
    def bar_clustered_basic_trended(self, question, slide):
        headers = self.max_years(question.responses)
        series_lists = []
        categories = []
        for header in headers:
            frequencies = []
            series_lists.append(frequencies)
        for response in question.responses:
            categories.append(str(response.response))
            header_idx = 0
            for header in headers:
                frequencies = series_lists[header_idx]
                if response.frequencies.get(header) is not None:
                    freq = response.frequencies.get(header)
                    frequencies.append(freq)
                header_idx += 1
        chart_data = CategoryChartData()
        chart_data.categories = categories
        for idx in range(0, len(headers)):
            chart_data.add_series(str(headers[idx]), iter(series_lists[idx]))
        left, top, width, height = Inches(6.75), Inches(2), Inches(
            6.5), Inches(5)

        chart = slide.shapes.add_chart(XL_CHART_TYPE.BAR_CLUSTERED, left, top,
                                       width, height, chart_data).chart
        chart.chart_title.has_text_frame = True
        chart.chart_title.text_frame.text = "Q: " + str(question.prompt)
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(12)
        chart.has_legend = False
        category_axis = chart.category_axis
        category_axis.has_minor_gridlines = False
        category_axis.has_major_gridlines = False
        category_axis.tick_labels.font.size = Pt(12)
        value_axis = chart.value_axis
        value_axis.has_minor_gridlines = False
        value_axis.has_major_gridlines = False
        value_axis.tick_labels.font.size = Pt(12)
        chart.plots[0].has_data_labels = True
        data_labels = chart.plots[0].data_labels
        if question.stat == 'percent':
            data_labels.number_format = '0%'
        data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
        data_labels.font.size = Pt(12)
        chart.has_legend = True
        chart.legend.position = XL_LEGEND_POSITION.BOTTOM
        chart.legend.font.size = Pt(12)
        chart.legend.include_in_layout = False
Пример #26
0
 def create(self):
     """
     builds & returns the PPTX object
     """
     data_frames = self.data_frames
     p = Presentation()
     layout = p.slide_layouts[6]
     for frame in data_frames:
         cd = CategoryChartData()
         cd.categories = frame.index
         for name in frame.columns:
             cd.add_series(name, frame[name], '0%')
         slide = p.slides.add_slide(layout)
         chart_type = self._chart_type()
         shape = slide.shapes.add_chart(chart_type, 0, 0, 9143301, 6158000,
                                        cd)
     return p
Пример #27
0
 def get_chart_stack(self, heading, data):
     slide = self.prs.slides.add_slide(self.prs.slide_layouts[5])
     title = slide.shapes.title
     title.text = heading
     chart_data = CategoryChartData()
     chart_data.categories = data.keys()
     chart_data.add_series('served by each LP', data.values())
     x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(5)
     chart = slide.shapes.add_chart(
         XL_CHART_TYPE.COLUMN_CLUSTERED, 
         x, 
         y, 
         cx, 
         cy, 
         chart_data,
         )
     chart.has_legend = True
Пример #28
0
def when_I_add_a_clustered_bar_chart_with_multi_level_categories(context):
    chart_type = XL_CHART_TYPE.BAR_CLUSTERED
    chart_data = CategoryChartData()

    WEST = chart_data.add_category('WEST')
    WEST.add_sub_category('SF')
    WEST.add_sub_category('LA')
    EAST = chart_data.add_category('EAST')
    EAST.add_sub_category('NY')
    EAST.add_sub_category('NJ')

    chart_data.add_series('Series 1', (1, 2, None, 4))
    chart_data.add_series('Series 2', (5, None, 7, 8))

    context.chart = context.slide.shapes.add_chart(
        chart_type, Inches(1), Inches(1), Inches(8), Inches(5), chart_data
    ).chart
Пример #29
0
def when_I_add_a_clustered_bar_chart_with_multi_level_categories(context):
    chart_type = XL_CHART_TYPE.BAR_CLUSTERED
    chart_data = CategoryChartData()

    WEST = chart_data.add_category("WEST")
    WEST.add_sub_category("SF")
    WEST.add_sub_category("LA")
    EAST = chart_data.add_category("EAST")
    EAST.add_sub_category("NY")
    EAST.add_sub_category("NJ")

    chart_data.add_series("Series 1", (1, 2, None, 4))
    chart_data.add_series("Series 2", (5, None, 7, 8))

    context.chart = context.slide.shapes.add_chart(
        chart_type, Inches(1), Inches(1), Inches(8), Inches(5), chart_data
    ).chart
Пример #30
0
    def test1(self):
        # create presentation with 1 slide ------
        prs = Presentation()
        slide = prs.slides.add_slide(prs.slide_layouts[5])

        # define chart data ---------------------
        chart_data = CategoryChartData()
        chart_data.categories = ['East', 'West', 'Midwest']
        chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

        # add chart to slide --------------------
        x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
        slide.shapes.add_chart(
            XL_CHART_TYPE.BAR_CLUSTERED, x, y, cx, cy, chart_data
        )

        pptx_file = self.saved_data['powerpointPath']
        prs.save(pptx_file)
Пример #31
0
    def multi_fixture(self):
        chart_data = CategoryChartData()

        WEST = chart_data.add_category('WEST')
        WEST.add_sub_category('SF')
        WEST.add_sub_category('LA')
        EAST = chart_data.add_category('EAST')
        EAST.add_sub_category('NY')
        EAST.add_sub_category('NJ')

        chart_data.add_series('Series 1', (1, 2, None, 4))
        chart_data.add_series('Series 2', (5, None, 7, 8))

        xml_writer = _BarChartXmlWriter(
            XL_CHART_TYPE.BAR_CLUSTERED, chart_data
        )
        expected_xml = snippet_text('4x2-multi-cat-bar')
        return xml_writer, expected_xml
Пример #32
0
def create_stackedbar(data):
    # Define chart data
    chart_data = CategoryChartData()

    # Transpose data, because that's how the stacked bar chart data requirement for ppt is
    dataT = data.set_index('Scale').transpose()
    # Reverse order of columns, similar to 'Values in reverse order' in ppt
    dataT = dataT[dataT.columns[::-1]]

    # For each column in the transposed data, add a series to the data
    for col_id, col in enumerate(dataT.columns):
        chart_data.add_series(dataT.columns[col_id], (dataT.iloc[:, col_id]))

    data_cat_list = []

    # Using the original data, create a list containing all the categories
    for i in range(1, data.shape[1]):
        data_cat_list.append(data.columns[i])

    chart_data.categories = data_cat_list

    # Add chart to slide
    x, y, cx, cy = Cm(2), Cm(5), Cm(10), Cm(8)
    graphic_frame = slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_STACKED, x, y,
                                           cx, cy, chart_data)

    chart = graphic_frame.chart

    # data labels
    plot = chart.plots[0]
    plot.has_data_labels = True
    data_labels = plot.data_labels
    data_labels.number_format = '0"%"'

    # value_axis
    value_axis = chart.value_axis
    value_axis.minimum_scale = 0
    value_axis.maximum_scale = 100.0
    value_axis.has_minor_gridlines = False

    tick_labels = value_axis.tick_labels
    tick_labels.number_format = '0"%"'
    tick_labels.font.bold = True
    tick_labels.font.size = Pt(14)
Пример #33
0
def create_line_chart(details, base=None):

    if len(details["Label"]) != len(details["Value"]):
        return False, "Couldn't create the line chart as the number of labels and values are not equal"

    # prs = Presentation()
    # slide = prs.slides.add_slide(prs.slide_layouts[5])

    try:
        prs = Presentation('./Final - Presentation.pptx')
    except exc.PackageNotFoundError as err:
        # print(f'No presentation file: {err}')
        prs = Presentation(base)
    slide = prs.slides.add_slide(prs.slide_layouts[10])

    chart_data = CategoryChartData()
    # chart_data = ChartData()

    try:
        values = (float(i) for i in details["Value"])
    except ValueError as err:
        print(f'Cannot extract values from list: {err}')
        return False, "Couldn't create the line chart due to invalid numeric values"

    chart_data.add_series('Series 1', values)
    chart_data.categories = details["Label"]

    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

    chart = slide.shapes.add_chart(XL_CHART_TYPE.LINE, x, y, cx, cy,
                                   chart_data).chart

    chart.has_legend = True
    chart.legend.include_in_layout = False
    chart.series[0].smooth = True

    if 'title' in details:
        slide.placeholders[0].text = details['title'].title()
        # chart.chart_title.text_frame.text = details['title'].title()

    prs.save('Final - Presentation.pptx')

    return True, "Created the Line Chart"
Пример #34
0
def make_category_chart_data(cat_count, cat_type, ser_count):
    """
    Return a |CategoryChartData| instance populated with *cat_count*
    categories of type *cat_type* and *ser_count* series. Values are
    auto-generated.
    """
    category_labels = {
        date: (date(2016, 12, 27), date(2016, 12, 28), date(2016, 12, 29)),
        float: (1.1, 2.2, 3.3, 4.4, 5.5),
        str: ("Foo", "Bar", "Baz", "Boo", "Far", "Faz"),
    }[cat_type]
    point_values = count(1.1, 1.1)
    chart_data = CategoryChartData()
    chart_data.categories = category_labels[:cat_count]
    for idx in range(ser_count):
        series_title = "Series %d" % (idx + 1)
        series_values = tuple(islice(point_values, cat_count))
        series_values = [round(x * 10) / 10.0 for x in series_values]
        chart_data.add_series(series_title, series_values)
    return chart_data
Пример #35
0
    def bar_clustered_allocation(self, question, slide):
        sub_questions = question.questions
        categories = []
        frequencies = []

        for sub_question in sub_questions:
            for response in sub_question.responses:
                #categories.append(response.response + " (n=" + str(sub_question.n) + ")")
                for year, frequency in response.frequencies.items():
                    frequencies.append(frequency)

        chart_data = CategoryChartData()
        chart_data.categories = categories
        chart_data.add_series('Series 1', iter(frequencies))
        left, top, width, height = Inches(6.75), Inches(2), Inches(
            6.5), Inches(5)

        chart = slide.shapes.add_chart(XL_CHART_TYPE.BAR_CLUSTERED, left, top,
                                       width, height, chart_data).chart
        chart.chart_title.has_text_frame = True
        chart.chart_title.text_frame.text = "Q: " + str(question.prompt)
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(12)
        chart.has_legend = False
        category_axis = chart.category_axis
        category_axis.has_minor_gridlines = False
        category_axis.has_major_gridlines = False
        category_axis.tick_labels.font.size = Pt(12)
        value_axis = chart.value_axis
        value_axis.has_minor_gridlines = False
        value_axis.has_major_gridlines = False
        value_axis.tick_labels.font.size = Pt(12)
        chart.plots[0].has_data_labels = True
        data_labels = chart.plots[0].data_labels
        # data_labels.number_format = '0%'
        data_labels.position = XL_LABEL_POSITION.OUTSIDE_END
        data_labels.font.size = Pt(12)
        plot = chart.plots[0]
        series = plot.series[0]
        fill = series.format.fill
        fill.solid()
        fill.fore_color.theme_color = MSO_THEME_COLOR.ACCENT_1
Пример #36
0
    def stacked_bar_simple(self, question, slide):
        series_names = []
        frequencies = []
        for response in question.responses:
            series_names.append(str(response.response))
            for year, frequency in response.frequencies.items():
                frequencies.append(frequency)
        chart_data = CategoryChartData()
        chart_data.categories = ["Variable 1"]
        for idx in range(0, len(series_names)):
            temp = []
            temp.append(frequencies[idx])
            series = str(series_names[idx])
            chart_data.add_series(series, iter(temp))

        left, top, width, height = Inches(0), Inches(4), Inches(6.5), Inches(3)

        chart = slide.shapes.add_chart(XL_CHART_TYPE.BAR_STACKED, left, top,
                                       width, height, chart_data).chart
        chart.chart_title.has_text_frame = True
        chart.chart_title.text_frame.text = "Q: " + str(question.prompt)
        chart.chart_title.text_frame.paragraphs[0].font.size = Pt(12)
        chart.has_legend = True
        category_axis = chart.category_axis
        category_axis.has_minor_gridlines = False
        category_axis.has_major_gridlines = False
        category_axis.tick_labels.font.size = Pt(12)
        value_axis = chart.value_axis
        value_axis.has_minor_gridlines = False
        value_axis.has_major_gridlines = False
        value_axis.visible = False

        chart.legend.position = XL_LEGEND_POSITION.BOTTOM
        chart.legend.font.size = Pt(12)
        chart.legend.include_in_layout = False
        chart.plots[0].has_data_labels = True
        data_labels = chart.plots[0].data_labels
        if question.stat == 'percent':
            data_labels.number_format = '0%'
        data_labels.font.size = Pt(12)
Пример #37
0
def __create_chartdata(chartInfo):
    chart_data = CategoryChartData()

    # TODO: Deal with First Row as Labels and Column Names as Labels

    colNames = chartInfo['data'][0].columns.tolist()
    offset = 0

    if (chartInfo['first_column_as_labels']):
        offset = 1

    if len(colNames) > offset:

        colNum = 1
        for colName in colNames[offset:]:
            if (chartInfo['column_names_as_labels']):
                chart_data.categories.add_category(colName)
            else:
                chart_data.categories.add_category('Category ' + str(colNum))

        rowNum = 1
        for index, row in chartInfo['data'][0].iterrows():
            data = []
            for colName in colNames[offset:]:
                data.append(row[colName])

            if chartInfo['first_column_as_labels']:
                chart_data.add_series(str(row[0]), data)
            else:
                chart_data.add_series('Series ' + str(rowNum), data)

    return chart_data
Пример #38
0
def when_I_add_a_chart_with_categories_and_series(context, kind, cats, sers):
    chart_type = {
        'Area': XL_CHART_TYPE.AREA,
        'Stacked Area': XL_CHART_TYPE.AREA_STACKED,
        '100% Stacked Area': XL_CHART_TYPE.AREA_STACKED_100,
        'Clustered Bar': XL_CHART_TYPE.BAR_CLUSTERED,
        'Stacked Bar': XL_CHART_TYPE.BAR_STACKED,
        '100% Stacked Bar': XL_CHART_TYPE.BAR_STACKED_100,
        'Clustered Column': XL_CHART_TYPE.COLUMN_CLUSTERED,
        'Stacked Column': XL_CHART_TYPE.COLUMN_STACKED,
        '100% Stacked Column': XL_CHART_TYPE.COLUMN_STACKED_100,
        'Doughnut': XL_CHART_TYPE.DOUGHNUT,
        'Exploded Doughnut': XL_CHART_TYPE.DOUGHNUT_EXPLODED,
        'Line': XL_CHART_TYPE.LINE,
        'Line with Markers': XL_CHART_TYPE.LINE_MARKERS,
        'Line Markers Stacked': XL_CHART_TYPE.LINE_MARKERS_STACKED,
        '100% Line Markers Stacked': XL_CHART_TYPE.LINE_MARKERS_STACKED_100,
        'Line Stacked': XL_CHART_TYPE.LINE_STACKED,
        '100% Line Stacked': XL_CHART_TYPE.LINE_STACKED_100,
        'Pie': XL_CHART_TYPE.PIE,
        'Exploded Pie': XL_CHART_TYPE.PIE_EXPLODED,
        'Radar': XL_CHART_TYPE.RADAR,
        'Filled Radar': XL_CHART_TYPE.RADAR_FILLED,
        'Radar with markers': XL_CHART_TYPE.RADAR_MARKERS,
    }[kind]
    category_count, series_count = int(cats), int(sers)
    category_source = ('Foo', 'Bar', 'Baz', 'Boo', 'Far', 'Faz')
    series_value_source = count(1.1, 1.1)

    chart_data = CategoryChartData()
    chart_data.categories = category_source[:category_count]
    for idx in range(series_count):
        series_title = 'Series %d' % (idx + 1)
        series_values = tuple(islice(series_value_source, category_count))
        chart_data.add_series(series_title, series_values)

    context.chart = context.slide.shapes.add_chart(chart_type, Inches(1),
                                                   Inches(1), Inches(8),
                                                   Inches(5), chart_data).chart
Пример #39
0
def when_I_add_a_chart_with_categories_and_series(context, kind, cats, sers):
    chart_type = {
        'Area':                      XL_CHART_TYPE.AREA,
        'Stacked Area':              XL_CHART_TYPE.AREA_STACKED,
        '100% Stacked Area':         XL_CHART_TYPE.AREA_STACKED_100,
        'Clustered Bar':             XL_CHART_TYPE.BAR_CLUSTERED,
        'Stacked Bar':               XL_CHART_TYPE.BAR_STACKED,
        '100% Stacked Bar':          XL_CHART_TYPE.BAR_STACKED_100,
        'Clustered Column':          XL_CHART_TYPE.COLUMN_CLUSTERED,
        'Stacked Column':            XL_CHART_TYPE.COLUMN_STACKED,
        '100% Stacked Column':       XL_CHART_TYPE.COLUMN_STACKED_100,
        'Doughnut':                  XL_CHART_TYPE.DOUGHNUT,
        'Exploded Doughnut':         XL_CHART_TYPE.DOUGHNUT_EXPLODED,
        'Line':                      XL_CHART_TYPE.LINE,
        'Line with Markers':         XL_CHART_TYPE.LINE_MARKERS,
        'Line Markers Stacked':      XL_CHART_TYPE.LINE_MARKERS_STACKED,
        '100% Line Markers Stacked': XL_CHART_TYPE.LINE_MARKERS_STACKED_100,
        'Line Stacked':              XL_CHART_TYPE.LINE_STACKED,
        '100% Line Stacked':         XL_CHART_TYPE.LINE_STACKED_100,
        'Pie':                       XL_CHART_TYPE.PIE,
        'Exploded Pie':              XL_CHART_TYPE.PIE_EXPLODED,
        'Radar':                     XL_CHART_TYPE.RADAR,
        'Filled Radar':              XL_CHART_TYPE.RADAR_FILLED,
        'Radar with markers':        XL_CHART_TYPE.RADAR_MARKERS,
    }[kind]
    category_count, series_count = int(cats), int(sers)
    category_source = ('Foo', 'Bar', 'Baz', 'Boo', 'Far', 'Faz')
    series_value_source = count(1.1, 1.1)

    chart_data = CategoryChartData()
    chart_data.categories = category_source[:category_count]
    for idx in range(series_count):
        series_title = 'Series %d' % (idx+1)
        series_values = tuple(islice(series_value_source, category_count))
        chart_data.add_series(series_title, series_values)

    context.chart = context.slide.shapes.add_chart(
        chart_type, Inches(1), Inches(1), Inches(8), Inches(5), chart_data
    ).chart
Пример #40
0
def when_I_add_a_chart_with_categories_and_series(context, kind, cats, sers):
    chart_type = {
        "Area": XL_CHART_TYPE.AREA,
        "Stacked Area": XL_CHART_TYPE.AREA_STACKED,
        "100% Stacked Area": XL_CHART_TYPE.AREA_STACKED_100,
        "Clustered Bar": XL_CHART_TYPE.BAR_CLUSTERED,
        "Stacked Bar": XL_CHART_TYPE.BAR_STACKED,
        "100% Stacked Bar": XL_CHART_TYPE.BAR_STACKED_100,
        "Clustered Column": XL_CHART_TYPE.COLUMN_CLUSTERED,
        "Stacked Column": XL_CHART_TYPE.COLUMN_STACKED,
        "100% Stacked Column": XL_CHART_TYPE.COLUMN_STACKED_100,
        "Doughnut": XL_CHART_TYPE.DOUGHNUT,
        "Exploded Doughnut": XL_CHART_TYPE.DOUGHNUT_EXPLODED,
        "Line": XL_CHART_TYPE.LINE,
        "Line with Markers": XL_CHART_TYPE.LINE_MARKERS,
        "Line Markers Stacked": XL_CHART_TYPE.LINE_MARKERS_STACKED,
        "100% Line Markers Stacked": XL_CHART_TYPE.LINE_MARKERS_STACKED_100,
        "Line Stacked": XL_CHART_TYPE.LINE_STACKED,
        "100% Line Stacked": XL_CHART_TYPE.LINE_STACKED_100,
        "Pie": XL_CHART_TYPE.PIE,
        "Exploded Pie": XL_CHART_TYPE.PIE_EXPLODED,
        "Radar": XL_CHART_TYPE.RADAR,
        "Filled Radar": XL_CHART_TYPE.RADAR_FILLED,
        "Radar with markers": XL_CHART_TYPE.RADAR_MARKERS,
    }[kind]
    category_count, series_count = int(cats), int(sers)
    category_source = ("Foo", "Bar", "Baz", "Boo", "Far", "Faz")
    series_value_source = count(1.1, 1.1)

    chart_data = CategoryChartData()
    chart_data.categories = category_source[:category_count]
    for idx in range(series_count):
        series_title = "Series %d" % (idx + 1)
        series_values = tuple(islice(series_value_source, category_count))
        chart_data.add_series(series_title, series_values)

    context.chart = context.slide.shapes.add_chart(
        chart_type, Inches(1), Inches(1), Inches(8), Inches(5), chart_data
    ).chart
Пример #41
0
def create_pie_chart(details, base=None):

    if len(details["categories"]) != len(details["percentages"]):
        return False, "Couldn't create the pie chart as the number of categories and percentage values are not equal"

    # prs = Presentation()
    # slide = prs.slides.add_slide(prs.slide_layouts[5])

    try:
        prs = Presentation('./Final - Presentation.pptx')
    except exc.PackageNotFoundError as err:
        # print(f'No presentation file: {err}')
        prs = Presentation(base)
    slide = prs.slides.add_slide(prs.slide_layouts[10])

    chart_data = CategoryChartData()

    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

    chart_data = ChartData()
    # chart_data.categories = ['West', 'East', 'North', 'South', 'Other']
    # chart_data.add_series('Series 1', (0.135, 0.324, 0.180, 0.235, 0.126))

    try:
        percent_floats = [float(i) for i in details["percentages"]]
    except ValueError as err:
        print(f'Cannot extract number from percentages: {err}')
        return False, "Couldn't create the pie chart due to invalid percentage values"

    if sum(percent_floats) != 100.0 and sum(percent_floats) != 1.0:
        return False, "Couldn't create the pie chart as percentages don't add up to 100"

    if sum(percent_floats) == 100.0:
        temp = percent_floats
        percent_floats = [i / 100.0 for i in temp]

    chart_data.add_series('Series 1', percent_floats)

    chart_data.categories = details["categories"]

    chart = slide.shapes.add_chart(XL_CHART_TYPE.PIE, x, y, cx, cy,
                                   chart_data).chart

    chart.has_legend = True
    chart.legend.position = XL_LEGEND_POSITION.BOTTOM
    chart.legend.include_in_layout = False

    chart.plots[0].has_data_labels = True
    data_labels = chart.plots[0].data_labels
    data_labels.number_format = '0%'
    data_labels.position = XL_DATA_LABEL_POSITION.OUTSIDE_END

    if 'title' in details:
        slide.placeholders[0].text = details['title'].title()
        # chart.chart_title.text_frame.text = details['title'].title()

    prs.save('Final - Presentation.pptx')

    return True, "Created the Pie Chart"
Пример #42
0
def make_category_chart_data(cat_count, cat_type, ser_count):
    """
    Return a |CategoryChartData| instance populated with *cat_count*
    categories of type *cat_type* and *ser_count* series. Values are
    auto-generated.
    """
    category_labels = {
        date: (
            date(2016, 12, 27),
            date(2016, 12, 28),
            date(2016, 12, 29),
        ),
        float: (1.1, 2.2, 3.3, 4.4, 5.5),
        str: ('Foo', 'Bar', 'Baz', 'Boo', 'Far', 'Faz'),
    }[cat_type]
    point_values = count(1.1, 1.1)
    chart_data = CategoryChartData()
    chart_data.categories = category_labels[:cat_count]
    for idx in range(ser_count):
        series_title = 'Series %d' % (idx+1)
        series_values = tuple(islice(point_values, cat_count))
        series_values = [round(x*10)/10.0 for x in series_values]
        chart_data.add_series(series_title, series_values)
    return chart_data
Пример #43
0
def given_a_Categories_object_with_number_format_init_nf(context, init_nf):
    categories = CategoryChartData().categories
    if init_nf != "left as default":
        categories.number_format = init_nf
    context.categories = categories