xref: /petsc/src/sys/classes/draw/utils/hists.c (revision 249cb5c497384507c8233e20189d5c9ded68a4fc)
1 
2 /*
3   Contains the data structure for plotting a histogram in a window with an axis.
4 */
5 #include <petscdraw.h>         /*I "petscdraw.h" I*/
6 #include <petsc/private/petscimpl.h>         /*I "petscsys.h" I*/
7 #include <petscviewer.h>         /*I "petscviewer.h" I*/
8 
9 PetscClassId PETSC_DRAWHG_CLASSID = 0;
10 
11 struct _p_PetscDrawHG {
12   PETSCHEADER(int);
13   PetscErrorCode (*destroy)(PetscDrawSP);
14   PetscErrorCode (*view)(PetscDrawSP,PetscViewer);
15   PetscDraw      win;
16   PetscDrawAxis  axis;
17   PetscReal      xmin,xmax;
18   PetscReal      ymin,ymax;
19   int            numBins;
20   int            maxBins;
21   PetscReal      *bins;
22   int            numValues;
23   int            maxValues;
24   PetscReal      *values;
25   int            color;
26   PetscBool      calcStats;
27   PetscBool      integerBins;
28 };
29 
30 #define CHUNKSIZE 100
31 
32 /*@C
33    PetscDrawHGCreate - Creates a histogram data structure.
34 
35    Collective on PetscDraw
36 
37    Input Parameters:
38 +  draw  - The window where the graph will be made
39 -  bins - The number of bins to use
40 
41    Output Parameters:
42 .  hist - The histogram context
43 
44    Notes:
45     The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here http://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
46 
47    The histogram is only displayed when PetscDrawHGDraw() is called.
48 
49    The MPI communicator that owns the PetscDraw owns this PetscDrawHG, but the calls to set options and add data are ignored on all processes except the
50    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawHGDraw() to display the updated graph.
51 
52    Level: intermediate
53 
54    Concepts: histogram^creating
55 
56 .seealso: PetscDrawHGDestroy(), PetscDrawHG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP,
57           PetscDrawHGSetNumberBins(), PetscDrawHGReset(), PetscDrawHGAddValue(), PetscDrawHGDraw(), PetscDrawHGSave(), PetscDrawHGView(), PetscDrawHGSetColor(),
58           PetscDrawHGSetLimits(), PetscDrawHGCalcStats(), PetscDrawHGIntegerBins(), PetscDrawHGGetAxis(), PetscDrawAxis, PetscDrawHGGetDraw()
59 
60 @*/
61 PetscErrorCode  PetscDrawHGCreate(PetscDraw draw,int bins,PetscDrawHG *hist)
62 {
63   PetscDrawHG    h;
64   PetscErrorCode ierr;
65 
66   PetscFunctionBegin;
67   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID,1);
68   PetscValidLogicalCollectiveInt(draw,bins,2);
69   PetscValidPointer(hist,3);
70 
71   ierr = PetscHeaderCreate(h,PETSC_DRAWHG_CLASSID,"DrawHG","Histogram","Draw",PetscObjectComm((PetscObject)draw),PetscDrawHGDestroy,NULL);CHKERRQ(ierr);
72   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
73 
74   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
75   h->win = draw;
76 
77   h->view        = NULL;
78   h->destroy     = NULL;
79   h->color       = PETSC_DRAW_GREEN;
80   h->xmin        = PETSC_MAX_REAL;
81   h->xmax        = PETSC_MIN_REAL;
82   h->ymin        = 0.;
83   h->ymax        = 1.;
84   h->numBins     = bins;
85   h->maxBins     = bins;
86 
87   ierr = PetscMalloc1(h->maxBins,&h->bins);CHKERRQ(ierr);
88 
89   h->numValues   = 0;
90   h->maxValues   = CHUNKSIZE;
91   h->calcStats   = PETSC_FALSE;
92   h->integerBins = PETSC_FALSE;
93 
94   ierr = PetscMalloc1(h->maxValues,&h->values);CHKERRQ(ierr);
95   ierr = PetscLogObjectMemory((PetscObject)h,(h->maxBins + h->maxValues)*sizeof(PetscReal));CHKERRQ(ierr);
96 
97   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
98   ierr = PetscLogObjectParent((PetscObject)h,(PetscObject)h->axis);CHKERRQ(ierr);
99 
100   *hist = h;
101   PetscFunctionReturn(0);
102 }
103 
104 /*@
105    PetscDrawHGSetNumberBins - Change the number of bins that are to be drawn.
106 
107    Logically Collective on PetscDrawHG
108 
109    Input Parameter:
110 +  hist - The histogram context.
111 -  bins  - The number of bins.
112 
113    Level: intermediate
114 
115    Concepts: histogram^setting number of bins
116 
117 .seealso: PetscDrawHGCreate(), PetscDrawHG, PetscDrawHGDraw(), PetscDrawHGIntegerBins()
118 
119 @*/
120 PetscErrorCode  PetscDrawHGSetNumberBins(PetscDrawHG hist, int bins)
121 {
122   PetscErrorCode ierr;
123 
124   PetscFunctionBegin;
125   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
126   PetscValidLogicalCollectiveInt(hist,bins,2);
127 
128   if (hist->maxBins < bins) {
129     ierr = PetscFree(hist->bins);CHKERRQ(ierr);
130     ierr = PetscMalloc1(bins, &hist->bins);CHKERRQ(ierr);
131     ierr = PetscLogObjectMemory((PetscObject)hist, (bins - hist->maxBins) * sizeof(PetscReal));CHKERRQ(ierr);
132     hist->maxBins = bins;
133   }
134   hist->numBins = bins;
135   PetscFunctionReturn(0);
136 }
137 
138 /*@
139   PetscDrawHGReset - Clears histogram to allow for reuse with new data.
140 
141   Logically Collective on PetscDrawHG
142 
143   Input Parameter:
144 . hist - The histogram context.
145 
146   Level: intermediate
147 
148   Concepts: histogram^resetting
149 
150 .seealso: PetscDrawHGCreate(), PetscDrawHG, PetscDrawHGDraw(), PetscDrawHGAddValue()
151 
152 @*/
153 PetscErrorCode  PetscDrawHGReset(PetscDrawHG hist)
154 {
155   PetscFunctionBegin;
156   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
157 
158   hist->xmin      = PETSC_MAX_REAL;
159   hist->xmax      = PETSC_MIN_REAL;
160   hist->ymin      = 0.0;
161   hist->ymax      = 0.0;
162   hist->numValues = 0;
163   PetscFunctionReturn(0);
164 }
165 
166 /*@C
167   PetscDrawHGDestroy - Frees all space taken up by histogram data structure.
168 
169   Collective on PetscDrawHG
170 
171   Input Parameter:
172 . hist - The histogram context
173 
174   Level: intermediate
175 
176 .seealso:  PetscDrawHGCreate(), PetscDrawHG
177 @*/
178 PetscErrorCode  PetscDrawHGDestroy(PetscDrawHG *hist)
179 {
180   PetscErrorCode ierr;
181 
182   PetscFunctionBegin;
183   if (!*hist) PetscFunctionReturn(0);
184   PetscValidHeaderSpecific(*hist,PETSC_DRAWHG_CLASSID,1);
185   if (--((PetscObject)(*hist))->refct > 0) {*hist = NULL; PetscFunctionReturn(0);}
186 
187   ierr = PetscFree((*hist)->bins);CHKERRQ(ierr);
188   ierr = PetscFree((*hist)->values);CHKERRQ(ierr);
189   ierr = PetscDrawAxisDestroy(&(*hist)->axis);CHKERRQ(ierr);
190   ierr = PetscDrawDestroy(&(*hist)->win);CHKERRQ(ierr);
191   ierr = PetscHeaderDestroy(hist);CHKERRQ(ierr);
192   PetscFunctionReturn(0);
193 }
194 
195 /*@
196   PetscDrawHGAddValue - Adds another value to the histogram.
197 
198   Logically Collective on PetscDrawHG
199 
200   Input Parameters:
201 + hist  - The histogram
202 - value - The value
203 
204   Level: intermediate
205 
206   Concepts: histogram^adding values
207 
208 .seealso: PetscDrawHGCreate(), PetscDrawHG, PetscDrawHGDraw(), PetscDrawHGAddValue(), PetscDrawHGReset()
209 @*/
210 PetscErrorCode  PetscDrawHGAddValue(PetscDrawHG hist, PetscReal value)
211 {
212   PetscFunctionBegin;
213   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
214 
215   /* Allocate more memory if necessary */
216   if (hist->numValues >= hist->maxValues) {
217     PetscReal      *tmp;
218     PetscErrorCode ierr;
219 
220     ierr = PetscMalloc1(hist->maxValues+CHUNKSIZE, &tmp);CHKERRQ(ierr);
221     ierr = PetscLogObjectMemory((PetscObject)hist, CHUNKSIZE * sizeof(PetscReal));CHKERRQ(ierr);
222     ierr = PetscMemcpy(tmp, hist->values, hist->maxValues * sizeof(PetscReal));CHKERRQ(ierr);
223     ierr = PetscFree(hist->values);CHKERRQ(ierr);
224 
225     hist->values     = tmp;
226     hist->maxValues += CHUNKSIZE;
227   }
228   /* I disagree with the original Petsc implementation here. There should be no overshoot, but rather the
229      stated convention of using half-open intervals (always the way to go) */
230   if (!hist->numValues) {
231     hist->xmin = value;
232     hist->xmax = value;
233 #if 1
234   } else {
235     /* Update limits */
236     if (value > hist->xmax) hist->xmax = value;
237     if (value < hist->xmin) hist->xmin = value;
238 #else
239   } else if (hist->numValues == 1) {
240     /* Update limits -- We need to overshoot the largest value somewhat */
241     if (value > hist->xmax) hist->xmax = value + 0.001*(value - hist->xmin)/hist->numBins;
242     if (value < hist->xmin) {
243       hist->xmin = value;
244       hist->xmax = hist->xmax + 0.001*(hist->xmax - hist->xmin)/hist->numBins;
245     }
246   } else {
247     /* Update limits -- We need to overshoot the largest value somewhat */
248     if (value > hist->xmax) hist->xmax = value + 0.001*(hist->xmax - hist->xmin)/hist->numBins;
249     if (value < hist->xmin) hist->xmin = value;
250 #endif
251   }
252 
253   hist->values[hist->numValues++] = value;
254   PetscFunctionReturn(0);
255 }
256 
257 /*@
258   PetscDrawHGDraw - Redraws a histogram.
259 
260   Collective on PetscDrawHG
261 
262   Input Parameter:
263 . hist - The histogram context
264 
265   Level: intermediate
266 
267 .seealso: PetscDrawHGCreate(), PetscDrawHG, PetscDrawHGDraw(), PetscDrawHGAddValue(), PetscDrawHGReset()
268 
269 @*/
270 PetscErrorCode  PetscDrawHGDraw(PetscDrawHG hist)
271 {
272   PetscDraw      draw;
273   PetscBool      isnull;
274   PetscReal      xmin,xmax,ymin,ymax,*bins,*values,binSize,binLeft,binRight,maxHeight,mean,var;
275   char           title[256];
276   char           xlabel[256];
277   PetscInt       numBins,numBinsOld,numValues,initSize,i,p,bcolor,color;
278   PetscMPIInt    rank;
279   PetscErrorCode ierr;
280 
281   PetscFunctionBegin;
282   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
283   ierr = PetscDrawIsNull(hist->win,&isnull);CHKERRQ(ierr);
284   if (isnull) PetscFunctionReturn(0);
285   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)hist),&rank);CHKERRQ(ierr);
286 
287   if ((hist->xmin >= hist->xmax) || (hist->ymin >= hist->ymax)) PetscFunctionReturn(0);
288   if (hist->numValues < 1) PetscFunctionReturn(0);
289 
290   color = hist->color;
291   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
292   else bcolor = color;
293 
294   xmin      = hist->xmin;
295   xmax      = hist->xmax;
296   ymin      = hist->ymin;
297   ymax      = hist->ymax;
298   numValues = hist->numValues;
299   values    = hist->values;
300   mean      = 0.0;
301   var       = 0.0;
302 
303   draw = hist->win;
304   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
305   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
306 
307   if (xmin == xmax) {
308     /* Calculate number of points in each bin */
309     bins    = hist->bins;
310     bins[0] = 0.;
311     for (p = 0; p < numValues; p++) {
312       if (values[p] == xmin) bins[0]++;
313       mean += values[p];
314       var  += values[p]*values[p];
315     }
316     maxHeight = bins[0];
317     if (maxHeight > ymax) ymax = hist->ymax = maxHeight;
318     xmax = xmin + 1;
319     ierr = PetscDrawAxisSetLimits(hist->axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr);
320     if (hist->calcStats) {
321       mean /= numValues;
322       if (numValues > 1) var = (var - numValues*mean*mean) / (numValues-1);
323       else var = 0.0;
324       ierr = PetscSNPrintf(title, 256, "Mean: %g  Var: %g", (double)mean, (double)var);CHKERRQ(ierr);
325       ierr = PetscSNPrintf(xlabel,256, "Total: %D", numValues);CHKERRQ(ierr);
326       ierr = PetscDrawAxisSetLabels(hist->axis, title, xlabel, NULL);CHKERRQ(ierr);
327     }
328     ierr = PetscDrawAxisDraw(hist->axis);CHKERRQ(ierr);
329     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
330     if (!rank) { /* Draw bins */
331       binLeft  = xmin;
332       binRight = xmax;
333       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,bins[0],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
334       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,bins[0],PETSC_DRAW_BLACK);CHKERRQ(ierr);
335       ierr = PetscDrawLine(draw,binRight,ymin,binRight,bins[0],PETSC_DRAW_BLACK);CHKERRQ(ierr);
336       ierr = PetscDrawLine(draw,binLeft,bins[0],binRight,bins[0],PETSC_DRAW_BLACK);CHKERRQ(ierr);
337     }
338     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
339   } else {
340     numBins    = hist->numBins;
341     numBinsOld = hist->numBins;
342     if (hist->integerBins && (((int) xmax - xmin) + 1.0e-05 > xmax - xmin)) {
343       initSize = (int) ((int) xmax - xmin)/numBins;
344       while (initSize*numBins != (int) xmax - xmin) {
345         initSize = PetscMax(initSize - 1, 1);
346         numBins  = (int) ((int) xmax - xmin)/initSize;
347         ierr     = PetscDrawHGSetNumberBins(hist, numBins);CHKERRQ(ierr);
348       }
349     }
350     binSize = (xmax - xmin)/numBins;
351     bins    = hist->bins;
352 
353     ierr = PetscMemzero(bins, numBins * sizeof(PetscReal));CHKERRQ(ierr);
354 
355     maxHeight = 0.0;
356     for (i = 0; i < numBins; i++) {
357       binLeft  = xmin + binSize*i;
358       binRight = xmin + binSize*(i+1);
359       for (p = 0; p < numValues; p++) {
360         if ((values[p] >= binLeft) && (values[p] < binRight)) bins[i]++;
361         /* Handle last bin separately */
362         if ((i == numBins-1) && (values[p] == binRight)) bins[i]++;
363         if (!i) {
364           mean += values[p];
365           var  += values[p]*values[p];
366         }
367       }
368       maxHeight = PetscMax(maxHeight, bins[i]);
369     }
370     if (maxHeight > ymax) ymax = hist->ymax = maxHeight;
371 
372     ierr = PetscDrawAxisSetLimits(hist->axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr);
373     if (hist->calcStats) {
374       mean /= numValues;
375       if (numValues > 1) var = (var - numValues*mean*mean) / (numValues-1);
376       else var = 0.0;
377       ierr = PetscSNPrintf(title, 256,"Mean: %g  Var: %g", (double)mean, (double)var);CHKERRQ(ierr);
378       ierr = PetscSNPrintf(xlabel,256, "Total: %D", numValues);CHKERRQ(ierr);
379       ierr = PetscDrawAxisSetLabels(hist->axis, title, xlabel, NULL);CHKERRQ(ierr);
380     }
381     ierr = PetscDrawAxisDraw(hist->axis);CHKERRQ(ierr);
382     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
383     if (!rank) { /* Draw bins */
384       for (i = 0; i < numBins; i++) {
385         binLeft  = xmin + binSize*i;
386         binRight = xmin + binSize*(i+1);
387         ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,bins[i],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
388         ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,bins[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
389         ierr = PetscDrawLine(draw,binRight,ymin,binRight,bins[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
390         ierr = PetscDrawLine(draw,binLeft,bins[i],binRight,bins[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
391         if (color == PETSC_DRAW_ROTATE && bins[i]) bcolor++;
392         if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
393       }
394     }
395     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
396     ierr = PetscDrawHGSetNumberBins(hist,numBinsOld);CHKERRQ(ierr);
397   }
398 
399   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
400   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
401   PetscFunctionReturn(0);
402 }
403 
404 /*@
405   PetscDrawHGSave - Saves a drawn image
406 
407   Collective on PetscDrawHG
408 
409   Input Parameter:
410 . hist - The histogram context
411 
412   Level: intermediate
413 
414   Concepts: histogram^saving
415 
416 .seealso:  PetscDrawHGCreate(), PetscDrawHGGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawHGDraw()
417 @*/
418 PetscErrorCode  PetscDrawHGSave(PetscDrawHG hg)
419 {
420   PetscErrorCode ierr;
421 
422   PetscFunctionBegin;
423   PetscValidHeaderSpecific(hg,PETSC_DRAWHG_CLASSID,1);
424   ierr = PetscDrawSave(hg->win);CHKERRQ(ierr);
425   PetscFunctionReturn(0);
426 }
427 
428 /*@
429   PetscDrawHGView - Prints the histogram information.
430 
431   Not collective
432 
433   Input Parameter:
434 . hist - The histogram context
435 
436   Level: beginner
437 
438 .seealso:  PetscDrawHGCreate(), PetscDrawHGGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawHGDraw()
439 
440 .keywords:  draw, histogram
441 @*/
442 PetscErrorCode  PetscDrawHGView(PetscDrawHG hist,PetscViewer viewer)
443 {
444   PetscReal      xmax,xmin,*bins,*values,binSize,binLeft,binRight,mean,var;
445   PetscErrorCode ierr;
446   PetscInt       numBins,numBinsOld,numValues,initSize,i,p;
447 
448   PetscFunctionBegin;
449   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
450 
451   if ((hist->xmin > hist->xmax) || (hist->ymin >= hist->ymax)) PetscFunctionReturn(0);
452   if (hist->numValues < 1) PetscFunctionReturn(0);
453 
454   if (!viewer){
455     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)hist),&viewer);CHKERRQ(ierr);
456   }
457   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)hist,viewer);CHKERRQ(ierr);
458   xmax      = hist->xmax;
459   xmin      = hist->xmin;
460   numValues = hist->numValues;
461   values    = hist->values;
462   mean      = 0.0;
463   var       = 0.0;
464   if (xmax == xmin) {
465     /* Calculate number of points in the bin */
466     bins    = hist->bins;
467     bins[0] = 0.;
468     for (p = 0; p < numValues; p++) {
469       if (values[p] == xmin) bins[0]++;
470       mean += values[p];
471       var  += values[p]*values[p];
472     }
473     /* Draw bins */
474     ierr = PetscViewerASCIIPrintf(viewer, "Bin %2d (%6.2g - %6.2g): %.0g\n", 0, (double)xmin, (double)xmax, (double)bins[0]);CHKERRQ(ierr);
475   } else {
476     numBins    = hist->numBins;
477     numBinsOld = hist->numBins;
478     if (hist->integerBins && (((int) xmax - xmin) + 1.0e-05 > xmax - xmin)) {
479       initSize = (int) ((int) xmax - xmin)/numBins;
480       while (initSize*numBins != (int) xmax - xmin) {
481         initSize = PetscMax(initSize - 1, 1);
482         numBins  = (int) ((int) xmax - xmin)/initSize;
483         ierr     = PetscDrawHGSetNumberBins(hist, numBins);CHKERRQ(ierr);
484       }
485     }
486     binSize = (xmax - xmin)/numBins;
487     bins    = hist->bins;
488 
489     /* Calculate number of points in each bin */
490     ierr = PetscMemzero(bins, numBins * sizeof(PetscReal));CHKERRQ(ierr);
491     for (i = 0; i < numBins; i++) {
492       binLeft  = xmin + binSize*i;
493       binRight = xmin + binSize*(i+1);
494       for (p = 0; p < numValues; p++) {
495         if ((values[p] >= binLeft) && (values[p] < binRight)) bins[i]++;
496         /* Handle last bin separately */
497         if ((i == numBins-1) && (values[p] == binRight)) bins[i]++;
498         if (!i) {
499           mean += values[p];
500           var  += values[p]*values[p];
501         }
502       }
503     }
504     /* Draw bins */
505     for (i = 0; i < numBins; i++) {
506       binLeft  = xmin + binSize*i;
507       binRight = xmin + binSize*(i+1);
508       ierr = PetscViewerASCIIPrintf(viewer, "Bin %2d (%6.2g - %6.2g): %.0g\n", (int)i, (double)binLeft, (double)binRight, (double)bins[i]);CHKERRQ(ierr);
509     }
510     ierr = PetscDrawHGSetNumberBins(hist, numBinsOld);CHKERRQ(ierr);
511   }
512 
513   if (hist->calcStats) {
514     mean /= numValues;
515     if (numValues > 1) var = (var - numValues*mean*mean) / (numValues-1);
516     else var = 0.0;
517     ierr = PetscViewerASCIIPrintf(viewer, "Mean: %g  Var: %g\n", (double)mean, (double)var);CHKERRQ(ierr);
518     ierr = PetscViewerASCIIPrintf(viewer, "Total: %D\n", numValues);CHKERRQ(ierr);
519   }
520   PetscFunctionReturn(0);
521 }
522 
523 /*@
524   PetscDrawHGSetColor - Sets the color the bars will be drawn with.
525 
526   Logically Collective on PetscDrawHG
527 
528   Input Parameters:
529 + hist - The histogram context
530 - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
531           different color
532 
533   Level: intermediate
534 
535 .seealso:  PetscDrawHGCreate(), PetscDrawHGGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawHGDraw(), PetscDrawHGGetAxis()
536 
537 @*/
538 PetscErrorCode  PetscDrawHGSetColor(PetscDrawHG hist,int color)
539 {
540   PetscFunctionBegin;
541   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
542 
543   hist->color = color;
544   PetscFunctionReturn(0);
545 }
546 
547 /*@
548   PetscDrawHGSetLimits - Sets the axis limits for a histogram. If more
549   points are added after this call, the limits will be adjusted to
550   include those additional points.
551 
552   Logically Collective on PetscDrawHG
553 
554   Input Parameters:
555 + hist - The histogram context
556 - x_min,x_max,y_min,y_max - The limits
557 
558   Level: intermediate
559 
560   Concepts: histogram^setting axis
561 
562 .seealso:  PetscDrawHGCreate(), PetscDrawHGGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawHGDraw(), PetscDrawHGGetAxis()
563 
564 @*/
565 PetscErrorCode  PetscDrawHGSetLimits(PetscDrawHG hist, PetscReal x_min, PetscReal x_max, int y_min, int y_max)
566 {
567   PetscFunctionBegin;
568   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
569 
570   hist->xmin = x_min;
571   hist->xmax = x_max;
572   hist->ymin = y_min;
573   hist->ymax = y_max;
574   PetscFunctionReturn(0);
575 }
576 
577 /*@
578   PetscDrawHGCalcStats - Turns on calculation of descriptive statistics
579 
580   Not collective
581 
582   Input Parameters:
583 + hist - The histogram context
584 - calc - Flag for calculation
585 
586   Level: intermediate
587 
588 .keywords:  draw, histogram, statistics
589 
590 .seealso:  PetscDrawHGCreate(), PetscDrawHGAddValue(), PetscDrawHGView(), PetscDrawHGDraw()
591 
592 @*/
593 PetscErrorCode  PetscDrawHGCalcStats(PetscDrawHG hist, PetscBool calc)
594 {
595   PetscFunctionBegin;
596   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
597 
598   hist->calcStats = calc;
599   PetscFunctionReturn(0);
600 }
601 
602 /*@
603   PetscDrawHGIntegerBins - Turns on integer width bins
604 
605   Not collective
606 
607   Input Parameters:
608 + hist - The histogram context
609 - ints - Flag for integer width bins
610 
611   Level: intermediate
612 
613 .keywords:  draw, histogram, statistics
614 
615 .seealso:  PetscDrawHGCreate(), PetscDrawHGAddValue(), PetscDrawHGView(), PetscDrawHGDraw(), PetscDrawHGSetColor()
616 
617 @*/
618 PetscErrorCode  PetscDrawHGIntegerBins(PetscDrawHG hist, PetscBool ints)
619 {
620   PetscFunctionBegin;
621   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
622 
623   hist->integerBins = ints;
624   PetscFunctionReturn(0);
625 }
626 
627 /*@C
628   PetscDrawHGGetAxis - Gets the axis context associated with a histogram.
629   This is useful if one wants to change some axis property, such as
630   labels, color, etc. The axis context should not be destroyed by the
631   application code.
632 
633   Not Collective, PetscDrawAxis is parallel if PetscDrawHG is parallel
634 
635   Input Parameter:
636 . hist - The histogram context
637 
638   Output Parameter:
639 . axis - The axis context
640 
641   Level: intermediate
642 
643 .seealso:  PetscDrawHGCreate(), PetscDrawHGAddValue(), PetscDrawHGView(), PetscDrawHGDraw(), PetscDrawHGSetColor(), PetscDrawAxis, PetscDrawHGSetLimits()
644 
645 @*/
646 PetscErrorCode  PetscDrawHGGetAxis(PetscDrawHG hist,PetscDrawAxis *axis)
647 {
648   PetscFunctionBegin;
649   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
650   PetscValidPointer(axis,2);
651   *axis = hist->axis;
652   PetscFunctionReturn(0);
653 }
654 
655 /*@C
656   PetscDrawHGGetDraw - Gets the draw context associated with a histogram.
657 
658   Not Collective, PetscDraw is parallel if PetscDrawHG is parallel
659 
660   Input Parameter:
661 . hist - The histogram context
662 
663   Output Parameter:
664 . draw  - The draw context
665 
666   Level: intermediate
667 
668 .seealso:  PetscDrawHGCreate(), PetscDrawHGAddValue(), PetscDrawHGView(), PetscDrawHGDraw(), PetscDrawHGSetColor(), PetscDrawAxis, PetscDrawHGSetLimits()
669 
670 @*/
671 PetscErrorCode  PetscDrawHGGetDraw(PetscDrawHG hist,PetscDraw *draw)
672 {
673   PetscFunctionBegin;
674   PetscValidHeaderSpecific(hist,PETSC_DRAWHG_CLASSID,1);
675   PetscValidPointer(draw,2);
676   *draw = hist->win;
677   PetscFunctionReturn(0);
678 }
679 
680