1 /* PSPP - a program for statistical analysis. 2 Copyright (C) 2009, 2011, 2015 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 #ifndef OUTPUT_CAIRO_CHART_H 18 #define OUTPUT_CAIRO_CHART_H 1 19 20 #include <cairo/cairo.h> 21 #include <stdbool.h> 22 #include <stdint.h> 23 #include "libpspp/compiler.h" 24 25 struct chart_item; 26 27 struct xrchart_colour 28 { 29 uint8_t red; 30 uint8_t green; 31 uint8_t blue; 32 }; 33 34 struct xrchart_axis 35 { 36 int data_max; 37 int data_min; 38 39 double scale; 40 double min; 41 double max; 42 }; 43 44 /* The geometry of a chart. */ 45 struct xrchart_geometry 46 { 47 /* Bottom of the abscissa segment */ 48 int abscissa_bottom; 49 50 /* Left of the ordinate segment */ 51 int ordinate_left; 52 53 int title_bottom; 54 55 /* Legend. */ 56 int legend_left; 57 int legend_right; 58 char **dataset; 59 int n_datasets; 60 61 /* Default font size for the plot. */ 62 double font_size; 63 64 struct xrchart_colour fill_colour; 65 66 /* Stuff particular to cartesians and boxplots. */ 67 struct xrchart_axis axis[2]; 68 69 /* True iff a path is currently being drawn */ 70 bool in_path; 71 }; 72 73 void xrchart_geometry_init (cairo_t *, struct xrchart_geometry *, 74 double width, double length); 75 void xrchart_geometry_free (cairo_t *, struct xrchart_geometry *); 76 77 #define XRCHART_N_COLOURS 27 78 extern const struct xrchart_colour data_colour[]; 79 80 enum tick_orientation 81 { 82 SCALE_ABSCISSA=0, 83 SCALE_ORDINATE 84 }; 85 86 enum xrmarker_type 87 { 88 XRMARKER_CIRCLE, /* Hollow circle. */ 89 XRMARKER_ASTERISK, /* Asterisk (*). */ 90 XRMARKER_SQUARE /* Hollow square. */ 91 }; 92 93 void xrchart_draw_marker (cairo_t *, double x, double y, enum xrmarker_type, 94 double size); 95 96 void xrchart_label (cairo_t *, int horz_justify, int vert_justify, 97 double font_size, const char *); 98 99 void xrchart_label_rotate (cairo_t *cr, int horz_justify, int vert_justify, 100 double font_size, const char *string, double angle); 101 102 103 /* Draw a tick mark at position 104 If label is non zero, then print it at the tick mark 105 */ 106 void draw_tick (cairo_t *, const struct xrchart_geometry *, 107 enum tick_orientation orientation, 108 bool rotated, 109 double position, 110 const char *label, ...) 111 PRINTF_FORMAT (6, 7); 112 113 114 /* Write the title on a chart*/ 115 void xrchart_write_title (cairo_t *, const struct xrchart_geometry *, 116 const char *title, ...) 117 PRINTF_FORMAT (3, 4); 118 119 /* Set the scale for the abscissa */ 120 bool xrchart_write_xscale (cairo_t *, struct xrchart_geometry *, 121 double min, double max) WARN_UNUSED_RESULT; 122 123 /* Set the scale for the ordinate */ 124 bool xrchart_write_yscale (cairo_t *, struct xrchart_geometry *, 125 double smin, double smax) WARN_UNUSED_RESULT; 126 127 void xrchart_write_xlabel (cairo_t *, const struct xrchart_geometry *, 128 const char *label) ; 129 130 /* Write the ordinate label */ 131 void xrchart_write_ylabel (cairo_t *, const struct xrchart_geometry *, 132 const char *label); 133 134 void xrchart_write_legend (cairo_t *, const struct xrchart_geometry *); 135 136 enum xrchart_dim 137 { 138 XRCHART_DIM_X, 139 XRCHART_DIM_Y 140 }; 141 142 void xrchart_vector_start (cairo_t *, struct xrchart_geometry *, 143 const char *name); 144 void xrchart_vector_end (cairo_t *, struct xrchart_geometry *); 145 void xrchart_vector (cairo_t *, struct xrchart_geometry *, double x, double y); 146 147 /* Plot a data point */ 148 void xrchart_datum (cairo_t *, const struct xrchart_geometry *, 149 int dataset UNUSED, double x, double y); 150 151 /* Draw a line with slope SLOPE and intercept INTERCEPT. 152 between the points limit1 and limit2. 153 If lim_dim is XRCHART_DIM_Y then the limit{1,2} are on the 154 y axis otherwise the x axis 155 */ 156 void xrchart_line (cairo_t *, const struct xrchart_geometry *, 157 double slope, double intercept, 158 double limit1, double limit2, enum xrchart_dim lim_dim); 159 160 /* Drawing various kinds of charts. */ 161 void xrchart_draw_boxplot (const struct chart_item *, cairo_t *, 162 struct xrchart_geometry *); 163 void xrchart_draw_roc (const struct chart_item *, cairo_t *, 164 struct xrchart_geometry *); 165 void xrchart_draw_piechart (const struct chart_item *, cairo_t *, 166 struct xrchart_geometry *); 167 void xrchart_draw_barchart (const struct chart_item *, cairo_t *, 168 struct xrchart_geometry *); 169 void xrchart_draw_histogram (const struct chart_item *, cairo_t *, 170 struct xrchart_geometry *); 171 void xrchart_draw_np_plot (const struct chart_item *, cairo_t *, 172 struct xrchart_geometry *); 173 void xrchart_draw_scree (const struct chart_item *, cairo_t *, 174 struct xrchart_geometry *); 175 void xrchart_draw_spreadlevel (const struct chart_item *, cairo_t *, 176 struct xrchart_geometry *); 177 void xrchart_draw_scatterplot (const struct chart_item *, cairo_t *, 178 struct xrchart_geometry *); 179 180 #endif /* output/cairo-chart.h */ 181