From 3a8dfc04bfbaf00639b6f45c81c55b7c42a95f64 Mon Sep 17 00:00:00 2001 From: Eero Tamminen Date: Sat, 29 Jan 2005 20:41:22 +0000 Subject: [PATCH] Added Pie chart support to StatisticsChart plugin svn: r3989 --- gramps2/ChangeLog | 6 + gramps2/src/plugins/StatisticsChart.py | 150 ++++++++++++++++++++----- 2 files changed, 128 insertions(+), 28 deletions(-) diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 3da2b07f5..fd55c6d9c 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,9 @@ +2005-01-29 Eero Tamminen + * src/plugins/StatisticsChart.py: + - Added support for Don's Pie charts + color styles for it + - Added bar_items option to decide when Report is going to use + Bar charts and when Pie charts + 2005-01-29 Eero Tamminen * src/plugins/StatisticsChart.py: - Add first versions of following statistics: diff --git a/gramps2/src/plugins/StatisticsChart.py b/gramps2/src/plugins/StatisticsChart.py index 083b9f4f2..ec6694db4 100755 --- a/gramps2/src/plugins/StatisticsChart.py +++ b/gramps2/src/plugins/StatisticsChart.py @@ -447,15 +447,16 @@ class StatisticsChart(Report.Report): filterfun = filters[filter_num] options = options_class.handler.options_dict + self.bar_items = options['bar_items'] year_from = options['year_from'] year_to = options['year_to'] gender = options['gender'] # title needs both data extraction method name + gender name if gender == Person.male: - genders = _("men") + genders = _("Men") elif gender == Person.female: - genders = _("women") + genders = _("Women") else: genders = None @@ -477,11 +478,11 @@ class StatisticsChart(Report.Report): # generate sorted item lookup index index lookup = self.index_items(table[1], sortby, reverse) # document heading - mapping['title'] = table[0] + mapping['chart_title'] = table[0] if genders: - heading = "%(genders)s born %(year_from)04d-%(year_to)04d: %(title)s" % mapping + heading = "%(genders)s born %(year_from)04d-%(year_to)04d: %(chart_title)s" % mapping else: - heading = "Persons born %(year_from)04d-%(year_to)04d: %(title)s" % mapping + heading = "Persons born %(year_from)04d-%(year_to)04d: %(chart_title)s" % mapping self.data.append((heading, table[1], lookup)) #DEBUG #print heading @@ -518,25 +519,13 @@ class StatisticsChart(Report.Report): Define the graphics styles used by the report. Paragraph definitions have already been defined in the document. The styles used are: - SC-bar - A red bar with 0.5pt black line. - SC-text - Contains the SC-Name paragraph style used for - the individual's name SC-title - Contains the SC-Title paragraph style used for the title of the document + SC-text - Contains the SC-Name paragraph style used for + the individual's name + SC-color-N - The colors for drawing pies. + SC-bar - A red bar with 0.5pt black line. """ - g = BaseDoc.GraphicsStyle() - g.set_line_width(0.8) - g.set_color((0,0,0)) - g.set_fill_color((255,0,0)) - self.doc.add_draw_style("SC-bar",g) - - g = BaseDoc.GraphicsStyle() - g.set_paragraph_style("SC-Text") - g.set_color((0,0,0)) - g.set_fill_color((255,255,255)) - g.set_line_width(0) - self.doc.add_draw_style("SC-text",g) - g = BaseDoc.GraphicsStyle() g.set_paragraph_style("SC-Title") g.set_color((0,0,0)) @@ -545,17 +534,111 @@ class StatisticsChart(Report.Report): g.set_width(self.doc.get_usable_width()) self.doc.add_draw_style("SC-title",g) + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style("SC-Text") + g.set_color((0,0,0)) + g.set_fill_color((255,255,255)) + g.set_line_width(0) + self.doc.add_draw_style("SC-text",g) + + width = 0.8 + self.colors = 7 + # red + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((255,0,0)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-0",g) + # green + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((0,255,0)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-1",g) + # blue + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((0,0,255)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-2",g) + # yellow + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((255,255,0)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-3",g) + # purple + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((255,0,255)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-4",g) + # cyan + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((0,255,255)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-5",g) + # gray + g = BaseDoc.GraphicsStyle() + g.set_paragraph_style('SC-Text') + g.set_color((0,0,0)) + g.set_fill_color((200,200,200)) + g.set_line_width(width) + self.doc.add_draw_style("SC-color-6",g) + + g = BaseDoc.GraphicsStyle() + g.set_color((0,0,0)) + g.set_fill_color((255,0,0)) + g.set_line_width(width) + self.doc.add_draw_style("SC-bar",g) + def write_report(self): "output the selected statistics..." for data in self.data: self.doc.start_page() - self.output_chart(data[0], data[1], data[2]) + if len(data[2]) < self.bar_items: + self.output_piechart(data[0], data[1], data[2]) + else: + self.output_barchart(data[0], data[1], data[2]) self.doc.end_page() - def output_chart(self, title, data, lookup): + def output_piechart(self, title, data, lookup): + + # set layout variables + middle = self.doc.get_usable_width() / 2 + + # start output + self.doc.center_text('SC-title', title, middle, 0) + yoffset = ReportUtils.pt2cm(self.doc.style_list['SC-Title'].get_font().get_size()) + + # collect data for output + color = 0 + chart_data = [] + for key in lookup: + style = "SC-color-%d" % color + # graphics style, value, and it's label + chart_data.append((style, data[key], key)) + color = (color+1) % self.colors + + # output data... + radius = middle - 2 + yoffset = yoffset + 1 + radius + ReportUtils.draw_pie_chart(self.doc, middle, yoffset, radius, chart_data, -90) + yoffset = yoffset + radius + 1 + ReportUtils.draw_legend(self.doc, 2, yoffset, chart_data) + + + def output_barchart(self, title, data, lookup): pt2cm = ReportUtils.pt2cm font = self.doc.style_list['SC-Text'].get_font() @@ -626,7 +709,8 @@ class StatisticsChartOptions(ReportOptions.ReportOptions): 'reverse' : 0, 'year_from' : 1700, 'year_to' : time.localtime()[0], - 'no_years' : 0 + 'no_years' : 0, + 'bar_items' : 8 } for key in _Extract.extractors: self.options_dict[key] = 0 @@ -643,11 +727,13 @@ class StatisticsChartOptions(ReportOptions.ReportOptions): ["Do not sort in reverse", "Sort in reverse"], True), 'year_from' : ("=num", "Birth year from which to include people", - "earlier than 'year_to' value"), + "Earlier than 'year_to' value"), 'year_to' : ("=num", "Birth year until which to include people", - "smaller than %d" % self.options_dict['year_to']), + "Smaller than %d" % self.options_dict['year_to']), 'no_years' : ("=0/1", "Whether to include people without birth years", - ["Do not include", "Include"], True) + ["Do not include", "Include"], True), + 'bar_items' : ("=num", "Use barchart instead of piechart with this many or more items", + "Number of items with which piecharts still look good...") } for key in _Extract.extractors: self.options_help[key] = ("=0/1", _Extract.extractors[key][0], @@ -765,6 +851,13 @@ class StatisticsChartOptions(ReportOptions.ReportOptions): tip = _("Select which genders are included into statistics.") dialog.add_option(_("Genders included"), self.gender_menu, tip) + # max. pie item selection + tip = _("With fewer items pie chart and legend will be used instead of a bar chart.") + self.bar_items = gtk.Entry(2) + self.bar_items.set_text(str(self.options_dict['bar_items'])) + dialog.add_option("Min. bar char items", self.bar_items, tip) + + # ------------------------------------------------- # List of available charts on a separate option tab idx = 0 half = (len(_Extract.extractors)+1)/2 @@ -786,7 +879,7 @@ class StatisticsChartOptions(ReportOptions.ReportOptions): hbox.show_all() # Note about children - label = gtk.Label(_("Note that children can be both biological or adopted.")) + label = gtk.Label(_("Note that both biological and adopted children are taken into account.")) dialog.add_frame_option("Chart Selection", "", label) @@ -800,6 +893,7 @@ class StatisticsChartOptions(ReportOptions.ReportOptions): self.options_dict['year_from'] = int(self.from_box.get_text()) self.options_dict['no_years'] = int(self.no_years.get_active()) self.options_dict['gender'] = _options.genders[self.gender_menu.get_active()][0] + self.options_dict['bar_items'] = int(self.bar_items.get_text()) for key in _Extract.extractors: self.options_dict[key] = int(self.charts[key].get_active())