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