Exemplo n.º 1
0
def __create_xyzdata(dfs):
    chart_data = None

    seriesNum = 1

    for df in dfs:
        colNames = df.columns.tolist()
        name = 'Series ' + str(seriesNum)
        if hasattr(df, 'name') and df.name != "":
            name = df.name

        if len(colNames) > 1 and len(colNames) < 4:
            if len(colNames) == 2 and chart_data is None:
                chart_data = XyChartData()
            elif len(colNames) == 3 and chart_data is None:
                chart_data = BubbleChartData()

            series = chart_data.add_series(name)
            for index, row in df.iterrows():
                data = []
                for colName in colNames:
                    data.append(row[colName])

                if len(colNames) == 2:
                    series.add_data_point(data[0], data[1])
                else:
                    series.add_data_point(data[0], data[1], data[2])

            seriesNum += 1

    return chart_data
Exemplo n.º 2
0
def replace_xy_data(shape: GraphicFrame, data: XYData):
    chart_data = XyChartData()

    for name, points in data.series.items():
        series_data = chart_data.add_series(name)
        for point in points:
            series_data.add_data_point(point.x, point.y)

    shape.chart.replace_data(chart_data)
Exemplo n.º 3
0
def _build_xy_chart_data(csv):
    chart_data = XyChartData()
    for i in range(1, csv.columns.size):
        series = chart_data.add_series(csv.columns[i])
        xy_col = csv.iloc[:, [0, i]]
        for (_, row) in xy_col.iterrows():
            y, x = _nan_to_none(row[0]), _nan_to_none(row[1])
            log.debug(u" Adding xy %s,%s" % (x, y))
            series.add_data_point(x, y)
    return chart_data
Exemplo n.º 4
0
def when_I_replace_its_data_with_3_series_of_three_points_each(context):
    chart_data = XyChartData()
    x = y = 0
    for idx in range(3):
        series_title = "New Series %d" % (idx + 1)
        series = chart_data.add_series(series_title)
        for jdx in range(3):
            x, y = idx * 3 + jdx, idx * 2 + jdx
            series.add_data_point(x, y)

    context.chart.replace_data(chart_data)
Exemplo n.º 5
0
def create_chart(df):
	x = "平均気温"
	y = "最高気温"
	chart = XyChartData()
	c1 = chart.add_series('系列1')
	c2 = chart.add_series('系列2')
	str_df = df[[x,y]].astype("str")
	df_col = list([str_df.columns.tolist()])
	df_list = df_col + str_df.values.tolist()
	s1.add_data_point()
	print(df_list)
Exemplo n.º 6
0
    def rewrite_fixture(self):
        ser_xml, expected_xml = snippet_seq("rewrite-ser")[2:4]

        chart_data = XyChartData()
        series_data = chart_data.add_series("Series 1")
        series_data.add_data_point(1, 2)
        series_data.add_data_point(3, 4)

        rewriter = _XySeriesXmlRewriter(chart_data)
        ser = parse_xml(ser_xml)
        return rewriter, ser, series_data, expected_xml
Exemplo n.º 7
0
    def rewrite_fixture(self):
        ser_xml, expected_xml = snippet_seq('rewrite-ser')[2:4]

        chart_data = XyChartData()
        series_data = chart_data.add_series('Series 1')
        series_data.add_data_point(1, 2)
        series_data.add_data_point(3, 4)

        rewriter = _XySeriesXmlRewriter(chart_data)
        ser = parse_xml(ser_xml)
        return rewriter, ser, series_data, expected_xml
Exemplo n.º 8
0
 def yVal_fixture(self, request):
     cht_numfmt, ser_numfmt, expected_numfmt = request.param
     expected_xml = xml(
         'c:yVal/c:numRef/(c:f"Sheet1!$B$2:$B$1",c:numCache/(c:formatCode'
         '"%s",c:ptCount{val=0}))' % expected_numfmt)
     chart_number_format = () if cht_numfmt is None else (cht_numfmt, )
     series_number_format = () if ser_numfmt is None else (ser_numfmt, )
     chart_data = XyChartData(*chart_number_format)
     series_data = chart_data.add_series(None, *series_number_format)
     xml_writer = _XySeriesXmlWriter(series_data)
     return xml_writer, expected_xml
Exemplo n.º 9
0
def when_I_replace_its_data_with_3_series_of_three_points_each(context):
    chart_data = XyChartData()
    x = y = 0
    for idx in range(3):
        series_title = 'New Series %d' % (idx + 1)
        series = chart_data.add_series(series_title)
        for jdx in range(3):
            x, y = idx * 3 + jdx, idx * 2 + jdx
            series.add_data_point(x, y)

    context.chart.replace_data(chart_data)
Exemplo n.º 10
0
 def yVal_fixture(self, request):
     cht_numfmt, ser_numfmt, expected_numfmt = request.param
     expected_xml = xml(
         'c:yVal/c:numRef/(c:f"Sheet1!$B$2:$B$1",c:numCache/(c:formatCode'
         '"%s",c:ptCount{val=0}))' % expected_numfmt
     )
     chart_number_format = () if cht_numfmt is None else (cht_numfmt,)
     series_number_format = () if ser_numfmt is None else (ser_numfmt,)
     chart_data = XyChartData(*chart_number_format)
     series_data = chart_data.add_series(None, *series_number_format)
     xml_writer = _XySeriesXmlWriter(series_data)
     return xml_writer, expected_xml
Exemplo n.º 11
0
def _build_xy_chart_data(csv, xy_transpose, number_format):
    chart_data = XyChartData()
    for i in range(1, csv.columns.size):
        # nameに日本語が入ると後続処理中で、python v2.7の場合にUnicodeDecodeErrorが出るため対処。nameは結局pptx内では使われない
        series = chart_data.add_series(u"column%s" % i, number_format=_normalize_number_format(number_format))
        xy_col = csv.iloc[:, [0, i]]
        for (_, row) in xy_col.iterrows():
            if xy_transpose:
                y, x = _nan_to_none(row[0]), _nan_to_none(row[1])
            else:
                x, y = _nan_to_none(row[0]), _nan_to_none(row[1])
            log.debug(u" Adding xy %s,%s" % (x, y))
            series.add_data_point(x, y)
    return chart_data
Exemplo n.º 12
0
def when_I_add_an_xy_chart_having_2_series_of_3_points(context, xy_type):
    chart_type = getattr(XL_CHART_TYPE, xy_type)
    data = (('Series 1', ((-0.1, 0.5), (16.2, 0.0), (8.0, 0.2))),
            ('Series 2', ((12.4, 0.8), (-7.5, -0.5), (-5.1, -0.2))))

    chart_data = XyChartData()

    for series_data in data:
        series_label, points = series_data
        series = chart_data.add_series(series_label)
        for point in points:
            x, y = point
            series.add_data_point(x, y)

    context.chart = context.slide.shapes.add_chart(chart_type, Inches(1),
                                                   Inches(1), Inches(8),
                                                   Inches(5), chart_data).chart
Exemplo n.º 13
0
def make_xy_chart_data(ser_count, point_count):
    """
    Return an |XyChartData| object populated with *ser_count* series each
    having *point_count* data points. Values are auto-generated.
    """
    points = (
        (1.1, 11.1), (2.1, 12.1), (3.1, 13.1),
        (1.2, 11.2), (2.2, 12.2), (3.2, 13.2),
    )
    chart_data = XyChartData()
    for i in range(ser_count):
        series_label = 'Series %d' % (i+1)
        series = chart_data.add_series(series_label)
        for j in range(point_count):
            point_idx = (i * point_count) + j
            x, y = points[point_idx]
            series.add_data_point(x, y)
    return chart_data
Exemplo n.º 14
0
def when_I_add_an_xy_chart_having_2_series_of_3_points(context, xy_type):
    chart_type = getattr(XL_CHART_TYPE, xy_type)
    data = (
        ("Series 1", ((-0.1, 0.5), (16.2, 0.0), (8.0, 0.2))),
        ("Series 2", ((12.4, 0.8), (-7.5, -0.5), (-5.1, -0.2))),
    )

    chart_data = XyChartData()

    for series_data in data:
        series_label, points = series_data
        series = chart_data.add_series(series_label)
        for point in points:
            x, y = point
            series.add_data_point(x, y)

    context.chart = context.slide.shapes.add_chart(
        chart_type, Inches(1), Inches(1), Inches(8), Inches(5), chart_data
    ).chart
Exemplo n.º 15
0
def generate_correlation_curve(presentation_context):
    x_label = presentation_context["topic"]
    y_label = presentation_context["seed"]

    if is_too_similar_for_axes(x_label, y_label):
        x_label = _CORRELATION_WORD_GENERATOR(y_label)
    if is_too_similar_for_axes(x_label, y_label):
        x_label = "time"
    presentation_context.update({"x_label": x_label, "y_label": y_label})

    title = correlation_title_generator(presentation_context)

    if not title:
        return None

    chart_data = XyChartData()

    serie = chart_data.add_series("Model")

    # Generate some Xs, with chance of exponential differences in size between generated x axes
    xs = generate_random_x(0, 2**random.uniform(1, 10),
                           int(2**random.uniform(3, 8)))

    # Generate y
    data_points = generate_y(xs, create_interesting_curve_function())

    max_x = max(xs)

    data_points = add_gaussian_noise_to_multidim_points(
        1.5 * random.uniform(0, max_x / 10), data_points)

    # Remove negatives
    data_points = [(abs(datapoint[0]), abs(datapoint[1]))
                   for datapoint in data_points]

    add_data_to_series(serie, data_points)

    return (
        title,
        XL_CHART_TYPE.XY_SCATTER,
        chart_data,
        create_set_scatter_properties(x_label, y_label),
    )
Exemplo n.º 16
0
    def populate_fixture(self, workbook_, worksheet_):
        chart_data = XyChartData()
        series_1 = chart_data.add_series("Series 1")
        for pt in ((1, 1.1), (2, 2.2)):
            series_1.add_data_point(*pt)
        series_2 = chart_data.add_series("Series 2")
        for pt in ((3, 3.3), (4, 4.4)):
            series_2.add_data_point(*pt)

        workbook_writer = XyWorkbookWriter(chart_data)

        expected_calls = [
            call.write_column(1, 0, [1, 2], ANY),
            call.write(0, 1, "Series 1"),
            call.write_column(1, 1, [1.1, 2.2], ANY),
            call.write_column(5, 0, [3, 4], ANY),
            call.write(4, 1, "Series 2"),
            call.write_column(5, 1, [3.3, 4.4], ANY),
        ]
        return workbook_writer, workbook_, worksheet_, expected_calls
Exemplo n.º 17
0
    def populate_fixture(self, workbook_, worksheet_):
        chart_data = XyChartData()
        series_1 = chart_data.add_series('Series 1')
        for pt in ((1, 1.1), (2, 2.2)):
            series_1.add_data_point(*pt)
        series_2 = chart_data.add_series('Series 2')
        for pt in ((3, 3.3), (4, 4.4)):
            series_2.add_data_point(*pt)

        workbook_writer = XyWorkbookWriter(chart_data)

        expected_calls = [
            call.write_column(1, 0, [1, 2], ANY),
            call.write(0, 1, 'Series 1'),
            call.write_column(1, 1, [1.1, 2.2], ANY),
            call.write_column(5, 0, [3, 4], ANY),
            call.write(4, 1, 'Series 2'),
            call.write_column(5, 1, [3.3, 4.4], ANY)
        ]
        return workbook_writer, workbook_, worksheet_, expected_calls
Exemplo n.º 18
0
def make_xy_chart_data(ser_count, point_count):
    """
    Return an |XyChartData| object populated with *ser_count* series each
    having *point_count* data points. Values are auto-generated.
    """
    points = (
        (1.1, 11.1),
        (2.1, 12.1),
        (3.1, 13.1),
        (1.2, 11.2),
        (2.2, 12.2),
        (3.2, 13.2),
    )
    chart_data = XyChartData()
    for i in range(ser_count):
        series_label = "Series %d" % (i + 1)
        series = chart_data.add_series(series_label)
        for j in range(point_count):
            point_idx = (i * point_count) + j
            x, y = points[point_idx]
            series.add_data_point(x, y)
    return chart_data
Exemplo n.º 19
0
def df_to_chartdata(df, datatype, number_format=None):
    '''
    根据给定的图表数据类型生成相应的数据
    Chartdata:一般的数据
    XyChartData: 散点图数据
    BubbleChartData:气泡图数据
    '''
    if isinstance(df, pd.Series):
        df = pd.DataFrame(df)
    df.fillna(0, inplace=True)
    datatype = datatype.lower()
    if datatype == 'chartdata':
        chart_data = ChartData()
        chart_data.categories = ['%s' % (c) for c in list(df.index)]
        for col_name in df.columns:
            chart_data.add_series('%s' % (col_name), list(df[col_name]),
                                  number_format)
        return chart_data
    if datatype == 'xychartdata':
        chart_data = XyChartData()
        if not isinstance(df, list):
            df = [df]
        for d in df:
            series_name = '%s' % (d.columns[0]) + ' vs ' + '%s' % (
                d.columns[1])
            series_ = chart_data.add_series(series_name)
            for i in range(len(d)):
                series_.add_data_point(d.iloc[i, 0], d.iloc[i, 1])
        return chart_data
    if datatype == 'bubblechartdata':
        chart_data = BubbleChartData()
        if not isinstance(df, list):
            df = [df]
        for d in df:
            series_name = '%s' % (d.columns[0]) + ' vs ' + '%s' % (
                d.columns[1])
            series_ = chart_data.add_series(series_name)
            for i in range(len(d)):
                series_.add_data_point(d.iloc[i, 0], d.iloc[i, 1], d.iloc[i,
                                                                          2])
        return chart_data
Exemplo n.º 20
0
    def add_scatter_chart(self, slide, x, y, cx, cy, *series, unit='cm'):
        '''
        Add scatter chart into given slide.

        Args:
            slide: Slide Given slide
            x: x aixs location of chart
            y: float y aixs location of chart
            cx: float Total width of chart
            cy: float Total height of chart
            series: list List of data series, one of each has 2 element: 'series name', 'point list (x, y)'
                    eg: *series = *[('Series 1', [(1.3, 3.6), (2.3, 1.5)]),
                                    ('Series 2', [(-0.5, 1.6), (0.4, 2.9)])]
            unit: str Must 'cm' or 'inches'
        
        Return:
            scatter_chart: Scatter chart
        '''
        x, y, cx, cy = self._convert_nums(x, y, cx, cy, unit=unit)
        chart_data = self._add_series_datapoints(XyChartData(), *series)
        graphic_frame = slide.shapes.add_chart(XL_CHART_TYPE.XY_SCATTER, x, y,
                                               cx, cy, chart_data)
        return graphic_frame.chart
Exemplo n.º 21
0
def given_a_XyChartData_object_with_number_format(context, strval):
    params = {}
    if strval != 'None':
        params['number_format'] = int(strval)
    context.chart_data = XyChartData(**params)
Exemplo n.º 22
0
 def add_series_fixture(self, request, XySeriesData_, series_data_):
     chart_data = XyChartData()
     label = 'Series Label'
     return chart_data, label, XySeriesData_, series_data_
Exemplo n.º 23
0
 def it_is_a__BaseChartData_object(self):
     assert isinstance(XyChartData(), _BaseChartData)
Exemplo n.º 24
0
def add_chart_slide(slide,
                    df,
                    chart_type,
                    title_size=None,
                    text_size=None,
                    ind=None,
                    cols=None,
                    data_labels=None,
                    name=None,
                    legend_pos=None,
                    font=None,
                    datalabel_size=None,
                    hide_zeros=None):
    """
        Add a chart to a slide using a DataFrame
        TODO : create a function to create the ChartData from DF
        TODO : create a function to insert chart in placeholder or frame
        TODO : create a function to apply style to created chart
    """

    if datalabel_size is None:
        datalabel_size = text_size
    if chart_type == CHART.XY_SCATTER:
        data_labels = False

    # Select dataframe slice
    if ind is None:
        ind = (None, None)

    if cols is None:
        cols = (None, None)

    df = df.iloc[ind[0]:ind[1], cols[0]:cols[1]]

    if chart_type == CHART.XY_SCATTER:
        # Create ChartData
        chart_data = XyChartData()
        df = df.fillna(0)
        for ind, row in df.iterrows():
            s = chart_data.add_series(ind)
            s.add_data_point(row[0], row[1])
    else:
        # Create ChartData
        chart_data = ChartData()
        chart_data.categories = list(df.columns)

        # In order to not print 0 data_labels
        if hide_zeros:
            df = df.replace(0, np.nan)
        df = df.fillna('')
        for ind, row in df.iterrows():
            chart_data.add_series(ind, row)

    # Insert chart in slide or placeholder
    try:
        shp = slide.insert_chart(chart_type, chart_data)
    except AttributeError:
        x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
        shp = slide.shapes.add_chart(chart_type, x, y, cx, cy, chart_data)

    # Define chart style

    if name:
        title = shp.chart.chart_title.text_frame
        title.text = name
        for p in title.paragraphs:
            if font:
                p.font.name = font
            if title_size:
                p.font.size = Pt(title_size)

    # Legend
    shp.chart.has_legend = True
    shp.chart.legend.include_in_layout = False
    if legend_pos:
        shp.chart.legend.position = legend_pos

    # Text sizes
    if text_size is not None:
        text_size = Pt(text_size)
        # Lower indexes
        try:
            shp.chart.value_axis.tick_labels.font.size = text_size
        except ValueError:
            ()
        for plot in shp.chart.plots:
            # Legend
            plot.chart.legend.font.size = text_size
            # Indexes
            if chart_type not in [CHART.DOUGHNUT, CHART.PIE]:
                plot.chart.category_axis.tick_labels.font.size = text_size

            try:
                plot.has_data_labels = data_labels
                if plot.has_data_labels:
                    # Numbers in the plot (on the bars)
                    plot.data_labels.font.size = Pt(datalabel_size)
            except AttributeError:
                logging.info('No datalabels available for {} chart'.format(
                    chart_type._member_name))
    return shp
Exemplo n.º 25
0
from pptx import Presentation
from pptx.chart.data import XyChartData, BubbleChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

# create presentation with 1 slide ------
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# define chart data ---------------------
chart_data = XyChartData()

series_1 = chart_data.add_series('Model 1')
series_1.add_data_point(0.7, 2.7)
series_1.add_data_point(1.8, 3.2)
series_1.add_data_point(2.6, 0.8)

series_2 = chart_data.add_series('Model 2')
series_2.add_data_point(1.3, 3.7)
series_2.add_data_point(2.7, 2.3)
series_2.add_data_point(1.6, 1.8)

# add chart to slide --------------------
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

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

prs.save('BubbleChart.pptx')