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
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)
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
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)
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)
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
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
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
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)
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
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
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
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
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
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), )
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
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
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
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
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
def given_a_XyChartData_object_with_number_format(context, strval): params = {} if strval != 'None': params['number_format'] = int(strval) context.chart_data = XyChartData(**params)
def add_series_fixture(self, request, XySeriesData_, series_data_): chart_data = XyChartData() label = 'Series Label' return chart_data, label, XySeriesData_, series_data_
def it_is_a__BaseChartData_object(self): assert isinstance(XyChartData(), _BaseChartData)
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
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')