From d81a8d5168f18eb59d216dd8872c1deb2d47a73d Mon Sep 17 00:00:00 2001 From: Nicholas Lewin-Koh Date: Wed, 21 May 2008 00:00:00 +0000 Subject: [PATCH] version 1.17.0 --- ChangeLog | 54 +++ DESCRIPTION | 15 + NAMESPACE | 86 ++++ R/BTC.R | 268 ++++++++++++ R/BTY.R | 266 ++++++++++++ R/HO.R | 267 ++++++++++++ R/LINGRAY.R | 111 +++++ R/LOCS.R | 266 ++++++++++++ R/MAG.R | 266 ++++++++++++ R/RB.R | 266 ++++++++++++ R/grid.hexagons.R | 364 ++++++++++++++++ R/grid.hexlegend.R | 157 +++++++ R/hbox.R | 83 ++++ R/hdiffplot.R | 330 +++++++++++++++ R/hexPlotMA.R | 191 +++++++++ R/hexViewport.R | 250 +++++++++++ R/hexbin.s4.R | 349 ++++++++++++++++ R/hexbinList.R | 106 +++++ R/hexbinplot.R | 777 +++++++++++++++++++++++++++++++++++ R/hexpanel.R | 34 ++ R/hexplom.R | 348 ++++++++++++++++ R/hexutil.R | 122 ++++++ R/smoothHexbin.R | 46 +++ README-R | 43 ++ TODO | 31 ++ data/NHANES.rda | Bin 0 -> 162590 bytes inst/doc/hexagon_binning.Rnw | 498 ++++++++++++++++++++++ inst/doc/hexagon_binning.pdf | Bin 0 -> 1427198 bytes man/NHANES.Rd | 60 +++ man/colramp.Rd | 58 +++ man/erode.hexbin.Rd | 85 ++++ man/getHMedian.Rd | 34 ++ man/gplot.hexbin.Rd | 144 +++++++ man/grid.hexagons.Rd | 198 +++++++++ man/grid.hexlegend.Rd | 81 ++++ man/hboxplot.Rd | 97 +++++ man/hcell2xy.Rd | 63 +++ man/hcell2xyInt.Rd | 47 +++ man/hdiffplot.Rd | 134 ++++++ man/hexGraphPaper.Rd | 66 +++ man/hexList.Rd | 50 +++ man/hexMA.loess.Rd | 42 ++ man/hexTapply.Rd | 58 +++ man/hexVP-class.Rd | 71 ++++ man/hexVP.abline.Rd | 47 +++ man/hexViewport.Rd | 56 +++ man/hexbin.Rd | 110 +++++ man/hexbinplot.Rd | 222 ++++++++++ man/hexplom.Rd | 95 +++++ man/hexpolygon.Rd | 77 ++++ man/hsmooth-methods.Rd | 28 ++ man/inout.hex.Rd | 31 ++ man/list2hexList.Rd | 25 ++ man/old-classes.Rd | 24 ++ man/optShape.Rd | 49 +++ man/panel.hexboxplot.Rd | 49 +++ man/panel.hexgrid.Rd | 25 ++ man/panel.hexloess.Rd | 39 ++ man/plotMAhex.Rd | 133 ++++++ man/pushHexport.Rd | 28 ++ man/smooth.hexbin.Rd | 84 ++++ src/hbin.f | 88 ++++ src/hcell.f | 62 +++ src/herode.f | 245 +++++++++++ src/hsm.f | 114 +++++ tests/hdiffplot.R | 36 ++ tests/hdiffplot.Rout.save | 155 +++++++ tests/hray.R | 31 ++ tests/large.R | 39 ++ tests/viewp-ex.R | 20 + was-R_zzz.R | 10 + 71 files changed, 8804 insertions(+) create mode 100644 ChangeLog create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 R/BTC.R create mode 100644 R/BTY.R create mode 100644 R/HO.R create mode 100644 R/LINGRAY.R create mode 100644 R/LOCS.R create mode 100644 R/MAG.R create mode 100644 R/RB.R create mode 100644 R/grid.hexagons.R create mode 100644 R/grid.hexlegend.R create mode 100644 R/hbox.R create mode 100644 R/hdiffplot.R create mode 100644 R/hexPlotMA.R create mode 100644 R/hexViewport.R create mode 100644 R/hexbin.s4.R create mode 100644 R/hexbinList.R create mode 100644 R/hexbinplot.R create mode 100644 R/hexpanel.R create mode 100644 R/hexplom.R create mode 100644 R/hexutil.R create mode 100644 R/smoothHexbin.R create mode 100644 README-R create mode 100644 TODO create mode 100644 data/NHANES.rda create mode 100644 inst/doc/hexagon_binning.Rnw create mode 100644 inst/doc/hexagon_binning.pdf create mode 100644 man/NHANES.Rd create mode 100644 man/colramp.Rd create mode 100644 man/erode.hexbin.Rd create mode 100644 man/getHMedian.Rd create mode 100644 man/gplot.hexbin.Rd create mode 100644 man/grid.hexagons.Rd create mode 100644 man/grid.hexlegend.Rd create mode 100644 man/hboxplot.Rd create mode 100644 man/hcell2xy.Rd create mode 100644 man/hcell2xyInt.Rd create mode 100644 man/hdiffplot.Rd create mode 100644 man/hexGraphPaper.Rd create mode 100644 man/hexList.Rd create mode 100644 man/hexMA.loess.Rd create mode 100644 man/hexTapply.Rd create mode 100644 man/hexVP-class.Rd create mode 100644 man/hexVP.abline.Rd create mode 100644 man/hexViewport.Rd create mode 100644 man/hexbin.Rd create mode 100644 man/hexbinplot.Rd create mode 100644 man/hexplom.Rd create mode 100644 man/hexpolygon.Rd create mode 100644 man/hsmooth-methods.Rd create mode 100644 man/inout.hex.Rd create mode 100644 man/list2hexList.Rd create mode 100644 man/old-classes.Rd create mode 100644 man/optShape.Rd create mode 100644 man/panel.hexboxplot.Rd create mode 100644 man/panel.hexgrid.Rd create mode 100644 man/panel.hexloess.Rd create mode 100644 man/plotMAhex.Rd create mode 100644 man/pushHexport.Rd create mode 100644 man/smooth.hexbin.Rd create mode 100644 src/hbin.f create mode 100644 src/hcell.f create mode 100644 src/herode.f create mode 100644 src/hsm.f create mode 100644 tests/hdiffplot.R create mode 100644 tests/hdiffplot.Rout.save create mode 100644 tests/hray.R create mode 100644 tests/large.R create mode 100644 tests/viewp-ex.R create mode 100755 was-R_zzz.R diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..4de539b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,54 @@ +2008-04-28 Martin Maechler + + * DESCRIPTION (Version): 1.13.4 + + * man/*.Rd: fixes to several man pages; + note that gplot.hexbin() now is *deprecated* ! + +2008-03-18 Patrick Aboyoun + + * man/panel.hexboxplot, man/panel.hexgrid, man/panel.hexloess: Added more information to man files. + * R/hexbinplot.R (panel.hexboxplot): removed unused singles argument. + +2008-03-12 Patrick Aboyoun + + * R/hexViewport.R (hexVP.abline): Fixed the handling of non-model objects as input. + +2008-02-28 Patrick Aboyoun + + * R/hexPlotMA.R (plotMAhex): Require users to specify status explicitly + rather than as the component MA$genes$Status + * R/hexPlotMA.R (plotMAhex): Replaced support of Biobase class exprSet with + ExpressionSet + +2006-09-28 Martin Maechler + + * NAMESPACE: add full list of colorspace dependencies + +2005-07-26 Martin Maechler + + * R/hexViewport.R (smartBnds): some rationalization + * R/hexViewport.R (rname): dito + +2005-07-19 Martin Maechler + + * DESCRIPTION (Version): 1.3.1 (not to confuse with the previous one). + + * man/gplot.hexbin.Rd: fix typo and usage for S4method + + * R/hexPlotMA.R (hexMA.loess): add argument 'n' + + * R/hexViewport.R (hexVP.loess): add argument 'n'; other "white + space cosmetic" in file + +2005-10-21 Nicholas Lewin-Koh + + * added Deepayan Sarkar's hexbinplot.R function for lattice hexbin + plots + + * Added my Hexplom function based on Deepayan's code + +2005-10-27 Nicholas Lewin-Koh + + * Added more panel functions, for hexboxplots and hdiffplots. + diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..735fb51 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,15 @@ +Package: hexbin +Version: 1.17.0 +Date: 2008-05-21 +Title: Hexagonal Binning Routines +Author: Dan Carr , ported by Nicholas + Lewin-Koh and Martin Maechler +Maintainer: Nicholas Lewin-Koh +Depends: R (>= 2.0.1), methods, stats, grid, lattice +Suggests: marray, cluster, affy, Biobase +Description: Binning and plotting functions for hexagonal bins. Now + uses and relies on grid graphics and formal (S4) classes and + methods. +Collate: BTC.R BTY.R grid.hexagons.R grid.hexlegend.R hbox.R hdiffplot.R hexbinList.R hexbinplot.R hexbin.s4.R hexpanel.R hexplom.R hexPlotMA.R hexutil.R hexViewport.R HO.R LINGRAY.R LOCS.R MAG.R RB.R smoothHexbin.R +License: GPL 2 +Packaged: Tue Dec 2 22:38:34 2008; nikko diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..419eba2 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,86 @@ +useDynLib(hexbin) + +import(grid) ## too many things from grid +import(lattice) ## too many things from lattice +importFrom("graphics", plot) +#importFrom(colorspace, "HSV", "LUV", "coords", "hex") + +## Generics and functions defined in this package +export( + "erode", + "erode.hexbin", + "getHMedian", +## document those; the method aliases are there: +## "getFig", "getMargins", "getPlt", "getXscale", "getYscale", + "gplot.hexbin", + "grid.hexagons", + "grid.hexlegend", + "hboxplot", + "hcell2xy", + "hexbin", + "hexcoords", + "hexList", + "hexpolygon", + "hexViewport", + "hexVP.abline", + "plotMAhex", + "hexVP.loess", + "hexMA.loess", + "hsmooth", + "list2hexList", + "pushHexport", + "smooth.hexbin", + "hdiffplot", # but not all the helpers in ./R/hdiffplot.R + ## Stuff in hexutils + "hcell2xyInt", + "hgridcent", + "hexGraphPaper", + "hexTapply", + "optShape", + "inout.hex", + ## color stuff + "BTC", "BTY", "LinGray", "LinOCS", "heat.ob", "magent","plinrain", + + ## Lattice stuff: + + ## high-level functions + "hexbinplot", "hexplom", + + ## panel functions + "panel.hexbinplot", "panel.hexplom", "panel.hexboxplot", + "panel.hexgrid","panel.hexloess", + + ## utilities + "hexlegendGrob") + + +## S3 methods for lattice-type functions + +S3method("hexbinplot", "formula") +S3method("hexplom", "formula") +S3method("hexplom", "matrix") +S3method("hexplom", "data.frame") + + + +exportClasses("hexbin", + "erodebin", + "smoothbin", + "hexVP", + # could/should we keep this 'private' (?) : + "integer or NULL", + "hexbinList" + ) + +exportMethods( + "erode", +## undocumented: "getFig", "getMargins", "getPlt", "getXscale", "getYscale", + "hsmooth", + + "plot", + "summary", + "show", + "coerce" + ) + + diff --git a/R/BTC.R b/R/BTC.R new file mode 100644 index 0000000..5457fd8 --- /dev/null +++ b/R/BTC.R @@ -0,0 +1,268 @@ +BTC <- function(n, beg = 1, end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(0,0,0), + c(0,0,40), + c(0,4,56), + c(0,9,61), + c(0,12,64), + c(0,14,66), + c(0,17,69), + c(0,20,73), + c(0,22,74), + c(0,25,78), + c(0,27,79), + c(0,30,83), + c(0,31,85), + c(0,33,86), + c(0,36,90), + c(0,38,91), + c(0,39,93), + c(0,41,95), + c(0,43,96), + c(0,46,100), + c(0,47,102), + c(0,49,103), + c(0,51,105), + c(0,52,107), + c(0,54,108), + c(0,55,110), + c(0,57,112), + c(0,57,112), + c(0,58,113), + c(0,60,115), + c(0,62,117), + c(0,63,119), + c(0,65,120), + c(0,66,122), + c(0,68,124), + c(0,70,125), + c(0,71,127), + c(0,73,129), + c(0,73,129), + c(0,74,130), + c(0,76,132), + c(0,78,134), + c(0,79,136), + c(0,81,137), + c(0,82,139), + c(0,84,141), + c(0,86,142), + c(0,87,144), + c(0,89,146), + c(0,90,147), + c(0,92,149), + c(0,94,151), + c(0,94,151), + c(0,95,153), + c(0,97,154), + c(0,98,156), + c(0,100,158), + c(0,102,159), + c(0,103,161), + c(0,105,163), + c(0,106,164), + c(0,108,166), + c(0,109,168), + c(0,111,170), + c(0,113,171), + c(0,114,173), + c(0,116,175), + c(0,117,176), + c(0,119,178), + c(0,121,180), + c(0,121,180), + c(0,122,181), + c(0,124,183), + c(0,125,185), + c(0,127,187), + c(0,129,188), + c(0,130,190), + c(0,132,192), + c(0,133,193), + c(0,135,195), + c(0,137,197), + c(0,138,198), + c(0,140,200), + c(0,141,202), + c(0,143,204), + c(0,143,204), + c(0,145,205), + c(0,146,207), + c(0,148,209), + c(0,149,210), + c(0,151,212), + c(0,153,214), + c(0,154,215), + c(0,156,217), + c(0,157,219), + c(0,159,221), + c(0,160,222), + c(0,160,222), + c(0,162,224), + c(0,164,226), + c(0,165,227), + c(0,167,229), + c(0,168,231), + c(0,170,232), + c(0,172,234), + c(0,173,236), + c(0,175,238), + c(0,175,238), + c(0,176,239), + c(0,178,241), + c(0,180,243), + c(0,181,244), + c(0,183,246), + c(2,184,248), + c(4,186,249), + c(4,186,249), + c(4,186,249), + c(6,188,251), + c(6,188,251), + c(9,189,253), + c(9,189,253), + c( 11,191,255), + c( 11,191,255), + c( 13,192,255), + c( 13,192,255), + c( 13,192,255), + c( 16,194,255), + c( 18,196,255), + c( 20,197,255), + c( 20,197,255), + c( 23,199,255), + c( 25,200,255), + c( 27,202,255), + c( 30,204,255), + c( 32,205,255), + c( 34,207,255), + c( 37,208,255), + c( 37,208,255), + c( 39,210,255), + c( 41,211,255), + c( 44,213,255), + c( 46,215,255), + c( 48,216,255), + c( 51,218,255), + c( 53,219,255), + c( 53,219,255), + c( 55,221,255), + c( 57,223,255), + c( 60,224,255), + c( 62,226,255), + c( 64,227,255), + c( 67,229,255), + c( 67,229,255), + c( 69,231,255), + c( 71,232,255), + c( 74,234,255), + c( 76,235,255), + c( 78,237,255), + c( 81,239,255), + c( 81,239,255), + c( 83,240,255), + c( 85,242,255), + c( 88,243,255), + c( 90,245,255), + c( 92,247,255), + c( 95,248,255), + c( 95,248,255), + c( 97,250,255), + c( 99,251,255), + c(102,253,255), + c(104,255,255), + c(106,255,255), + c(106,255,255), + c(108,255,255), + c(111,255,255), + c(113,255,255), + c(115,255,255), + c(115,255,255), + c(118,255,255), + c(120,255,255), + c(122,255,255), + c(122,255,255), + c(125,255,255), + c(127,255,255), + c(129,255,255), + c(129,255,255), + c(132,255,255), + c(134,255,255), + c(136,255,255), + c(136,255,255), + c(139,255,255), + c(141,255,255), + c(143,255,255), + c(143,255,255), + c(146,255,255), + c(148,255,255), + c(150,255,255), + c(150,255,255), + c(153,255,255), + c(155,255,255), + c(155,255,255), + c(157,255,255), + c(159,255,255), + c(159,255,255), + c(162,255,255), + c(164,255,255), + c(164,255,255), + c(166,255,255), + c(169,255,255), + c(171,255,255), + c(171,255,255), + c(173,255,255), + c(176,255,255), + c(176,255,255), + c(178,255,255), + c(180,255,255), + c(180,255,255), + c(183,255,255), + c(185,255,255), + c(185,255,255), + c(187,255,255), + c(190,255,255), + c(190,255,255), + c(192,255,255), + c(194,255,255), + c(197,255,255), + c(197,255,255), + c(199,255,255), + c(201,255,255), + c(204,255,255), + c(204,255,255), + c(206,255,255), + c(208,255,255), + c(210,255,255), + c(210,255,255), + c(213,255,255), + c(215,255,255), + c(217,255,255), + c(217,255,255), + c(220,255,255), + c(222,255,255), + c(224,255,255), + c(227,255,255), + c(229,255,255), + c(229,255,255), + c(231,255,255), + c(234,255,255), + c(236,255,255), + c(238,255,255), + c(241,255,255), + c(243,255,255), + c(243,255,255), + c(245,255,255), + c(248,255,255), + c(250,255,255), + c(255,255,255))[ round(seq(beg,end, length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} + + diff --git a/R/BTY.R b/R/BTY.R new file mode 100644 index 0000000..954c2a3 --- /dev/null +++ b/R/BTY.R @@ -0,0 +1,266 @@ +BTY <- function(n, beg = 1, end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(7,7,254), + c(23,23,252), + c(30,30,250), + c(36,36,248), + c(40,40,247), + c(44,44,245), + c(47,47,243), + c(50,50,242), + c(52,52,240), + c(55,55,239), + c(57,57,238), + c(59,59,236), + c(61,61,235), + c(63,63,234), + c(65,65,233), + c(66,66,231), + c(68,68,230), + c(69,69,229), + c(71,71,228), + c(72,72,227), + c(74,74,226), + c(75,75,225), + c(76,76,225), + c(78,78,224), + c(79,79,223), + c(80,80,222), + c(81,81,221), + c(82,82,221), + c(84,84,220), + c(85,85,219), + c(86,86,218), + c(87,87,218), + c(88,88,217), + c(89,89,216), + c(90,90,216), + c(91,91,215), + c(92,92,214), + c(93,93,214), + c(94,94,213), + c(95,95,213), + c(96,96,212), + c(97,97,212), + c(98,98,211), + c(98,98,210), + c(99,99,210), + c(100,100,209), + c(101,101,209), + c(102,102,208), + c(103,103,208), + c(104,104,208), + c(105,105,207), + c(105,105,207), + c(106,106,206), + c(107,107,206), + c(108,108,205), + c(109,109,205), + c(110,110,204), + c(110,110,204), + c(111,111,204), + c(112,112,203), + c(113,113,203), + c(114,114,202), + c(114,114,202), + c(115,115,202), + c(116,116,201), + c(117,117,201), + c(118,118,200), + c(118,118,200), + c(119,119,200), + c(120,120,199), + c(121,121,199), + c(121,121,199), + c(122,122,198), + c(123,123,198), + c(124,124,198), + c(124,124,197), + c(125,125,197), + c(126,126,197), + c(127,127,196), + c(128,128,196), + c(128,128,195), + c(129,129,195), + c(130,130,195), + c(130,130,194), + c(131,131,194), + c(132,132,194), + c(133,133,193), + c(133,133,193), + c(134,134,193), + c(135,135,192), + c(136,136,192), + c(136,136,192), + c(137,137,191), + c(138,138,191), + c(139,139,191), + c(139,139,190), + c(140,140,190), + c(141,141,190), + c(142,142,189), + c(142,142,189), + c(143,143,189), + c(144,144,188), + c(144,144,188), + c(145,145,188), + c(146,146,187), + c(147,147,187), + c(147,147,187), + c(148,148,186), + c(149,149,186), + c(149,149,186), + c(150,150,185), + c(151,151,185), + c(152,152,185), + c(152,152,184), + c(153,153,184), + c(154,154,184), + c(154,154,183), + c(155,155,183), + c(156,156,182), + c(157,157,182), + c(157,157,182), + c(158,158,181), + c(159,159,181), + c(159,159,181), + c(160,160,180), + c(161,161,180), + c(162,162,180), + c(162,162,179), + c(163,163,179), + c(164,164,178), + c(164,164,178), + c(165,165,178), + c(166,166,177), + c(167,167,177), + c(167,167,176), + c(168,168,176), + c(169,169,176), + c(169,169,175), + c(170,170,175), + c(171,171,174), + c(172,172,174), + c(172,172,173), + c(173,173,173), + c(174,174,173), + c(174,174,172), + c(175,175,172), + c(176,176,171), + c(177,177,171), + c(177,177,170), + c(178,178,170), + c(179,179,169), + c(179,179,169), + c(180,180,168), + c(181,181,168), + c(181,181,167), + c(182,182,167), + c(183,183,166), + c(184,184,166), + c(184,184,165), + c(185,185,165), + c(186,186,164), + c(186,186,164), + c(187,187,163), + c(188,188,163), + c(189,189,162), + c(189,189,162), + c(190,190,161), + c(191,191,161), + c(191,191,160), + c(192,192,159), + c(193,193,159), + c(194,194,158), + c(194,194,158), + c(195,195,157), + c(196,196,157), + c(196,196,156), + c(197,197,155), + c(198,198,155), + c(199,199,154), + c(199,199,153), + c(200,200,153), + c(201,201,152), + c(201,201,151), + c(202,202,151), + c(203,203,150), + c(204,204,149), + c(204,204,149), + c(205,205,148), + c(206,206,147), + c(206,206,146), + c(207,207,146), + c(208,208,145), + c(209,209,144), + c(209,209,143), + c(210,210,143), + c(211,211,142), + c(211,211,141), + c(212,212,140), + c(213,213,139), + c(214,214,138), + c(214,214,138), + c(215,215,137), + c(216,216,136), + c(216,216,135), + c(217,217,134), + c(218,218,133), + c(219,219,132), + c(219,219,131), + c(220,220,130), + c(221,221,129), + c(221,221,128), + c(222,222,127), + c(223,223,126), + c(224,224,125), + c(224,224,124), + c(225,225,123), + c(226,226,122), + c(226,226,121), + c(227,227,119), + c(228,228,118), + c(229,229,117), + c(229,229,116), + c(230,230,114), + c(231,231,113), + c(232,232,112), + c(232,232,110), + c(233,233,109), + c(234,234,107), + c(234,234,106), + c(235,235,104), + c(236,236,103), + c(237,237,101), + c(237,237,100), + c(238,238,98), + c(239,239,96), + c(239,239,94), + c(240,240,92), + c(241,241,91), + c(242,242,89), + c(242,242,86), + c(243,243,84), + c(244,244,82), + c(245,245,80), + c(245,245,77), + c(246,246,74), + c(247,247,72), + c(247,247,69), + c(248,248,65), + c(249,249,62), + c(250,250,58), + c(250,250,54), + c(251,251,49), + c(252,252,44), + c(253,253,37), + c(253,253,28), + c(254,254,13))[ round(seq(beg,end, length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} diff --git a/R/HO.R b/R/HO.R new file mode 100644 index 0000000..c73a470 --- /dev/null +++ b/R/HO.R @@ -0,0 +1,267 @@ +heat.ob <- function(n,beg = 1,end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(0, 0, 0), + c(35, 0, 0), + c(52, 0, 0), + c(60, 0, 0), + c(63, 1, 0), + c(64, 2, 0), + c(68, 5, 0), + c(69, 6, 0), + c(72, 8, 0), + c(74,10, 0), + c(77,12, 0), + c(78,14, 0), + c(81,16, 0), + c(83,17, 0), + c(85,19, 0), + c(86,20, 0), + c(89,22, 0), + c(91,24, 0), + c(92,25, 0), + c(94,26, 0), + c(95,28, 0), + c(98,30, 0), + c(100,31, 0), + c(102,33, 0), + c(103,34, 0), + c(105,35, 0), + c(106,36, 0), + c(108,38, 0), + c(109,39, 0), + c(111,40, 0), + c(112,42, 0), + c(114,43, 0), + c(115,44, 0), + c(117,45, 0), + c(119,47, 0), + c(119,47, 0), + c(120,48, 0), + c(122,49, 0), + c(123,51, 0), + c(125,52, 0), + c(125,52, 0), + c(126,53, 0), + c(128,54, 0), + c(129,56, 0), + c(129,56, 0), + c(131,57, 0), + c(132,58, 0), + c(134,59, 0), + c(134,59, 0), + c(136,61, 0), + c(137,62, 0), + c(137,62, 0), + c(139,63, 0), + c(139,63, 0), + c(140,65, 0), + c(142,66, 0), + c(142,66, 0), + c(143,67, 0), + c(143,67, 0), + c(145,68, 0), + c(145,68, 0), + c(146,70, 0), + c(146,70, 0), + c(148,71, 0), + c(148,71, 0), + c(149,72, 0), + c(149,72, 0), + c(151,73, 0), + c(151,73, 0), + c(153,75, 0), + c(153,75, 0), + c(154,76, 0), + c(154,76, 0), + c(154,76, 0), + c(156,77, 0), + c(156,77, 0), + c(157,79, 0), + c(157,79, 0), + c(159,80, 0), + c(159,80, 0), + c(159,80, 0), + c(160,81, 0), + c(160,81, 0), + c(162,82, 0), + c(162,82, 0), + c(163,84, 0), + c(163,84, 0), + c(165,85, 0), + c(165,85, 0), + c(166,86, 0), + c(166,86, 0), + c(166,86, 0), + c(168,87, 0), + c(168,87, 0), + c(170,89, 0), + c(170,89, 0), + c(171,90, 0), + c(171,90, 0), + c(173,91, 0), + c(173,91, 0), + c(174,93, 0), + c(174,93, 0), + c(176,94, 0), + c(176,94, 0), + c(177,95, 0), + c(177,95, 0), + c(179,96, 0), + c(179,96, 0), + c(180,98, 0), + c(182,99, 0), + c(182,99, 0), + c(183,100, 0), + c(183,100, 0), + c(185,102, 0), + c(185,102, 0), + c(187,103, 0), + c(187,103, 0), + c(188,104, 0), + c(188,104, 0), + c(190,105, 0), + c(191,107, 0), + c(191,107, 0), + c(193,108, 0), + c(193,108, 0), + c(194,109, 0), + c(196,110, 0), + c(196,110, 0), + c(197,112, 0), + c(197,112, 0), + c(199,113, 0), + c(200,114, 0), + c(200,114, 0), + c(202,116, 0), + c(202,116, 0), + c(204,117, 0), + c(205,118, 0), + c(205,118, 0), + c(207,119, 0), + c(208,121, 0), + c(208,121, 0), + c(210,122, 0), + c(211,123, 0), + c(211,123, 0), + c(213,124, 0), + c(214,126, 0), + c(214,126, 0), + c(216,127, 0), + c(217,128, 0), + c(217,128, 0), + c(219,130, 0), + c(221,131, 0), + c(221,131, 0), + c(222,132, 0), + c(224,133, 0), + c(224,133, 0), + c(225,135, 0), + c(227,136, 0), + c(227,136, 0), + c(228,137, 0), + c(230,138, 0), + c(230,138, 0), + c(231,140, 0), + c(233,141, 0), + c(233,141, 0), + c(234,142, 0), + c(236,144, 0), + c(236,144, 0), + c(238,145, 0), + c(239,146, 0), + c(241,147, 0), + c(241,147, 0), + c(242,149, 0), + c(244,150, 0), + c(244,150, 0), + c(245,151, 0), + c(247,153, 0), + c(247,153, 0), + c(248,154, 0), + c(250,155, 0), + c(251,156, 0), + c(251,156, 0), + c(253,158, 0), + c(255,159, 0), + c(255,159, 0), + c(255,160, 0), + c(255,161, 0), + c(255,163, 0), + c(255,163, 0), + c(255,164, 0), + c(255,165, 0), + c(255,167, 0), + c(255,167, 0), + c(255,168, 0), + c(255,169, 0), + c(255,169, 0), + c(255,170, 0), + c(255,172, 0), + c(255,173, 0), + c(255,173, 0), + c(255,174, 0), + c(255,175, 0), + c(255,177, 0), + c(255,178, 0), + c(255,179, 0), + c(255,181, 0), + c(255,181, 0), + c(255,182, 0), + c(255,183, 0), + c(255,184, 0), + c(255,187, 7), + c(255,188,10), + c(255,189,14), + c(255,191,18), + c(255,192,21), + c(255,193,25), + c(255,195,29), + c(255,197,36), + c(255,198,40), + c(255,200,43), + c(255,202,51), + c(255,204,54), + c(255,206,61), + c(255,207,65), + c(255,210,72), + c(255,211,76), + c(255,214,83), + c(255,216,91), + c(255,219,98), + c(255,221,105), + c(255,223,109), + c(255,225,116), + c(255,228,123), + c(255,232,134), + c(255,234,142), + c(255,237,149), + c(255,239,156), + c(255,240,160), + c(255,243,167), + c(255,246,174), + c(255,248,182), + c(255,249,185), + c(255,252,193), + c(255,253,196), + c(255,255,204), + c(255,255,207), + c(255,255,211), + c(255,255,218), + c(255,255,222), + c(255,255,225), + c(255,255,229), + c(255,255,233), + c(255,255,236), + c(255,255,240), + c(255,255,244), + c(255,255,247), + c(255,255,255))[ round(seq(beg,end,length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) + +} diff --git a/R/LINGRAY.R b/R/LINGRAY.R new file mode 100644 index 0000000..a448734 --- /dev/null +++ b/R/LINGRAY.R @@ -0,0 +1,111 @@ +LinGray <- function(n,beg = 1,end = 92) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(0,0,0), + c(0,0,0), + c(1,1,1), + c(1,1,1), + c(2,2,2), + c(3,3,3), + c(4,4,4), + c(5,5,5), + c(6,6,6), + c(7,7,7), + c(8,8,8), + c(9,9,9), + c(10,10,10), + c(11,11,11), + c(12,12,12), + c(13,13,13), + c(14,14,14), + c(15,15,15), + c(16,16,16), + c(17,17,17), + c(18,18,18), + c(19,19,19), + c(20,20,20), + c(21,21,21), + c(22,22,22), + c(23,23,23), + c(24,24,24), + c(25,25,25), + c(26,26,26), + c(27,27,27), + c(28,28,28), + c(29,29,29), + c(30,30,30), + c(32,32,32), + c(34,34,34), + c(35,35,35), + c(37,37,37), + c(39,39,39), + c(41,41,41), + c(43,43,43), + c(45,45,45), + c(46,46,46), + c(47,47,47), + c(49,49,49), + c(51,51,51), + c(52,52,52), + c(54,54,54), + c(56,56,56), + c(59,59,59), + c(61,61,61), + c(64,64,64), + c(67,67,67), + c(69,69,69), + c(72,72,72), + c(75,75,75), + c(76,76,76), + c(78,78,78), + c(81,81,81), + c(84,84,84), + c(87,87,87), + c(91,91,91), + c(94,94,94), + c(97,97,97), + c(101,101,101), + c(104,104,104), + c(107,107,107), + c(108,108,108), + c(112,112,112), + c(116,116,116), + c(120,120,120), + c(124,124,124), + c(128,128,128), + c(132,132,132), + c(136,136,136), + c(141,141,141), + c(145,145,145), + c(147,147,147), + c(150,150,150), + c(154,154,154), + c(159,159,159), + c(164,164,164), + c(169,169,169), + c(174,174,174), + c(179,179,179), + c(185,185,185), + c(190,190,190), + c(195,195,195), + c(201,201,201), + c(207,207,207), + c(212,212,212), + c(216,216,216), + c(218,218,218), + c(224,224,224), + c(226,226,226), + c(230,230,230), + c(237,237,237), + c(243,243,243), + c(245,245,245), + c(252,252,252), + c(255,255,255), + c(255,255,255))[round(seq(beg,end,length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} diff --git a/R/LOCS.R b/R/LOCS.R new file mode 100644 index 0000000..fd73ae7 --- /dev/null +++ b/R/LOCS.R @@ -0,0 +1,266 @@ +LinOCS <- function(n,beg = 1,end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(0,0,0), + c(0,0,0), + c(0,0,0), + c(1,0,0), + c(2,0,0), + c(2,0,0), + c(3,0,0), + c(3,0,0), + c(4,0,0), + c(5,0,0), + c(5,0,0), + c(6,0,0), + c(7,0,0), + c(7,0,0), + c(8,0,0), + c(9,0,0), + c(9,0,0), + c(10,0,0), + c(11,0,0), + c(12,0,0), + c(13,0,0), + c(14,0,0), + c(15,0,0), + c(16,0,0), + c(17,0,0), + c(18,0,0), + c(19,0,0), + c(20,0,0), + c(21,0,0), + c(22,0,0), + c(23,0,0), + c(25,0,0), + c(26,0,0), + c(27,0,0), + c(28,0,0), + c(30,0,0), + c(31,0,0), + c(33,0,0), + c(34,0,0), + c(35,0,0), + c(37,0,0), + c(39,0,0), + c(40,0,0), + c(43,0,0), + c(45,0,0), + c(46,0,0), + c(49,0,0), + c(51,0,0), + c(53,0,0), + c(54,0,0), + c(56,0,0), + c(58,0,0), + c(60,0,0), + c(62,0,0), + c(64,0,0), + c(67,0,0), + c(69,0,0), + c(71,0,0), + c(74,0,0), + c(76,0,0), + c(80,0,0), + c(81,0,0), + c(84,0,0), + c(86,0,0), + c(89,0,0), + c(92,0,0), + c(94,0,0), + c(97,0,0), + c(100,0,0), + c(103,0,0), + c(106,0,0), + c(109,0,0), + c(112,0,0), + c(115,0,0), + c(117,0,0), + c(122,0,0), + c(126,0,0), + c(128,0,0), + c(131,0,0), + c(135,0,0), + c(135,0,0), + c(135,1,0), + c(135,2,0), + c(135,3,0), + c(135,4,0), + c(135,6,0), + c(135,6,0), + c(135,8,0), + c(135,9,0), + c(135,10,0), + c(135,11,0), + c(135,13,0), + c(135,13,0), + c(135,15,0), + c(135,17,0), + c(135,17,0), + c(135,19,0), + c(135,21,0), + c(135,22,0), + c(135,23,0), + c(135,25,0), + c(135,26,0), + c(135,27,0), + c(135,29,0), + c(135,31,0), + c(135,32,0), + c(135,33,0), + c(135,35,0), + c(135,36,0), + c(135,38,0), + c(135,40,0), + c(135,42,0), + c(135,44,0), + c(135,46,0), + c(135,47,0), + c(135,49,0), + c(135,51,0), + c(135,52,0), + c(135,54,0), + c(135,56,0), + c(135,57,0), + c(135,59,0), + c(135,62,0), + c(135,63,0), + c(135,65,0), + c(135,67,0), + c(135,69,0), + c(135,72,0), + c(135,73,0), + c(135,76,0), + c(135,78,0), + c(135,80,0), + c(135,82,0), + c(135,84,0), + c(135,87,0), + c(135,88,0), + c(135,90,0), + c(135,93,0), + c(135,95,0), + c(135,98,0), + c(135,101,0), + c(135,103,0), + c(135,106,0), + c(135,107,0), + c(135,110,0), + c(135,113,0), + c(135,115,0), + c(135,118,0), + c(135,121,0), + c(135,124,0), + c(135,127,0), + c(135,129,0), + c(135,133,0), + c(135,135,0), + c(135,138,0), + c(135,141,0), + c(135,144,0), + c(135,148,0), + c(135,150,0), + c(135,155,0), + c(135,157,0), + c(135,160,0), + c(135,163,0), + c(135,166,0), + c(135,170,0), + c(135,174,0), + c(135,177,0), + c(135,180,0), + c(135,184,0), + c(135,188,0), + c(135,192,0), + c(135,195,0), + c(135,200,0), + c(135,203,0), + c(135,205,0), + c(135,210,0), + c(135,214,0), + c(135,218,0), + c(135,222,0), + c(135,226,0), + c(135,231,0), + c(135,236,0), + c(135,239,0), + c(135,244,0), + c(135,249,0), + c(135,254,0), + c(135,255,1), + c(135,255,5), + c(135,255,10), + c(135,255,15), + c(135,255,20), + c(135,255,23), + c(135,255,28), + c(135,255,33), + c(135,255,38), + c(135,255,43), + c(135,255,45), + c(135,255,49), + c(135,255,54), + c(135,255,59), + c(135,255,65), + c(135,255,70), + c(135,255,74), + c(135,255,80), + c(135,255,84), + c(135,255,90), + c(135,255,95), + c(135,255,98), + c(135,255,104), + c(135,255,110), + c(135,255,116), + c(135,255,120), + c(135,255,125), + c(135,255,131), + c(135,255,137), + c(135,255,144), + c(135,255,149), + c(135,255,154), + c(135,255,158), + c(135,255,165), + c(135,255,172), + c(135,255,179), + c(135,255,186), + c(135,255,191), + c(135,255,198), + c(135,255,203), + c(135,255,211), + c(135,255,216), + c(135,255,224), + c(135,255,232), + c(135,255,240), + c(135,255,248), + c(135,255,254), + c(135,255,255), + c(140,255,255), + c(146,255,255), + c(153,255,255), + c(156,255,255), + c(161,255,255), + c(168,255,255), + c(172,255,255), + c(177,255,255), + c(182,255,255), + c(189,255,255), + c(192,255,255), + c(199,255,255), + c(204,255,255), + c(210,255,255), + c(215,255,255), + c(220,255,255), + c(225,255,255), + c(232,255,255), + c(236,255,255), + c(240,255,255), + c(248,255,255), + c(255,255,255))[ round(seq(beg,end,length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} diff --git a/R/MAG.R b/R/MAG.R new file mode 100644 index 0000000..5721749 --- /dev/null +++ b/R/MAG.R @@ -0,0 +1,266 @@ +magent <- function(n, beg = 1, end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c(0, 0, 0), + c( 40, 0, 0), + c( 56, 0, 4), + c( 61, 0, 9), + c( 64, 0, 12), + c( 66, 0, 14), + c( 69, 0, 17), + c( 73, 0, 20), + c( 74, 0, 22), + c( 78, 0, 25), + c( 79, 0, 27), + c( 83, 0, 30), + c( 85, 0, 31), + c( 86, 0, 33), + c( 90, 0, 36), + c( 91, 0, 38), + c( 93, 0, 39), + c( 95, 0, 41), + c( 96, 0, 43), + c(100, 0, 46), + c(102, 0, 47), + c(103, 0, 49), + c(105, 0, 51), + c(107, 0, 52), + c(108, 0, 54), + c(110, 0, 55), + c(112, 0, 57), + c(112, 0, 57), + c(113, 0, 58), + c(115, 0, 60), + c(117, 0, 62), + c(119, 0, 63), + c(120, 0, 65), + c(122, 0, 66), + c(124, 0, 68), + c(125, 0, 70), + c(127, 0, 71), + c(129, 0, 73), + c(129, 0, 73), + c(130, 0, 74), + c(132, 0, 76), + c(134, 0, 78), + c(136, 0, 79), + c(137, 0, 81), + c(139, 0, 82), + c(141, 0, 84), + c(142, 0, 86), + c(144, 0, 87), + c(146, 0, 89), + c(147, 0, 90), + c(149, 0, 92), + c(151, 0, 94), + c(151, 0, 94), + c(153, 0, 95), + c(154, 0, 97), + c(156, 0, 98), + c(158, 0,100), + c(159, 0,102), + c(161, 0,103), + c(163, 0,105), + c(164, 0,106), + c(166, 0,108), + c(168, 0,109), + c(170, 0,111), + c(171, 0,113), + c(173, 0,114), + c(175, 0,116), + c(176, 0,117), + c(178, 0,119), + c(180, 0,121), + c(180, 0,121), + c(181, 0,122), + c(183, 0,124), + c(185, 0,125), + c(187, 0,127), + c(188, 0,129), + c(190, 0,130), + c(192, 0,132), + c(193, 0,133), + c(195, 0,135), + c(197, 0,137), + c(198, 0,138), + c(200, 0,140), + c(202, 0,141), + c(204, 0,143), + c(204, 0,143), + c(205, 0,145), + c(207, 0,146), + c(209, 0,148), + c(210, 0,149), + c(212, 0,151), + c(214, 0,153), + c(215, 0,154), + c(217, 0,156), + c(219, 0,157), + c(221, 0,159), + c(222, 0,160), + c(222, 0,160), + c(224, 0,162), + c(226, 0,164), + c(227, 0,165), + c(229, 0,167), + c(231, 0,168), + c(232, 0,170), + c(234, 0,172), + c(236, 0,173), + c(238, 0,175), + c(238, 0,175), + c(239, 0,176), + c(241, 0,178), + c(243, 0,180), + c(244, 0,181), + c(246, 0,183), + c(248, 2,184), + c(249, 4,186), + c(249, 4,186), + c(249, 4,186), + c(251, 6,188), + c(251, 6,188), + c(253, 9,189), + c(253, 9,189), + c(255, 11,191), + c(255, 11,191), + c(255, 13,192), + c(255, 13,192), + c(255, 13,192), + c(255, 16,194), + c(255, 18,196), + c(255, 20,197), + c(255, 20,197), + c(255, 23,199), + c(255, 25,200), + c(255, 27,202), + c(255, 30,204), + c(255, 32,205), + c(255, 34,207), + c(255, 37,208), + c(255, 37,208), + c(255, 39,210), + c(255, 41,211), + c(255, 44,213), + c(255, 46,215), + c(255, 48,216), + c(255, 51,218), + c(255, 53,219), + c(255, 53,219), + c(255, 55,221), + c(255, 57,223), + c(255, 60,224), + c(255, 62,226), + c(255, 64,227), + c(255, 67,229), + c(255, 67,229), + c(255, 69,231), + c(255, 71,232), + c(255, 74,234), + c(255, 76,235), + c(255, 78,237), + c(255, 81,239), + c(255, 81,239), + c(255, 83,240), + c(255, 85,242), + c(255, 88,243), + c(255, 90,245), + c(255, 92,247), + c(255, 95,248), + c(255, 95,248), + c(255, 97,250), + c(255, 99,251), + c(255,102,253), + c(255,104,255), + c(255,106,255), + c(255,106,255), + c(255,108,255), + c(255,111,255), + c(255,113,255), + c(255,115,255), + c(255,115,255), + c(255,118,255), + c(255,120,255), + c(255,122,255), + c(255,122,255), + c(255,125,255), + c(255,127,255), + c(255,129,255), + c(255,129,255), + c(255,132,255), + c(255,134,255), + c(255,136,255), + c(255,136,255), + c(255,139,255), + c(255,141,255), + c(255,143,255), + c(255,143,255), + c(255,146,255), + c(255,148,255), + c(255,150,255), + c(255,150,255), + c(255,153,255), + c(255,155,255), + c(255,155,255), + c(255,157,255), + c(255,159,255), + c(255,159,255), + c(255,162,255), + c(255,164,255), + c(255,164,255), + c(255,166,255), + c(255,169,255), + c(255,171,255), + c(255,171,255), + c(255,173,255), + c(255,176,255), + c(255,176,255), + c(255,178,255), + c(255,180,255), + c(255,180,255), + c(255,183,255), + c(255,185,255), + c(255,185,255), + c(255,187,255), + c(255,190,255), + c(255,190,255), + c(255,192,255), + c(255,194,255), + c(255,197,255), + c(255,197,255), + c(255,199,255), + c(255,201,255), + c(255,204,255), + c(255,204,255), + c(255,206,255), + c(255,208,255), + c(255,210,255), + c(255,210,255), + c(255,213,255), + c(255,215,255), + c(255,217,255), + c(255,217,255), + c(255,220,255), + c(255,222,255), + c(255,224,255), + c(255,227,255), + c(255,229,255), + c(255,229,255), + c(255,231,255), + c(255,234,255), + c(255,236,255), + c(255,238,255), + c(255,241,255), + c(255,243,255), + c(255,243,255), + c(255,245,255), + c(255,248,255), + c(255,250,255), + c(255,255,255)) [ round(seq(beg,end,length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} diff --git a/R/RB.R b/R/RB.R new file mode 100644 index 0000000..6e92aaa --- /dev/null +++ b/R/RB.R @@ -0,0 +1,266 @@ +plinrain <- function(n, beg = 1, end = 256) +{ + if(beg < 1 || end < 1 || beg > 256 || end > 256) + stop("`beg' and `end' must be numbers in the interval [1,256]") + + M <- rbind(c( 0, 0, 0), + c( 45, 0, 36), + c( 56, 0, 46), + c( 60, 0, 49), + c( 67, 0, 54), + c( 70, 0, 59), + c( 71, 0, 61), + c( 75, 0, 68), + c( 74, 0, 73), + c( 74, 0, 77), + c( 73, 0, 81), + c( 71, 0, 87), + c( 69, 1, 90), + c( 68, 2, 94), + c( 66, 3, 97), + c( 63, 6,102), + c( 61, 7,106), + c( 58, 10,109), + c( 56, 12,113), + c( 53, 15,116), + c( 48, 18,119), + c( 47, 20,121), + c( 44, 23,124), + c( 41, 27,128), + c( 40, 28,129), + c( 37, 32,132), + c( 34, 36,134), + c( 29, 43,137), + c( 25, 52,138), + c( 24, 57,139), + c( 24, 62,141), + c( 24, 64,142), + c( 23, 65,142), + c( 23, 69,143), + c( 23, 71,142), + c( 23, 71,142), + c( 23, 73,142), + c( 23, 75,142), + c( 23, 75,142), + c( 23, 78,142), + c( 23, 80,142), + c( 23, 80,142), + c( 23, 82,141), + c( 23, 85,141), + c( 23, 85,141), + c( 23, 87,140), + c( 23, 87,140), + c( 24, 90,140), + c( 24, 90,140), + c( 24, 93,139), + c( 24, 93,139), + c( 24, 93,139), + c( 24, 93,139), + c( 24, 97,139), + c( 24, 97,139), + c( 25,101,138), + c( 25,101,138), + c( 25,104,137), + c( 25,104,137), + c( 25,104,137), + c( 26,108,137), + c( 26,108,137), + c( 27,111,136), + c( 27,111,136), + c( 27,111,136), + c( 27,115,135), + c( 27,115,135), + c( 28,118,134), + c( 28,118,134), + c( 29,122,133), + c( 29,122,133), + c( 29,122,133), + c( 29,122,133), + c( 29,125,132), + c( 29,125,132), + c( 30,128,131), + c( 30,128,131), + c( 31,131,130), + c( 31,131,130), + c( 31,131,130), + c( 32,134,128), + c( 32,134,128), + c( 33,137,127), + c( 33,137,127), + c( 33,137,127), + c( 34,140,125), + c( 34,140,125), + c( 35,142,123), + c( 35,142,123), + c( 36,145,121), + c( 36,145,121), + c( 36,145,121), + c( 37,147,118), + c( 37,147,118), + c( 38,150,116), + c( 38,150,116), + c( 40,152,113), + c( 40,152,113), + c( 41,154,111), + c( 41,154,111), + c( 42,156,108), + c( 42,156,108), + c( 43,158,106), + c( 43,158,106), + c( 43,158,106), + c( 45,160,104), + c( 45,160,104), + c( 46,162,101), + c( 46,162,101), + c( 48,164, 99), + c( 48,164, 99), + c( 50,166, 97), + c( 50,166, 97), + c( 51,168, 95), + c( 53,170, 93), + c( 53,170, 93), + c( 53,170, 93), + c( 55,172, 91), + c( 55,172, 91), + c( 57,174, 88), + c( 57,174, 88), + c( 59,175, 86), + c( 62,177, 84), + c( 64,178, 82), + c( 64,178, 82), + c( 67,180, 80), + c( 67,180, 80), + c( 69,181, 79), + c( 72,183, 77), + c( 72,183, 77), + c( 72,183, 77), + c( 75,184, 76), + c( 77,186, 74), + c( 80,187, 73), + c( 83,189, 72), + c( 87,190, 72), + c( 91,191, 71), + c( 95,192, 70), + c( 99,193, 70), + c(103,194, 70), + c(107,195, 70), + c(111,196, 70), + c(111,196, 70), + c(115,196, 70), + c(119,197, 70), + c(123,197, 70), + c(130,198, 71), + c(133,199, 71), + c(137,199, 72), + c(140,199, 72), + c(143,199, 73), + c(143,199, 73), + c(147,199, 73), + c(150,199, 74), + c(153,199, 74), + c(156,199, 75), + c(160,200, 76), + c(167,200, 78), + c(170,200, 79), + c(173,200, 79), + c(173,200, 79), + c(177,200, 80), + c(180,200, 81), + c(183,199, 82), + c(186,199, 82), + c(190,199, 83), + c(196,199, 85), + c(199,198, 85), + c(199,198, 85), + c(203,198, 86), + c(206,197, 87), + c(212,197, 89), + c(215,196, 90), + c(218,195, 91), + c(224,194, 94), + c(224,194, 94), + c(230,193, 96), + c(233,192, 98), + c(236,190,100), + c(238,189,104), + c(240,188,106), + c(240,188,106), + c(242,187,110), + c(244,185,114), + c(245,184,116), + c(247,183,120), + c(248,182,123), + c(248,182,123), + c(250,181,125), + c(251,180,128), + c(252,180,130), + c(253,180,133), + c(253,180,133), + c(254,180,134), + c(254,179,138), + c(255,179,142), + c(255,179,145), + c(255,179,145), + c(255,179,152), + c(255,180,161), + c(255,180,164), + c(255,180,167), + c(255,180,167), + c(255,181,169), + c(255,181,170), + c(255,182,173), + c(255,183,176), + c(255,183,176), + c(255,184,179), + c(255,185,179), + c(255,185,182), + c(255,186,182), + c(255,186,182), + c(255,187,185), + c(255,188,185), + c(255,189,188), + c(255,189,188), + c(255,190,188), + c(255,191,191), + c(255,192,191), + c(255,194,194), + c(255,194,194), + c(255,197,197), + c(255,198,198), + c(255,200,200), + c(255,201,201), + c(255,201,201), + c(255,202,202), + c(255,203,203), + c(255,205,205), + c(255,206,206), + c(255,206,206), + c(255,208,208), + c(255,209,209), + c(255,211,211), + c(255,215,215), + c(255,216,216), + c(255,216,216), + c(255,218,218), + c(255,219,219), + c(255,221,221), + c(255,223,223), + c(255,226,226), + c(255,228,228), + c(255,230,230), + c(255,230,230), + c(255,232,232), + c(255,235,235), + c(255,237,237), + c(255,240,240), + c(255,243,243), + c(255,246,246), + c(255,249,249), + c(255,251,251), + c(255,253,253), + c(255,255,255))[ round(seq(beg,end, length = n)), ] + + rgb(M[,1]/255, + M[,2]/255, + M[,3]/255) +} diff --git a/R/grid.hexagons.R b/R/grid.hexagons.R new file mode 100644 index 0000000..f64d851 --- /dev/null +++ b/R/grid.hexagons.R @@ -0,0 +1,364 @@ + +hexcoords <- function(dx, dy = NULL, n = 1, sep = NULL) +{ + stopifnot(length(dx) == 1) + if(is.null(dy)) dy <- dx/sqrt(3) + if(is.null(sep)) + list(x = rep.int(c(dx, dx, 0, -dx, -dx, 0), n), + y = rep.int(c(dy,-dy, -2*dy, -dy, dy, 2*dy), n), + no.sep = TRUE) + else + list(x = rep.int(c(dx, dx, 0, -dx, -dx, 0, sep), n), + y = rep.int(c(dy,-dy, -2*dy, -dy, dy, 2*dy, sep), n), + no.sep = FALSE) +} + +hexpolygon <- +function(x, y, hexC = hexcoords(dx, dy, n = 1), dx, dy=NULL, + fill = 1, border = 0, hUnit = "native", ...) +{ + ## Purpose: draw hexagon [grid.]polygon()'s around (x[i], y[i])_i + ## Author: Martin Maechler, Jul 2004; Nicholas for grid + + n <- length(x) + stopifnot(length(y) == n) + stopifnot(is.list(hexC) && is.numeric(hexC$x) && is.numeric(hexC$y)) + if(hexC$no.sep) { + n6 <- rep.int(6:6, n) + if(!is.null(hUnit)) { + grid.polygon(x = unit(rep.int(hexC$x, n) + rep.int(x, n6),hUnit), + y = unit(rep.int(hexC$y, n) + rep.int(y, n6),hUnit), + id.lengths = n6, + gp = gpar(col= border, fill= fill)) + } + else { + grid.polygon(x = rep.int(hexC$x, n) + rep.int(x, n6), + y = rep.int(hexC$y, n) + rep.int(y, n6), + id.lengths = n6, + gp = gpar(col= border, fill= fill)) + } + } + else{ ## traditional graphics polygons: must be closed explicitly (+ 1 pt) + n7 <- rep.int(7:7, n) + polygon(x = rep.int(hexC$x, n) + rep.int(x, n7), + y = rep.int(hexC$y, n) + rep.int(y, n7), ...) + } +} + +grid.hexagons <- +function(dat, style = c("colorscale", "centroids", "lattice", + "nested.lattice", "nested.centroids", "constant.col"), + use.count=TRUE, cell.at=NULL, + minarea = 0.05, maxarea = 0.8, check.erosion = TRUE, + mincnt = 1, maxcnt = max(dat@count), trans = NULL, + colorcut = seq(0, 1, length = 17), + density = NULL, border = NULL, pen = NULL, + colramp = function(n){ LinGray(n,beg = 90, end = 15) }, + def.unit = "native", + verbose = getOption("verbose")) +{ + ## Warning: presumes the plot has the right shape and scales + ## See plot.hexbin() + ## Arguments: + ## dat = hexbin object + ## style = type of plotting + ## 'centroids' = symbol area is a function of the count, + ## approximate location near cell center of + ## mass without overplotting + ## 'lattice' = symbol area is a function of the count, + ## plot at lattice points + ## 'colorscale' = gray scale plot, + ## color number determined by + ## transformation and colorcut, + ## area = full hexagons. + ## 'nested.lattice'= plots two hexagons + ## background hexagon + ## area=full size + ## color number by count in powers of 10 starting at pen 2 + ## foreground hexagon + ## area by log10(cnt)-floor(log10(cnt)) + ## color number by count in powers of 10 starting at pen 12 + ## 'nested.centroids' = like nested.lattice + ## but counts < 10 are plotted + ## + ## minarea = minimum symbol area as fraction of the binning cell + ## maxarea = maximum symbol area as fraction of the binning cell + ## mincnt = minimum count accepted in plot + ## maxcnt = maximum count accepted in plot + ## trans = a transformation scaling counts into [0,1] to be applied + ## to the counts for options 'centroids','lattice','colorscale': + ## default=(cnt-mincnt)/(maxcnt-mincnt) + ## colorcut= breaks for translating values between 0 and 1 into + ## color classes. Default= seq(0,1,17), + ## density = for hexagon graph paper + ## border plot the border of the hexagon, use TRUE for + ## hexagon graph paper + ## Symbol size encoding: + ## Area= minarea + scaled.count*(maxarea-minarea) + ## When maxarea==1 and scaled.count==1, the hexagon cell + ## is completely filled. + ## + ## If small hexagons are hard to see increase minarea. + ## For gray scale encoding + ## Uses the counts scaled into [0,1] + ## Default gray cutpoints seq(0,1,17) yields 16 color classes + ## The color number for the first class starts at 2. + ## motif coding: black 15 white puts the first of the + ## color class above the background black + ## The function subtracts 1.e-6 from the lower cutpoint to include + ## the boundary + ## For nested scaling see the code + ## Count scaling alternatives + ## + ## log 10 and Poisson transformations + ## trans <- function(cnt) log10(cnt) + ## min inv <- function(y) 10^y + ## + ## trans <- function(cnt) sqrt(4*cnt+2) + ## inv <- function(y) (y^2-2)/4 + ## Perceptual considerations. + ## Visual response to relative symbol area is not linear and varies from + ## person to person. A fractional power transformation + ## to make the interpretation nearly linear for more people + ## might be considered. With areas bounded between minarea + ## and 1 the situation is complicated. + ## + ## The local background influences color interpretation. + ## Having defined color breaks to focus attention on + ## specific countours can help. + ## + ## Plotting the symbols near the center of mass is not only more accurate, + ## it helps to reduce the visual dominance of the lattice structure. Of + ## course higher resolution binning reduces the possible distance between + ## the center of mass for a bin and the bin center. When symbols + ## nearly fill their bin, the plot appears to vibrate. This can be + ## partially controlled by reducing maxarea or by reducing + ## contrast. + + + ##____________________Initial checks_______________________ + if(!is(dat,"hexbin")) + stop("first argument must be a hexbin object") + style <- match.arg(style) # so user can abbreviate + if(minarea <= 0) + stop("hexagons cannot have a zero area, change minarea") + if(maxarea > 1) + warning("maxarea > 1, hexagons may overplot") + ##_______________ Collect computing constants______________ + + if(use.count){ + cnt <- dat@count + } + else{ + cnt <- cell.at + if(is.null(cnt)){ + if(is.null(dat@cAtt)) stop("Cell attribute cAtt is null") + else cnt <- dat@cAtt + } + } + xbins <- dat@xbins + shape <- dat@shape + tmp <- hcell2xy(dat, check.erosion = check.erosion) + good <- mincnt <= cnt & cnt <= maxcnt + xnew <- tmp$x[good] + ynew <- tmp$y[good] + cnt <- cnt[good] + sx <- xbins/diff(dat@xbnds) + sy <- (xbins * shape)/diff(dat@ybnds) + + ##___________Transform Counts to Radius_____________________ + switch(style, + "centroids" = , + "lattice" = , + "constant.col" =, + "colorscale" = { + if(is.null(trans)) { + if( min(cnt,na.rm=TRUE)< 0){ + pcnt<- cnt + min(cnt) + rcnt <- { + if(maxcnt == mincnt) rep.int(1, length(cnt)) + else (pcnt - mincnt)/(maxcnt - mincnt) + } + } + else rcnt <- { + if(maxcnt == mincnt) rep.int(1, length(cnt)) + else (cnt - mincnt)/(maxcnt - mincnt) + } + } + else { + rcnt <- (trans(cnt) - trans(mincnt)) / + (trans(maxcnt) - trans(mincnt)) + if(any(is.na(rcnt))) + stop("bad count transformation") + } + area <- minarea + rcnt * (maxarea - minarea) + }, + "nested.lattice" = , + "nested.centroids" = { + diffarea <- maxarea - minarea + step <- 10^floor(log10(cnt)) + f <- (cnt/step - 1)/9 + area <- minarea + f * diffarea + area <- pmax(area, minarea) + } + ) + area <- pmin(area, maxarea) + radius <- sqrt(area) + + ##______________Set Colors_____________________________ + switch(style, + "centroids" = , + "constant.col" = , + "lattice" = { + if(is.null(pen)) pen <- rep.int(1, length(cnt)) + else if(length(pen)== length(cnt)) break + else if(length(pen)== 1) pen <- rep.int(pen,length(cnt)) + else stop("'pen' has wrong length") + }, + "nested.lattice" = , + "nested.centroids" = { + if(!is.null(pen) && length(dim(pen)) == 2) { + dp <- dim(pen) + lgMcnt <- ceiling(log10(max(cnt))) + if(dp[1] != length(cnt) && dp[1] != lgMcnt ) { + stop ("pen is not of right dimension") + } + if( dp[1] == lgMcnt ) { + ind <- ceiling(log10(dat@count)) ## DS: 'dat' was 'bin' (??) + ind[ind == 0] <- 1 + pen <- pen[ind,] + } + else break + } + else { + pen <- floor(log10(cnt)) + 2 + pen <- cbind(pen, pen+10) + } + }, + "colorscale" = { + ## MM: Following is quite different from bin2d's + nc <- length(colorcut) + if(colorcut[1] > colorcut[nc]){ + colorcut[1] <- colorcut[1] + 1e-06 + colorcut[nc] <- colorcut[nc] - 1e-06 + } else { + colorcut[1] <- colorcut[1] - 1e-06 + colorcut[nc] <- colorcut[nc] + 1e-06 + } + colgrp <- cut(rcnt, colorcut,labels = FALSE) + if(any(is.na(colgrp))) colgrp <- ifelse(is.na(colgrp),0,colgrp) + ##NL: colramp must be a function accepting an integer n + ## and returning n colors + clrs <- colramp(length(colorcut) - 1) + pen <- clrs[colgrp] + } + ) + + ##__________________ Construct a hexagon___________________ + ## The inner and outer radius for hexagon in the scaled plot + inner <- 0.5 + outer <- (2 * inner)/sqrt(3) + ## Now construct a point up hexagon symbol in data units + dx <- inner/sx + dy <- outer/(2 * sy) + rad <- sqrt(dx^2 + dy^2) + hexC <- hexcoords(dx, dy, sep=NULL) + ##_______________ Full Cell Plotting_____________________ + switch(style, + "constant.col" = , + "colorscale" = { + hexpolygon(xnew, ynew, hexC, + density = density, fill = pen, + border = if(!is.null(border)) border else pen) + + ## and that's been all for these styles + return(invisible(paste("done", sQuote(style)))) + }, + "nested.lattice" = , + "nested.centroids" = { + hexpolygon(xnew, ynew, hexC, + density = density, + fill = if (is.null(border) || border) 1 else pen[,1], + border = pen[,1]) + } + ) + + ##__________________ Symbol Center adjustments_______________ + if(style == "centroids" || style == "nested.centroids") { + xcm <- dat@xcm[good] + ycm <- dat@ycm[good] + ## Store 12 angles around a circle and the replicate the first + ## The actual length for these vectors is determined by using + ## factor use below + k <- sqrt(3)/2 + cosx <- c(1, k, .5, 0, -.5, -k, -1, -k, -.5, 0, .5, k, 1)/sx + siny <- c(0, .5, k, 1, k, .5, 0, -.5, -k, -1, -k, -.5, 0)/sy + ## Compute distances for differences after scaling into + ## [0,size] x [0,aspect*size] + ## Then there are size hexagons on the x axis + dx <- sx * (xcm - xnew) + dy <- sy * (ycm - ynew) + dlen <- sqrt(dx^2 + dy^2) + ## Find the closest approximating direction of the 12 vectors above + cost <- ifelse(dlen > 0, dx/dlen, 0) + tk <- (6 * acos(cost))/pi + tk <- round(ifelse(dy < 0, 12 - tk, tk)) + 1 + ## Select the available length for the approximating vector + hrad <- ifelse(tk %% 2 == 1, inner, outer) + ## Rad is either an inner or outer approximating radius. + ## If dlen + hrad*radius <= hrad, move the center dlen units. + ## Else move as much of dlen as possible without overplotting. + fr <- pmin(hrad * (1 - radius), dlen) # Compute the symbol centers + ## fr is the distance for the plot [0,xbins] x [0,aspect*xbins] + + ## cosx and siny give the x and y components of this distance + ## in data units + xnew <- xnew + fr * cosx[tk] + ynew <- ynew + fr * siny[tk] + } + ## ________________Sized Hexagon Plotting__________________ + ## scale the symbol by radius and add to the new center + n <- length(radius) + if(verbose) + cat('length = ',length(pen),"\n", 'pen = ', pen+1,"\n") + ##switch(style, + ## centroids = , + ## lattice = {if(is.null(pen))pen <- rep.int(1, n) + ## else pen <- rep.int(pen, n)}, + ## nested.lattice = , + ## nested.centroids ={ + ## if( + ## pen[,2] <- pen[,1] + 10 + ## } ) + + ## grid.polygon() closes automatically: now '6' where we had '7': + n6 <- rep.int(6:6, n) + pltx <- rep.int(hexC$x, n) * rep.int(radius, n6) + rep.int(xnew, n6) + plty <- rep.int(hexC$y, n) * rep.int(radius, n6) + rep.int(ynew, n6) + switch(style, + "centroids" = , + "lattice" = { + grid.polygon(pltx, plty, default.units=def.unit, id=NULL, + ## density = density, + id.lengths= n6, + gp=gpar(fill = pen, col = border)) + }, + "nested.lattice" = , + "nested.centroids" = { + grid.polygon(pltx, plty, default.units=def.unit, id=NULL, + id.lengths= n6, + gp=gpar(fill = pen[,2], + ## density = density, + col=if(!is.null(border)) border else pen[,2])) + + }) + +} + +if(FALSE){ ## considering 'hexagons' object + setMethod("hexagons", signature(dat="hexbin"), grid.hexagons) + + erode.hexagons <- function(ebin,pen="black",border="red"){ + print("Blank for now") + } +} diff --git a/R/grid.hexlegend.R b/R/grid.hexlegend.R new file mode 100644 index 0000000..2692a31 --- /dev/null +++ b/R/grid.hexlegend.R @@ -0,0 +1,157 @@ +grid.hexlegend <- +function(legend, ysize, lcex, inner, + style = "colorscale", + minarea = 0.05, maxarea = 0.8, mincnt = 1, maxcnt, trans = NULL, + inv = NULL, colorcut, density = NULL, border = NULL, pen = NULL, + colramp = function(n) { LinGray(n,beg = 90,end = 15) }, + leg.unit="native") +{ + ## the formal arg matching should happen + style <- match.arg(style, eval(formals(grid.hexagons)[["style"]])) + + if (style %in% c("centroids", "lattice", "colorscale")) { + ## _______________tranformations_______________________ + if(is.null(trans)) { + sc <- maxcnt - mincnt + bnds <- round(mincnt + sc * colorcut) + } + + else { + if(!is.function(trans) && !is.function(inv)) + stop("'trans' and 'inv' must both be functions if 'trans' is not NULL") + con <- trans(mincnt) + sc <- trans(maxcnt) - con + bnds <- round(inv(con + sc * colorcut)) + } + } + + if(style == "colorscale") { ## use own 'inner' + n <- length(bnds) + spacing <- ysize/(n + 3) + inner <- min(legend/3.5, (sqrt(3) * spacing)/2) + } + dx <- inner/2 + dy <- dx/sqrt(3) + hexC <- hexcoords(dx, dy, n = 1,sep=NULL) + + ## _______________Plotting______________________________ + switch(style, + "colorscale" = { + midx <- legend/3 + textx <- (2 * legend)/3 + tx <- hexC$x + midx + pen <- colramp(n) + for(i in seq(length = n-1)) { + grid.polygon(tx,hexC$y + i * spacing, + default.units=leg.unit,id=NULL,id.lengths=6, + gp=gpar(fill = pen[i], col = border)) + grid.text(as.character(bnds[i]), textx, (i - 0.5) * spacing, + default.units=leg.unit, gp=gpar(cex = lcex)) + } + grid.text(as.character(bnds[n]), textx, (n - 0.5) * spacing, + default.units=leg.unit, gp=gpar(cex = lcex)) + grid.text("Counts", legend/2, (n + 1.5) * spacing, + default.units=leg.unit, gp=gpar(cex = 1.7 * lcex)) + }, + + "centroids" = , + "lattice" = { + ## NL Solved hex overlap problem on legend + ## Need to tackle too many categories + radius <- sqrt(minarea + (maxarea - minarea) * colorcut) + n <- length(radius) + shift <- c(0, 2*dy*radius) + shift <- shift[1:n] + shift[2:(n+1)] + #labht <- max(strheight(as.character(bnds), cex = lcex)) + labht <- convertY(unit(get.gpar(names = "fontsize")[[1]]*lcex, + "points"),"native",valueOnly = TRUE) + shift <- pmax(labht, shift) + six <- rep.int(6:6, n) + xmid <- legend/3 + inc <- ysize/(n+3) + if(inc > max(shift)) y <- inc * 1:n + else { + y <- cumsum(shift) + extra.slop <- (n * inc) - y[n] # FIXME? y[n] == sum(shift) + shift[-1] <- shift[-1] + extra.slop/(n-1) + y <- cumsum(shift) + ## (y+(1/n)*extra.slop)-y[1] + ## delta <- max(log(shift))-min(log(shift)) + ## fudge <- extra.slop*(diff(log(shift))/delta) + ## y<- c(y[1], y[-1]+ fudge ) + } + textx <- rep.int((2 * legend)/3, n) + ## ____________________plotting______________________ + if(is.null(pen)) pen <- 1 + if(is.null(border)) border <- pen + grid.polygon(x = rep.int(hexC$x,n)* + rep.int(radius, six) + rep.int(xmid, 6 * n), + y = rep.int(hexC$y,n)* + rep.int(radius, six) + rep.int(y, six), + default.units=leg.unit, id=NULL, + id.lengths=rep.int(6,n), + gp=gpar(fill = pen, col = border)) + + grid.text(as.character(bnds), textx, y, + default.units=leg.unit, gp=gpar(cex = lcex)) + grid.text("Counts", legend/2, (n + 2) * inc, + default.units=leg.unit, gp=gpar(cex =1.7 * lcex)) + }, + + "nested.lattice" = , + "nested.centroids" = { + ## _____________x scaling_____________________________ + numb <- cut(floor(legend/inner), breaks = c(-1, 0, 2,4)) + ## Note: In old code + ## top breaks=c(-1,0,2,4,8), numb<- 5 and size=1:9 + if(is.na(numb)) + numb <- 4 + switch(numb, + {warning("not enough space for legend"); return()}, + size <- 5, + size <- c(1, 5, 9), + size <- c(1, 3, 5, 7, 9)) + xmax <- length(size) + radius <- sqrt(minarea + (maxarea - minarea) * (size - 1)/9) + txt <- as.character(size) + ##___________________y scaling_____________________ + lab <- c("Ones", "Tens", "Hundreds", + "Thousands", "10 Thousands", "100 Thousands", + "Millions", "10 Millions", + "100 Millions", "Billions") + power <- floor(log10(maxcnt)) + 1 + yinc <- 16 * dy + if(ysize/power < yinc) + {warning("Not enough height for legend"); return()} + xmid <- legend/10 + x <- inner * (1:xmax - (1 + xmax)/2) + xmid + n <- length(x) + tx <- rep.int(hexC$x, n) + ty <- rep.int(hexC$y, n) + six <- rep.int(6:6, n) + y <- rep.int(3 * dy - yinc, xmax) + ## ____________________plotting______________________ + if(is.null(pen)) { + pen <- 1:power +1 + pen <- cbind(pen, pen +10) + } + if(is.null(border)) border <- FALSE + for(i in 1:power) { + y <- y + yinc + hexpolygon(x, y, hexC, + col = pen[i,1], border = border) + grid.polygon(x= tx * rep.int(radius, six) + rep.int(x, six), + y= ty * rep.int(radius, six) + rep.int(y, six), + default.units=leg.unit, id=NULL, + id.lengths=rep(6,n), + gp=gpar(fill = pen[i,2], col = border)) + + grid.text(txt, x, y - 4.5 * dy, + default.units=leg.unit, gp=gpar(cex = lcex)) + ##adj= 0.5, cex = lcex) + grid.text(lab[i], xmid, y[1] + 4.5 * dy, + default.units=leg.unit, gp=gpar(cex = 1.7*lcex)) + ##adj= 0.5, cex = 1.7*lcex) + } + })## switch(style = *) +}## hex.legend() diff --git a/R/hbox.R b/R/hbox.R new file mode 100644 index 0000000..46913e3 --- /dev/null +++ b/R/hbox.R @@ -0,0 +1,83 @@ +hboxplot <- function(bin, xbnds = NULL, ybnds = NULL, + density, border = c(0,grey(.7)), + pen = c(2, 3), unzoom = 1.1, clip="off", reshape = FALSE, + xlab = NULL, ylab = NULL, main = "") +{ + + ##_______________ Collect computing constants______________ + + if(!is(bin,"hexbin")) + stop("first argument must be a hexbin object") + h.xy <- hcell2xy(bin,check.erosion=TRUE) + ##___zoom in scaling with expanding to avoid hexagons outside plot frame___ + + if(is(bin,"erodebin")) { + h.xy$x <- h.xy$x + h.xy$y <- h.xy$y + nxbnds <- if(is.null(xbnds)) range(h.xy$x) else xbnds + nybnds <- if(is.null(ybnds)) range(h.xy$y) else ybnds + ratiox <- diff(nxbnds)/diff(bin@xbnds) + ratioy <- diff(nybnds)/diff(bin@ybnds) + + ratio <- max(ratioy, ratiox) + nxbnds <- mean(nxbnds) + c(-1,1)*(unzoom * ratio * diff(bin@xbnds))/2 + nybnds <- mean(nybnds) + c(-1,1)*(unzoom * ratio * diff(bin@ybnds))/2 + } + else { + nxbnds <- if(is.null(xbnds)) bin@xbnds else xbnds + nybnds <- if(is.null(ybnds)) bin@ybnds else ybnds + } + margins <- unit(0.1 + c(5,4,4,3),"lines") + plot.vp <- hexViewport(bin, xbnds = nxbnds, ybnds = nybnds, + mar=margins, newpage = TRUE) + pushHexport(plot.vp) + grid.rect() + grid.xaxis() + grid.yaxis() + ## xlab, ylab, main : + if(is.null(xlab)) xlab <- bin@xlab + if(is.null(ylab)) ylab <- bin@ylab + if(nchar(xlab) > 0) + grid.text(xlab, y = unit(-2, "lines"), gp= gpar(fontsize= 16)) + if(nchar(ylab) > 0) + grid.text(ylab, x = unit(-2, "lines"), gp= gpar(fontsize= 16), rot = 90) + if(nchar(main) > 0) + grid.text(main, y = unit(1, "npc") + unit(1.5, "lines"), + gp = gpar(fontsize = 18)) + if(clip=="on") { + popViewport() + pushHexport(plot.vp, clip="on") + } + + cnt <- if(is(bin,"erodebin")) bin@count[bin@eroded] else bin@count + + xbins <- bin@xbins + shape <- bin@shape + xnew <- h.xy$x + ynew <- h.xy$y + + ##__________________ Construct a hexagon___________________ + dx <- (0.5 * diff(bin@xbnds))/xbins + dy <- (0.5 * diff(bin@ybnds))/(xbins * shape * sqrt(3)) + hexC <- hexcoords(dx, dy, sep = NULL) + + ##_______________ Full Cell Plotting_____________________ + hexpolygon(xnew, ynew, hexC, density = density, + fill = pen[2], border = border[2]) + + ##______________Plotting median___________________________ + + if(!is(bin,"erodebin")) { + ## No warning here, allow non-erode above! warning("No erode component") + } + else { + med <- which.max(bin@erode) + xnew <- xnew[med] + ynew <- ynew[med] + hexpolygon(xnew, ynew, hexC, density = density, + fill = pen[1], border = border[1]) + } + popViewport() + invisible(plot.vp) + +}# hboxplot() diff --git a/R/hdiffplot.R b/R/hdiffplot.R new file mode 100644 index 0000000..cdbe711 --- /dev/null +++ b/R/hdiffplot.R @@ -0,0 +1,330 @@ + +### FIXME: Need to check for bin erosion +### or fix hcell2xy so that it checks for bin erosion. +### --- Fixed hcell2xy, probably should do the same to other accessor functions +### NL + +get.xrange <- function(xy.lst, xbnds) +{ + range(unlist(lapply(xy.lst, + function(xy, bnd) + xy$x[(xy$x < max(bnd)) & (xy$x > min(bnd))], + xbnds))) +} + +get.yrange <- function(xy.lst, ybnds) +{ + range(unlist(lapply(xy.lst, + function(xy, bnd) + xy$y[(xy$y < max(bnd)) & (xy$y > min(bnd))], + ybnds))) +} + +make.bnds <- function(binlst, xy.lst, xbnds = NULL, ybnds = NULL) +{ + if(inherits(binlst,"hexbinList")) binlst <- binlst@hbins + if(is.null(xbnds)) xbnds <- binlst[[1]]@xbnds + if(is.null(ybnds)) ybnds <- binlst[[1]]@ybnds + + nxbnds <- get.xrange(xy.lst, xbnds) + nybnds <- get.yrange(xy.lst, ybnds) + + list(xbnds = xbnds, ybnds = ybnds, nxbnds = nxbnds, nybnds = nybnds) +} + +all.intersect <- function(binlist) +{ + ## This will not work if all the grids are not the same + ## Will have to rethink this if we move to non-aligned + ## hexagon bins. NL + if(inherits(binlist,"hexbinList")) binlist <- binlist@hbins + ans <- matrix(FALSE, nr = binlist[[1]]@dimen[1]*binlist[[1]]@dimen[2], + nc = length(binlist)) + for(i in 1:length(binlist)) { + if(is(binlist[[i]], "erodebin")) + ans[binlist[[i]]@cell[binlist[[i]]@eroded], i] <- TRUE + else ans[binlist[[i]]@cell, i] <- TRUE + } + ans +} + +## colordist <- function() { +## } + +## MM: FIXME : `` get(where) '' is a kludge! +mixcolors <- function (alpha, color1, where = class(color1)) +{ + alpha <- as.numeric(alpha) + c1 <- coords(as(color1, where)) + na <- length(alpha) + n1 <- nrow(c1) + if(na == 1) + alpha <- rep(alpha, n1) + stopifnot(sum(alpha) == 1) + get(where)(t(apply(c1, 2, function(cols, alpha) alpha%*%cols, alpha))) + +} + +mixcolors2 <- function (colors, alpha, where="hsv") +{ + # colors: an n x 3 matrix of colors + # alpha: an n x 1 vector of color mixing coefficents + # sum(alpha)==1 should be a restriction? + # where: the color space to mix in (not implemented yet) + # The reurn value is a single hex color forming the mixture + # This function is purely linear mixing, nolinear mixing + # would be quite interesting since the colorspaces are not really + # linear, ie mixing alonga manifold in LUV space. + alpha <- as.numeric(alpha) + na <- length(alpha) + n1 <- nrow(colors) + if (n1 < 2) { + warning("need more than two colors to mix") + colors + } + if(na == 1) + alpha <- rep(alpha, n1) + stopifnot(abs(sum(alpha)-1) <= 0.01) + #colors <- convertColor(colors,from="sRGB",to="Lab",scale.in=1) + mix <- t(apply(colors, 2, function(cols, alpha) alpha%*%cols, alpha)) + #convertColor(mix,from="hsv",to="hex",scale.out=1,clip=TRUE) + hsv(mix[1],mix[2],mix[3]) +} + +hdiffplot <- + function(bin1, bin2 = NULL, xbnds = NULL, ybnds = NULL, + focus = NULL, + col.control = list(medhex = "white", med.bord = "black", + focus = NULL, focus.border = NULL, + back.col = "grey"), + arrows = TRUE, size = unit(0.1, "inches"), lwd = 2, + eps = 1e-6, unzoom = 1.08, clip ="off", xlab = "", ylab = "", + main = deparse(mycall), ...) +{ + ## Arguments: + ## bin1 : hexagon bin object or a list of bin objects + ## bin2 : hexagon bin object or NULL + ## bin objects must have the same plotting bounds and shape + ## border : plot the border of the hexagon, use TRUE for + ## hexagon graph paper + + ## Having all the same parameters ensures that all hexbin + ## objects have the same hexagon grid, and there will be no + ## problems intersecting them. When we have a suitable solution to + ## the hexagon interpolation/intersection problem this will be relaxed. + fixx <- xbnds + fixy <- ybnds + + if(!inherits(bin1,"hexbinList")){ + if(is.null(bin2) & is.list(bin1)) { + bin1 <- as(bin1,"hexbinList") + } + else if(is.null(bin2) & (!is.list(bin1))) + stop(" need at least 2 hex bin objects, or a hexbinList") + else { + if(bin1@shape != bin2@shape) + stop("bin objects must have same shape parameter") + if(all(bin1@xbnds == bin2@xbnds) & all(bin1@ybnds == bin2@ybnds)) + equal.bounds <- TRUE + else stop("Bin objects need the same xbnds and ybnds") + if(bin1@xbins != bin2@xbins) + stop("Bin objects need the same number of bins") + nhb <- 2 + ## Need to make a binlist class, then can do as(bin1, bin2, "binlist") + ## or something similar (NL) + bin1 <- list(bin1 = bin1, bin2 = bin2) + bin1 <- as(bin1,"hexbinList") + } + } + mycall <- sys.call() + if(length(mycall) >= 4) { + mycall[4] <- as.call(quote(.....())) + if(length(mycall) > 4) mycall <- mycall[1:4] + } + if(is.null(focus)) focus <- 1:bin1@n + ##_______________ Collect computing constants______________ + tmph.xy <- lapply(bin1@hbins, hcell2xy, check.erosion = TRUE) + + ## Check for erode bins + eroded <- unlist(lapply(bin1@hbins, is, "erodebin")) + shape <- bin1@Shape + xbins <- bin1@Xbins + bnds <- make.bnds(bin1@hbins, tmph.xy, xbnds = fixx, ybnds = fixy) + ratiox <- diff(bnds$nxbnds)/diff(bnds$xbnds) + ratioy <- diff(bnds$nybnds)/diff(bnds$ybnds) + ratio <- max(ratioy, ratiox) + + nxbnds <- mean(bnds$nxbnds) + c(-1, 1)*(unzoom * ratio * diff(bnds$xbnds))/2 + nybnds <- mean(bnds$nybnds) + c(-1, 1)*(unzoom * ratio * diff(bnds$ybnds))/2 + + ##__________________ Construct plot region___________________ + hvp <- hexViewport(bin1@hbins[[1]], xbnds = nxbnds, ybnds = nybnds, + newpage = TRUE) + pushHexport(hvp) + grid.rect() + grid.xaxis() + grid.yaxis() + if(nchar(xlab) > 0) + grid.text(xlab, y = unit(-2, "lines"), gp = gpar(fontsize = 16)) + if(nchar(ylab) > 0) + grid.text(ylab, x = unit(-2, "lines"), gp = gpar(fontsize = 16), rot = 90) + if(nchar(main) > 0) + grid.text(main, y = unit(1, "npc") + unit(1.5, "lines"), + gp = gpar(fontsize = 18)) + + if(clip=='on'){ + popViewport() + pushHexport(hvp,clip="on") + } + ##__________________ Construct hexagon___________________ + dx <- (0.5 * diff(bin1@Xbnds))/xbins + dy <- (0.5 * diff(bin1@Ybnds))/(xbins * shape * sqrt(3)) + hexC <- hexcoords(dx = dx, dy = dy) + + ##__________________ Set up intersections and colors___________________ + if(length(focus) < bin1@n) { + bin1@hbins <- c(bin1@hbins[focus], bin1@hbins[-focus]) + bin1@Bnames <- c(bin1@Bnames[focus], bin1@Bnames[-focus]) + } + cell.stat <- all.intersect(bin1@hbins) + cell.stat.n <- apply(cell.stat, 1, sum) + i.depth <- max(cell.stat.n) + +### I will do this as a recursive function once I get +### The colors worked out! In fact for more than three +### bin objects there is no other way to do this but recursively!!! +### NL. -- Well this solution is like recursion :) + diff.cols <- vector(mode = "list", length = i.depth) + levcells <- which(cell.stat.n == 1) + whichbin <- apply(cell.stat[levcells, ], 1, which) + + ## Set all the focal colors for the unique bin cells + ## if not specified make them equally spaced on the color wheel + ## with high saturation and set the background bins to gray + nfcol <- length(focus) + nhb <- bin1@n + nbcol <- nhb-nfcol + fills <- + if(is.null(col.control$focus)) { + if(nbcol > 0) + matrix(c(seq(0, 360, length = nfcol+1)[1:nfcol]/360, rep(0, nbcol), + rep(1, nfcol), rep(0, nbcol),rep(1, nfcol), rep(.9, nbcol)), + nc=3) + ## V = c(rep(1, nfcol), seq(.9, .1, length=nbcol)) + + else #matrix(c(seq(0, 360, length = nhb+1), s=1, v=1)[1:nfcol] + matrix(c(seq(0, 360, length = nhb+1)/360, + rep(1,nhb+1), + rep(1,nhb+1)),nc=3)[1:nhb,] + } + else { + foc.col <- t(rgb2hsv(col2rgb(col.control$focus))) + if(nbcol > 0) { + bcol <- matrix(c(rep(0, 2*nbcol), rep(.9, nbcol)), nc = 3) + rbind(foc.col, bcol) + } + else foc.col + } + colnames(fills) <- c("h","s","v") + diff.cols[[1]] <- list(fill = fills, border = gray(.8)) + + ##_______________ Full Cell Plotting for Unique Bin1 Cells_________________ + + if(length(levcells) > 0) { + for(i in unique(whichbin)) { + pcells <- + if(eroded[i]) + bin1@hbins[[i]]@cell[bin1@hbins[[i]]@eroded] + else bin1@hbins[[i]]@cell + pcells <- which(pcells %in% levcells[whichbin == i]) + pfill <- diff.cols[[1]]$fill[i,] + pfill <- hsv(pfill[1],pfill[2],pfill[3]) + hexpolygon(x = tmph.xy[[i]]$x[pcells], + y = tmph.xy[[i]]$y[pcells], hexC, + border = diff.cols[[1]]$border , + fill = pfill) + } + } + + ## Now do the intersections. All intersections are convex + ## combinations of the colors of the overlapping unique bins in + ## the CIEluv colorspace. so if the binlist is of length 2 and + ## the focal hbins are "blue" and "yellow" respectively the + ## intersection would be green. First I need to get this to work + ## and then I can think about how to override this with an option + ## in color.control. -NL + + if(i.depth > 1) { + for(dl in 2:(i.depth)) { + levcells <- which(cell.stat.n == dl) + if(length(levcells) == 0) next + + whichbin <- apply(cell.stat[levcells, ], 1, + function(x) paste(which(x), sep = "", collapse = ":")) + inter.nm <- unique(whichbin) + #fills <- matrix(0, length(inter.nm), 3) + fills <- rep(hsv(1), length(inter.nm)) + i <- 1 + for(bn in inter.nm) { + who <- as.integer(unlist(strsplit(bn, ":"))) + fills[i] <- mixcolors2(diff.cols[[1]]$fill[who,], + 1/length(who),where = "LUV") + i <- i+1 + } + #fills <- LUV(fills) + diff.cols[[dl]] <- list(fill = fills, + border = gray((i.depth-dl)/i.depth)) + ##____Full Cell Plotting for Intersecting Cells at Intersection Depth i____ + i <- 1 + for(ints in inter.nm) { + bin.i <- as.integer(unlist(strsplit(ints, ":"))[1]) + pcells <- + if(eroded[bin.i]) + bin1@hbins[[bin.i]]@cell[bin1@hbins[[bin.i]]@eroded] + else bin1@hbins[[bin.i]]@cell + pcells <- which(pcells %in% levcells[whichbin == ints]) + hexpolygon(x = tmph.xy[[bin.i]]$x[pcells], + y = tmph.xy[[bin.i]]$y[pcells], hexC, + border = diff.cols[[dl]]$border , + fill = diff.cols[[dl]]$fill[i] ) + i <- i+1 + } + } + + } + + ##_____________________________Plot Median Cells___________________________ + + ## With all these colors floating around I think it would be worth + ## porting the 3d hexagon stuff to grid. Then it would be easier + ## to distinguish the medians because they would stand out like + ## little volcanoes :) NL + if(any(eroded)) { + hmeds <- matrix(unlist(lapply(bin1@hbins[eroded], + function(x) unlist(getHMedian(x)))), + nc = 2, byrow = TRUE) + hexpolygon(x = hmeds[, 1], y = hmeds[, 2], hexC, + border = col.control$med.b, fill = col.control$medhex) + if(arrows) { + for(i in focus) { + for(j in focus[focus < i]) { + if(abs(hmeds[i, 1] - hmeds[j, 1]) + + abs(hmeds[i, 2] - hmeds[j, 2]) > eps) + grid.lines(c(hmeds[i, 1],hmeds[j, 1]), + c(hmeds[i, 2], hmeds[j, 2]), + default.units = "native", + arrow=arrow(length=size)) + #grid.arrows(c(hmeds[i, 1], hmeds[j, 1]), + # c(hmeds[i, 2], hmeds[j, 2]), + # default.units = "native", + # length = size, gp = gpar(lwd = lwd)) + } + } + } + } + + ##________________Clean Up_______________________________________________ + + popViewport() + invisible(hvp) +} ## hdiffplot() diff --git a/R/hexPlotMA.R b/R/hexPlotMA.R new file mode 100644 index 0000000..8da7066 --- /dev/null +++ b/R/hexPlotMA.R @@ -0,0 +1,191 @@ +plotMAhex <- function (MA, array = 1, xlab = "A", ylab = "M", + main = colnames(MA)[array], + xlim = NULL, ylim = NULL, status = NULL, + values, pch, col, cex, nbin=40, + zero.weights = FALSE, + style = "colorscale", legend = 1.2, lcex = 1, + minarea = 0.04, maxarea = 0.8, mincnt = 2, + maxcnt = NULL, trans = NULL, inv = NULL, + colorcut = NULL, + border = NULL, density = NULL, pen = NULL, + colramp = function(n){ LinGray(n,beg = 90,end = 15) }, + newpage = TRUE, type = c("p", "l", "n"), + xaxt = c("s", "n"), yaxt = c("s", "n"), + verbose = getOption("verbose")) +{ + if(is.null(main))main <- "" + switch(class(MA),marrayRaw={ + x <- maA(MA[,array]) + y <- maM(MA[,array]) + w <- maW(MA[,array]) + },RGList = { + MA <- MA.RG(MA[, array]) + array <- 1 + x <- MA$A + y <- MA$M + w <- MA$w + }, MAList = { + x <- as.matrix(MA$A)[, array] + y <- as.matrix(MA$M)[, array] + if (is.null(MA$weights)) + w <- NULL + else + w <- as.matrix(MA$weights)[, array] + }, list = { + if (is.null(MA$A) || is.null(MA$M)) + stop("No data to plot") + x <- as.matrix(MA$A)[, array] + y <- as.matrix(MA$M)[, array] + if (is.null(MA$weights)) + w <- NULL + else + w <- as.matrix(MA$weights)[, array] + }, MArrayLM = { + x <- MA$Amean + y <- as.matrix(MA$coefficients)[, array] + if (is.null(MA$weights)) + w <- NULL + else + w <- as.matrix(MA$weights)[, array] + }, matrix = { + narrays <- ncol(MA) + if (narrays < 2) + stop("Need at least two arrays") + if (narrays > 5) + x <- apply(MA, 1, median, na.rm = TRUE) + else + x <- rowMeans(MA, na.rm = TRUE) + y <- MA[, array] - x + w <- NULL + }, ExpressionSet = { + if(!require(Biobase)) + stop("cannot process ExpressionSet objects without package Biobase") + narrays <- ncol(exprs(MA)) + if (narrays < 2) + stop("Need at least two arrays") + if (narrays > 5) + x <- apply(exprs(MA), 1, median, na.rm = TRUE) + else + x <- rowMeans(exprs(MA), na.rm = TRUE) + y <- exprs(MA)[, array] - x + w <- NULL + if (missing(main)) + main <- colnames(exprs(MA))[array] + }, AffyBatch = { + if(!require(affy)| !require(Biobase)) + stop("cannot process AffyBatch objects without package Biobase and affy") + narrays <- ncol(exprs(MA)) + if (narrays < 2) + stop("Need at least two arrays") + if (narrays > 5) + x <- apply(log2(exprs(MA)), 1, median, na.rm = TRUE) + else + x <- rowMeans(log2(exprs(MA)), na.rm = TRUE) + y <- log2(exprs(MA)[, array]) - x + w <- NULL + if (missing(main)) + main <- colnames(exprs(MA))[array] + }, stop("MA is invalid object")) + if (!is.null(w) && !zero.weights) { + i <- is.na(w) | (w <= 0) + y[i] <- NA + } + if (is.null(xlim)) + xlim <- range(x, na.rm = TRUE) + if (is.null(ylim)) + ylim <- range(y, na.rm = TRUE) + + hbin <- hexbin(x,y,xbins=nbin,xbnds=xlim,ybnds=ylim, IDs = TRUE) + hp <- plot(hbin, legend=legend, xlab = xlab, ylab = ylab, main = main, + type='n', newpage=newpage) + ## plot the hexagons + pushHexport(hp$plot.vp) + if(is.null(maxcnt)) maxcnt <- max(hbin@count) + if(is.null(colorcut)) colorcut<-seq(0, 1, length = min(17, maxcnt)) + grid.hexagons(hbin, style=style, minarea = minarea, maxarea = maxarea, + mincnt = mincnt, maxcnt= maxcnt, trans = trans, + colorcut = colorcut, density = density, border = border, + pen = pen, colramp = colramp) + if (is.null(status) || all(is.na(status))) { + if (missing(pch)) + pch <- 16 + if (missing(cex)) + cex <- 0.3 + if (missing(col)) { + clrs <- colramp(length(colorcut)-1) + col <- clrs[1] + } + pp <- inout.hex(hbin,mincnt) + grid.points(x[pp], y[pp], pch = pch[[1]], + gp=gpar(cex = cex[1], col=col, fill=col)) + } + else { + if (missing(values)) { + if (is.null(attr(status, "values"))) + values <- names(sort(table(status), decreasing = TRUE)) + else + values <- attr(status, "values") + } + sel <- !(status %in% values) + nonhi <- any(sel) + if (nonhi) grid.points(x[sel], y[sel], pch = 16, gp=gpar(cex = 0.3)) + nvalues <- length(values) + if (missing(pch)) { + if (is.null(attr(status, "pch"))) + pch <- rep(16, nvalues) + else + pch <- attr(status, "pch") + } + if (missing(cex)) { + if (is.null(attr(status, "cex"))) { + cex <- rep(1, nvalues) + if (!nonhi) + cex[1] <- 0.3 + } + else + cex <- attr(status, "cex") + } + if (missing(col)) { + if (is.null(attr(status, "col"))) { + col <- nonhi + 1:nvalues + } + else + col <- attr(status, "col") + } + pch <- rep(pch, length = nvalues) + col <- rep(col, length = nvalues) + cex <- rep(cex, length = nvalues) + for (i in 1:nvalues) { + sel <- status == values[i] + grid.points(x[sel], y[sel], pch = pch[[i]], gp=gpar(cex = cex[i], col = col[i])) + } + } + popViewport() + if (legend > 0) { + inner <- hexbin:::getPlt(hp$plot.vp, ret.unit="inches", numeric=TRUE)[1] + inner <- inner/hbin@xbins + ysize <- hexbin:::getPlt(hp$plot.vp, ret.unit="inches", numeric=TRUE)[2] + pushViewport(hp$legend.vp) + grid.hexlegend(legend, ysize=ysize, lcex = lcex, inner = inner, + style= style, minarea= minarea, maxarea= maxarea, + mincnt= mincnt, maxcnt= maxcnt, + trans=trans, inv=inv, + colorcut = colorcut, + density = density, border = border, pen = pen, + colramp = colramp) + + #if (is.list(pch)) + # legend(x = xlim[1], y = ylim[2], legend = values, + # fill = col, col = col, cex = 0.9) + #else legend(x = xlim[1], y = ylim[2], legend = values, + # pch = pch, , col = col, cex = 0.9) + popViewport() + } + invisible(list(hbin = hbin, plot.vp = hp$plot.vp, legend.vp = hp$legend.vp)) +} + +hexMA.loess <- function(pMA, span = .4, col = 'red', n = 200) +{ + fit <- hexVP.loess(pMA$hbin, pMA$plot.vp, span = span, col = col, n = n) + invisible(fit) +} diff --git a/R/hexViewport.R b/R/hexViewport.R new file mode 100644 index 0000000..5734617 --- /dev/null +++ b/R/hexViewport.R @@ -0,0 +1,250 @@ +setOldClass("unit") +setOldClass("viewport") + +smartBnds <- function(hbin, eps=.05) +{ + hxy <- hcell2xy(hbin) + xr <- range(hxy$x) + yr <- range(hxy$y) + dx <- diff(xr) + dy <- diff(yr) + lambda <- function(a) pmax(log(a), 1) + epsx <- c(-1,1)*(dx*eps/lambda(dx)) + epsy <- c(-1,1)*(dy*eps/lambda(dy)) + sx <- hbin@xbins/diff(hbin@xbnds) + sy <- (hbin@xbins * hbin@shape)/diff(hbin@ybnds) + inner <- 0.5 + outer <- 1/sqrt(3) + dx <- inner/sx + dy <- outer/sy + #xb <- dx/(hbin@xbins+1) + #yb <- dy/((1/sqrt(3))*(hbin@xbins+1)*hbin@shape) + list(xr = xr+ c(-dx,dx)+ epsx, + yr = yr+ c(-dy,dy)+ epsy) +} + +rname <- function(n, chars = letters) +{ + ## random name with n characters + paste(sample(chars, size = n, replace = TRUE), collapse="") +} + +setClass("hexVP", + representation(hexVp.on = "viewport", hexVp.off = "viewport", + mar = "unit", fig = "unit", plt = "unit", + xscale = "numeric", yscale = "numeric",shape="numeric", + hp.name="character") + ) + +hexViewport <- +function(x, offset = unit(0,"inches"), mar = NULL, + xbnds = NULL, ybnds = NULL, newpage = FALSE, + clip ="off", vp.name=NULL) +{ + if(!is(x,"hexbin")) + stop("first argument must be a hexbin object.") + stopifnot(is.unit(offset)) + + hvp <- new("hexVP") + if (newpage) + grid.newpage() + + if(is.null(mar)) { + mar <- unit(0.1 + c(5,4,4,2),"lines") + } + else { + if(!is.unit(mar)) stop("'mar' must be specified in unit()s") + if(length(mar) == 1) + mar <- rep(mar, 4) + else if(length(mar) != 4) + stop("'mar' must have length 1 or 4") + } + ## in both cases + mai <- as.numeric(convertUnit(mar, "inches")) + vpin <- c(convertWidth (unit(1,"npc"),"inches"), convertHeight(unit(1,"npc"),"inches")) + fig <- c(as.numeric(convertUnit(unit(vpin[1],"inches") - offset,"inches")), as.numeric(vpin[2])) + pin <- c(fig[1]-mai[2]-mai[4], fig[2]-mai[1]-mai[3]) + xsize <- pin[1] + ysize <- pin[2] + + ## The point is to optimize the placement + ## and plotting area of the plotting window with + ## the constraint that the margins are preserved + ## to within some epsilon. This is going to get even + ## harder for cases where the complex layouts are + ## being constructed. NL -- I think it is fixed now (NL --3/22/2005) + + ## Now find the maximum rectangle in fig that + ## has the correct aspect ratio and does not spill over epsilon into + ## the margins, i.e. ysize/xsize - aspect.ratio < eps and + ## xsize < fig[1], ysize < fig[2] + + if(x@shape * xsize <= ysize) { + ##center <- (ysize - x@shape * xsize)/2 + center <- (ysize - x@shape * xsize)/2 + mai[1] <- mai[1] + center + mai[3] <- mai[3] + center + ysize <- x@shape * xsize + } else { + center <- (xsize - ysize/x@shape)/2 + mai[2] <- mai[2] + center + mai[4] <- mai[4] + center + xsize <- ysize/x@shape + } + ##fig <- c(pin[1]+mai[2]+ mai[4],fig[2]) + pin <- c(xsize,ysize) + mar <- c(convertUnit(unit(mai[1],"inches"),"lines"), + convertUnit(unit(mai[2],"inches"),"lines"), + convertUnit(unit(mai[3],"inches"),"lines"), + convertUnit(unit(mai[4],"inches"),"lines")) + ##pin <- c(fig[1]-(mai[2] + mai[4]), + ## fig[2]-(mai[1] + mai[3])) + margins <- rep(as.numeric(mar), length.out = 4) + wd <- convertUnit(unit(pin[1],"inches"),"npc") + ## (unit(sum(margins[c(2, 4)]), "lines") + + ## convertUnit(unit(legend,"inches"),"lines")) + ## Oy, mi stupido! This is the problem, need to get the bounds right + ## here. Fixed, do we need to guard against others stupidity and put some + ## checks on xbnds and ybnds? (NL,4/1/2005) + if(is.null(vp.name)) + vp.name <- rname(5) + xyb <- smartBnds(x) + hvp@xscale <- xs <- if(is.null(xbnds)) xyb$xr else xbnds + hvp@yscale <- ys <- if(is.null(ybnds)) xyb$yr else ybnds + ht <- unit(1, "npc") - unit(sum(margins[c(1,3)]), "lines") + hvp@hexVp.off <- + viewport(x = unit(margins[2], "lines"), + y = unit(margins[1], "lines"), + width = wd, height = ht, xscale = xs, yscale = ys, + just = c("left", "bottom"), default.unit = "native", + clip = "off", name = paste(vp.name,".off",sep="")) + hvp@hexVp.on <- + viewport(x = unit(margins[2], "lines"), + y = unit(margins[1], "lines"), + width = wd, height = ht, xscale = xs, yscale = ys, + just = c("left", "bottom"), default.unit = "native", + clip = "on", name = paste(vp.name,".on",sep="")) + hvp@mar <- unit(mar,"lines") + hvp@fig <- convertUnit(unit(fig,"inches"),"npc") + hvp@plt <- convertUnit(unit(pin,"inches"),"npc") + hvp@shape <- x@shape + ##hvp@leg <-convertUnit(offset,"npc") + hvp +} + +## Potentially: +## setGeneric("grid:::pushViewport") +## setMethod("pushViewport", signature(x="hexVP"), +## function(hvp) { pushViewport(hvp@hexVp) }) + +pushHexport <- function(hvp, clip="off") +{ + if(!is(hvp, "hexVP")) + stop("1st argument must be 'hexVP' object") + pushViewport(if(clip=="on") hvp@hexVp.on else hvp@hexVp.off) +} + +## maybe in the future +## setMethod("push",signature("hexVP"), pushHexport) + +setGeneric("getMargins", function(x, ret.unit = "npc", numeric = FALSE) + standardGeneric("getMargins")) +setMethod("getMargins", "hexVP", + function(x, ret.unit = "npc", numeric = FALSE){ + mar <- convertUnit(x@mar,ret.unit) + if(numeric) as.numeric(mar) else mar + }) + +setGeneric("getPlt", function(x, ret.unit = "npc", numeric = FALSE) + standardGeneric("getPlt")) +setMethod("getPlt", "hexVP", + function(x, ret.unit = "npc", numeric = FALSE){ + plt <- convertUnit(x@plt,ret.unit) + if(numeric) as.numeric(plt) else plt + }) + +setGeneric("getFig", function(x, ret.unit = "npc", numeric = FALSE) + standardGeneric("getFig")) +setMethod("getFig", "hexVP", + function(x, ret.unit = "npc", numeric = FALSE){ + fig <- convertUnit(x@fig,ret.unit) + if(numeric) as.numeric(fig) else fig + }) + +## MM doesn't think it's ok to "pollute" the generic-space +## just for basic slot accessors : + +## setGeneric("getXscale", function(x)standardGeneric("getXscale")) +## setMethod("getXscale", "hexVP", function(x){ x@xscale }) + +## setGeneric("getYscale", function(x)standardGeneric("getYscale")) +## setMethod("getYscale", "hexVP", function(x){ x@yscale }) + +hexVP.abline <- function(hvp, a = NULL, b = NULL, h = numeric(0), + v = numeric(0), col = 'black', + lty = 1, lwd = 2, ...) +{ + pushHexport(hvp, clip = 'on') + col.line <- col + if (!is.null(a)) { + if (inherits(a, "lm")) { + coeff <- coef(a) + } + else if (!is.null(tryCatch(coef(a), error = function(e) NULL))) + coeff <- coef(a) + else coeff <- c(a, b) + if (length(coeff) == 1) + coeff <- c(0, coeff) + if (coeff[2] == 0) + h <- c(h, coeff[1]) + else if (!any(is.null(coeff))) { + xx <- current.viewport()$xscale + yy <- current.viewport()$yscale + x <- numeric(0) + y <- numeric(0) + ll <- function(i, j, k, l) + (yy[j] - coeff[1] - coeff[2] * xx[i]) * (yy[l] - coeff[1] - coeff[2] * xx[k]) + if (ll(1, 1, 2, 1) <= 0) { + y <- c(y, yy[1]) + x <- c(x, (yy[1] - coeff[1])/coeff[2]) + } + if (ll(2, 1, 2, 2) <= 0) { + x <- c(x, xx[2]) + y <- c(y, coeff[1] + coeff[2] * xx[2]) + } + if (ll(2, 2, 1, 2) <= 0) { + y <- c(y, yy[2]) + x <- c(x, (yy[2] - coeff[1])/coeff[2]) + } + if (ll(1, 2, 1, 1) <= 0) { + x <- c(x, xx[1]) + y <- c(y, coeff[1] + coeff[2] * xx[1]) + } + if (length(x) > 0) + grid.lines(x = x, y = y, default.units = "native", + gp = gpar(col = col.line, lty = lty, lwd = lwd)) + } + } + h <- as.numeric(h) + v <- as.numeric(v) + for (i in seq(along = h)) + grid.lines(y = rep(h[i], 2), default.units = "native", + gp = gpar(col = col.line, lty = lty, lwd = lwd)) + for (i in seq(along = v)) + grid.lines(x = rep(v[i], 2), default.units = "native", + gp = gpar(col = col.line, lty = lty, lwd = lwd)) + popViewport() +} + +hexVP.loess <- function(hbin, hvp = NULL, span = 0.4, col = 'red', n = 200) +{ + fit <- loess(hbin@ycm ~ hbin@xcm, weights = hbin@count, span = span) + if(!is.null(hvp)) { + pushHexport(hvp, clip = 'on') + grid.lines(seq(0,16, length = n), + predict(fit,seq(0,16, length = n)), + gp = gpar(col = col), default.units = 'native') + popViewport() + } + invisible(fit) +} diff --git a/R/hexbin.s4.R b/R/hexbin.s4.R new file mode 100644 index 0000000..8729b9b --- /dev/null +++ b/R/hexbin.s4.R @@ -0,0 +1,349 @@ +## namespace *internal* function: +addBit <- function(bnds, f = 0.05) bnds + c(-f, f) * diff(bnds) +hexbin <- + function(x, y = NULL, xbins = 30, shape = 1, + xbnds = range(x), ybnds = range(y), + xlab = NULL, ylab = NULL, IDs = FALSE) +{ + call <- match.call() + ## (x,y, xlab, ylab) dealing + xl <- if (!missing(x)) deparse(substitute(x)) + yl <- if (!missing(y)) deparse(substitute(y)) + xy <- xy.coords(x, y, xl, yl) + ch0 <- function(u) if(is.null(u)) "" else u + xlab <- if (is.null(xlab)) ch0(xy$xlab) else xlab + ylab <- if (is.null(ylab)) ch0(xy$ylab) else ylab + x <- xy$x + y <- xy$y + n <- length(x) + na <- is.na(x) | is.na(y) + has.na <- any(na) + if (has.na) { + ok <- !na + x <- x[ok] + y <- y[ok] + n0 <- n + na.pos <- which(na) + n <- length(x) + } + if(diff(xbnds) <= 0) + stop("xbnds[1] < xbnds[2] is not fulfilled") + if(!missing(xbnds) && any(sign(xbnds - range(x)) == c(1,-1))) + stop("'xbnds' must encompass range(x)") + if(diff(ybnds) <= 0) + stop("ybnds[1] < ybnds[2] is not fulfilled") + if(!missing(ybnds) && any(sign(ybnds - range(y)) == c(1,-1))) + stop("'ybnds' must encompass range(y)") + jmax <- floor(xbins + 1.5001) + #imax <- 2 * floor((xbins * shape)/sqrt(3) + 1.5001) + c1 <- 2 * floor((xbins *shape)/sqrt(3) + 1.5001) + imax <- trunc((jmax*c1 -1)/jmax + 1) + lmax <- jmax * imax + ans <- .Fortran("hbin", + x = as.double(x), + y = as.double(y), + cell = integer(lmax), + cnt = integer(lmax), + xcm = double(lmax), + ycm = double(lmax), + xbins = as.double(xbins), + shape = as.double(shape), + xbnds = as.double(xbnds), + ybnds = as.double(ybnds), + dim = as.integer(c(imax, jmax)), + n = as.integer(n), + cID = if(IDs) integer(n) else as.integer(-1), + PACKAGE = "hexbin")[-(1:2)] + + ## cut off extraneous stuff + if(!IDs) ans$cID <- NULL + if(IDs && has.na) { + ok <- as.integer(ok) + ok[!na] <- ans$cID + ok[na] <- NA + ans$cID <- ok + } + nc <- ans$n + length(ans$cell) <- nc + length(ans$cnt) <- nc + length(ans$xcm) <- nc + length(ans$ycm) <- nc + if(sum(ans$cnt) != n) warning("Lost counts in binning") + new("hexbin", + cell = ans$cell, count = ans$cnt, + xcm = ans$xcm, ycm = ans$ycm, xbins = ans$xbins, + shape = ans$shape, xbnds = ans$xbnds , ybnds = ans$ybnds, + dimen = c(imax, jmax), n = n, ncells = ans$n, + call = call, xlab = xlab, ylab = ylab, cID = ans$cID, cAtt = integer(0)) + #dimen = ans$dim +}## hexbin + +setClassUnion("integer or NULL",# < virtual class, used in 'cID' slot + members = c("integer","NULL")) +## MM: I've learned that we should think twice before defining such +## "or NULL" classes: +## setClassUnion("vector or NULL",# < virtual class, used in 'cAtt' slot +## members = c("vector","NULL")) + +setClass("hexbin", + representation(cell = "integer", count = "numeric",##count = "integer", + xcm = "numeric", ycm = "numeric", xbins = "numeric", + shape = "numeric", xbnds = "numeric", + ybnds = "numeric", dimen = "numeric", + n = "integer", ncells = "integer", call = "call", + xlab = "character", ylab = "character", + cID = "integer or NULL", cAtt = "vector")## "or NULL" + ) + + +#setIs("hexbin", function(hbin) class(hbin)=="hexbin") + +## FIXME: add 'validity checking method! + +setGeneric("hcell2xy", function(hbin, check.erosion = TRUE) + standardGeneric("hcell2xy")) +setMethod("hcell2xy", "hexbin", function(hbin, check.erosion = TRUE) +{ + xbins <- hbin@xbins + xbnds <- hbin@xbnds + c3 <- diff(xbnds)/xbins + ybnds <- hbin@ybnds + c4 <- (diff(ybnds) * sqrt(3))/(2 * hbin@shape * xbins) + jmax <- hbin@dimen[2] + cell <- hbin@cell - 1 + i <- cell %/% jmax + j <- cell %% jmax + y <- c4 * i + ybnds[1] + x <- c3 * ifelse(i %% 2 == 0, j, j + 0.5) + xbnds[1] + if(check.erosion && inherits(hbin,"erodebin")) + list(x = x[hbin@eroded], y = y[hbin@eroded]) + else + list(x = x, y = y) +}) + +setGeneric("getHexDxy", function(hbin) standardGeneric("getHexDxy")) +setMethod("getHexDxy", "hexbin", function(hbin){ + sx <- hbin@xbins/diff(hbin@xbnds) + sy <- (hbin@xbins * hbin@shape)/diff(hbin@ybnds) + list(dx=.5/sx, dy=(1/sqrt(3))/(2*sy)) +}) + + +setClass("erodebin", representation("hexbin", + eroded = "logical", + cdfcut = "numeric", + erode = "integer")) + +setGeneric("erode", function(hbin, cdfcut = 0.5) standardGeneric("erode")) + +## currently define the 'hexbin' method (also) as standalone function: +erode.hexbin <- function(hbin, cdfcut = 0.5) +{ + if(!is(hbin,"hexbin")) stop("first argument must be a hexbin object") + #bin.att <- attributes(hbin) + cell <- hbin@cell + cnt <- hbin@count + tmp <- sort(cnt) + cdf <- cumsum(tmp)/sum(cnt) + good <- cdfcut <= cdf + if(!any(good)) + return("no cells selected") + crit <- min(tmp[good]) + good <- crit <= cnt + cell <- cell[good] + cnt <- cnt[good] + #hbin@cell <- cell + #hbin@count <- cnt + n <- length(cell) + bdim <- hbin@dimen + L <- bdim[1] * bdim[2] + ans <- .Fortran("herode", + cell = as.integer(cell), + cnt = as.integer(cnt), + n = n, + bdim = as.integer(bdim), + erode = integer(L), + ncnt = integer(L), + ncell = integer(L), + sides = integer(L), + neib = integer(6 * L), + exist = logical(L + 1), + PACKAGE = "hexbin") $ erode + length(ans) <- n + ehbin <- new("erodebin", hbin, cdfcut = cdfcut, eroded = good, erode = ans) + #hbin@erode <- ans + #class(hbin) <- c(class(hbin),"erodebin") + ehbin +} +setMethod("erode", "hexbin", erode.hexbin) + +setGeneric("getHMedian", function(ebin) standardGeneric("getHMedian")) +setMethod("getHMedian", "erodebin", function(ebin) + { + xy <- hcell2xy(ebin) + stopifnot(1 == length(med <- which.max(ebin@erode))) + med.x <- xy$x[med] + med.y <- xy$y[med] + + list(x = med.x, y = med.y) + }) + +## Still define the 'hexbin' plot method (also) as standalone function: +## This is deprecated! +gplot.hexbin <- + function(x, style = "colorscale", + legend = 1.2, lcex = 1, + minarea = 0.04, maxarea = 0.8, mincnt = 1, maxcnt = max(x@count), + trans = NULL, inv = NULL, + colorcut = seq(0, 1, length = min(17, maxcnt)), + border = NULL, density = NULL, pen = NULL, + colramp = function(n) LinGray(n, beg = 90, end = 15), + xlab = NULL, ylab = NULL, main = "", newpage = TRUE, + type = c("p", "l", "n"), xaxt = c("s", "n"), yaxt = c("s", "n"), + clip="on", verbose = getOption("verbose")) +{ + if(!is(x,"hexbin")) + stop("first argument must be a hexbin object") + if(minarea < 0) + stop("Minimum area must be non-negative") + if(maxarea > 1) + warning("Maximum area should be <= 1 this leads to overlapping hexagons") + if(minarea > maxarea) + stop("Minarea must be <= maxarea") + if (length(colorcut) > 1) { # a sequence 0,...,1 + if(colorcut[1] != 0) + stop("Colorcut lower boundary must be 0") + if(colorcut[length(colorcut)] != 1) + stop("Colorcut upper boundary must be 1") + } + else { + colorcut <- + if(colorcut > 1) seq(0, 1, length = min(c(17, colorcut, maxcnt))) + else 1 + } + + if(is.logical(legend)) { + if(legend) + stop("Give the legend width") + else legend <- 0 + } else stopifnot(is.numeric(legend) && length(legend) == 1) + + type <- match.arg(type) + xaxt <- match.arg(xaxt) + yaxt <- match.arg(yaxt) + + ## ----- plotting starts ------------------------ + if (newpage) grid.newpage() + hv.ob <- hexViewport(x, offset = unit(legend,"inches")) + pushViewport(hv.ob@hexVp.off) + grid.rect() + if(xaxt != "n") grid.xaxis() + if(yaxt != "n") grid.yaxis() + ## xlab, ylab, main : + if(is.null(xlab)) xlab <- x@xlab + if(is.null(ylab)) ylab <- x@ylab + if(nchar(xlab) > 0) + grid.text(xlab, y = unit(-2, "lines"), gp = gpar(fontsize = 16)) + if(nchar(ylab) > 0) + grid.text(ylab, x = unit(-2, "lines"), gp = gpar(fontsize = 16), rot = 90) + if(nchar(main) > 0) + grid.text(main, y = unit(1, "npc") + unit(1.5, "lines"), + gp = gpar(fontsize = 18)) + if(type != "n") { + if(clip == "on") { + popViewport() + pushViewport(hv.ob@hexVp.on) + } + grid.hexagons(x, style = style, minarea = minarea, maxarea = maxarea, + mincnt = mincnt, maxcnt = maxcnt, check.erosion = FALSE, + trans = trans, colorcut = colorcut, density = density, + border = border, pen = pen, + colramp = colramp, verbose = verbose) + } + + popViewport()# plot + #popViewport()# fig + ## ----- Legend ------------------------ + if(legend > 0) { + if(!is.null(trans) && is.null(inv)) + stop("Must supply the inverse transformation") + if(verbose) + cat("plot.hexbin( legend > 0): ... hex.legend()\n") + inner <- getPlt(hv.ob, ret.unit = "inches", numeric = TRUE)[1]/x@xbins + ##inner <- as.numeric(convertUnit(hv.ob@plt[1],"inches"))/x@xbins + ##outer <- (inner * sqrt(3))/2 + ##switch(style, + ## lattice = , + ## centroids = { + ## if(length(colorcut) * outer > ysize - 1) { + ## warning("Colorcut is being shortened") + ## colorcut <- seq(0, 1, + ## max(1, floor((ysize - 1)/outer))) + ## } + ## } + ## ) + ysize <- getPlt(hv.ob, ret.unit = "inches", numeric = TRUE)[2] + #as.numeric(convertUnit(hv.ob@plt[2],"inches")) + legVp <- viewport(x = unit(1,"npc") - + convertX(unit(legend,"inches"), "npc"), + #y = convertY(unit(mai[1],"inches"),"npc"), + y = hv.ob@mar[1], + #height = unit(1,"npc") - + #convertY(unit(mai[3]+mai[1],"inches"),"npc"), + height = unit(1,"npc")-(hv.ob@mar[1]+ hv.ob@mar[3]), + width = convertUnit(unit(legend,"inches"),"npc"), + default.units = "native", + just = c("left","bottom"), + xscale = c(0, legend), + yscale = c(0, ysize)) + if(type != "n") { + pushViewport(legVp) + grid.hexlegend(legend, ysize = ysize, lcex = lcex, inner = inner, + style = style, minarea = minarea, maxarea = maxarea, + mincnt = mincnt, maxcnt = maxcnt, + trans = trans, inv = inv, colorcut = colorcut, + density = density, border = border, pen = pen, + colramp = colramp) + popViewport() + } + } + + invisible(list(plot.vp = hv.ob, legend.vp = if(legend) legVp)) +} ## gplot.hexbin() + +setMethod("plot", signature(x = "hexbin", y = "missing"), gplot.hexbin) + +setMethod("show", "hexbin", + function(object) { + cat("'hexbin' object from call:", deparse(object@call), "\n") + dm <- object@dimen + cat("n =", object@n, " points in nc =", object@ncells, + " hexagon cells in grid dimensions ", dm[1], "by", dm[2],"\n") + invisible(object) + }) + +setMethod("summary", "hexbin", + function(object, ...) { + show(object, ...) + print(summary(data.frame(cell = object@cell, count = object@count, + xcm = object@xcm, ycm = object@ycm), + ...)) + if(!is.null(object@cID)) { + cat("IDs: "); str(object@cID) + } + }) + + + +if(FALSE) { ##-- todo -- +#setMethod("identify" +identify.hexbin <- function(x, labels = x$cnt, offset = 0, ...) +{ + if(length(labels) != x$n) + stop("labels not the same length as number of cells") + ##NL: Should this be a warning? + + ## -> typically default method: + identify(hcell2xy(x), labels = labels, offset = offset, ...) +} +}#not yet diff --git a/R/hexbinList.R b/R/hexbinList.R new file mode 100644 index 0000000..7938ab6 --- /dev/null +++ b/R/hexbinList.R @@ -0,0 +1,106 @@ +hexList <- function(x,y=NULL,given=NULL,xbins=30,shape=1, + xbnds = NULL, ybnds = NULL, + xlab = NULL, ylab = NULL) +{ + xl <- if (!missing(x)) deparse(substitute(x)) + yl <- if (!missing(y)) deparse(substitute(y)) + xy <- xy.coords(x, y, xl, yl) + if(length(given)!=length(xy$x) | is.null(given)) + stop("Given is is different length from x and y") + if(is.factor(given)) + given <- as.character(given) + clss <- unique(given) + if(is.null(xbnds)) + xbnds <- range(xy$x) + if(is.null(ybnds)) + ybnds <- range(xy$y) + hbins <- vector(mode = "list",length=length(clss)) + i <- 1 + for(g in clss){ + hbins[[i]] <- hexbin(xy$x[given==g],xy$y[given==g], + xbins=xbins,shape=shape,xbnds=xbnds,ybnds=ybnds) + i <- i+1 + } + mx <- max(unlist(lapply(hbins,function(h)max(h@count)))) + mn <- min(unlist(lapply(hbins,function(h)min(h@count)))) + hl <- new("hexbinList",n=length(hbins),hbins=hbins, Xbnds=xbnds, + Ybnds=ybnds, Xbins=integer(xbins), Shape=shape, Bnames=clss, + CntBnds=c(mn,mx)) + hl +} + + +setClass("hexbinList", + representation(n="integer", hbins="vector", + Xbnds="numeric", Ybnds="numeric", + Xbins="numeric", Shape="numeric", + Bnames="character", CntBnds="numeric") + + ) + + +bnds.check <- function(binlst, xb = TRUE, yb = TRUE) +{ + xb <- + if(xb) { + b <- binlst[[1]]@xbnds + all(unlist(lapply(binlst, function(x, bnd) all(x@xbnds == bnd), b))) + } else TRUE + yb <- + if(yb) { + b <- binlst[[1]]@ybnds + all(unlist(lapply(binlst, function(y, bnd) all(y@ybnds == bnd), b))) + } else TRUE + xb & yb +} + +xbins.check <- function(binlst) +{ + xb <- binlst[[1]]@xbins + all(unlist(lapply(binlst, function(y, xbin)all(y@xbins == xbin), xb))) +} + +shape.check <- function(binlst) +{ + xs <- binlst[[1]]@shape + all(unlist(lapply(binlst, function(y, xsh)all(y@shape == xsh), xs))) +} + +list2hexList <- function(binlst) +{ + if(length(binlst) < 2) + stop(" need at least 2 hex bin objects") + if(!all(unlist(lapply(binlst, is, "hexbin")))) + stop("All Elements of list must be hexbin objects") + if(!bnds.check(binlst)) + stop("All bin objects in list need the same xbnds and ybnds") + if(!xbins.check(binlst)) + stop("All bin objects in list need the same number of bins") + if(!shape.check(binlst)) + stop("All bin objects in list need the same shape parameter") + mx <- max(unlist(lapply(binlst,function(h)max(h@count)))) + mn <- min(unlist(lapply(binlst,function(h)min(h@count)))) + xbins <- binlst[[1]]@xbins + xbnds <- binlst[[1]]@xbnds + ybnds <- binlst[[1]]@ybnds + shape <- binlst[[1]]@shape + hl <- new("hexbinList",n=length(binlst),hbins=binlst, Xbnds=xbnds, + Ybnds=ybnds, Xbins=xbins, Shape=shape, + Bnames=names(binlst), CntBnds=c(mn,mx)) + hl +} + +setAs("list","hexbinList",function(from)list2hexList(from)) + +#setMethod("[", "hexbinList", function(hbl,i,...) +#{ +# if( length(list(...)) > 0 ) +# stop("extra subscripts cannot be handled") +# if(missing(i)) hbl +# hbl@hbins[i] +#}) + +##setMethod("[[", "hexbinList", function(hbl) +##{ + +##}) diff --git a/R/hexbinplot.R b/R/hexbinplot.R new file mode 100644 index 0000000..4df675f --- /dev/null +++ b/R/hexbinplot.R @@ -0,0 +1,777 @@ +## lattice version of gplot.hexbin + +## There are two major problems. (1) For comparability across panels, +## we want the same mincnt and maxcnt in all panels. However, a +## suitable default can really only be determined at printing time, +## since it would depend on the physical dimensions of the panel. (2) +## there is no proper way to communicate the mincnt and maxcnt to the +## legend. + +## Tentative solution: the counts can be calculated once enough things +## are known, namely the aspect ratio, xbins and [xy]bnds. An +## important question then is whether [xy]bnds should be [xy]lim or +## range([xy]). Both should be allowed, since [xy]lim makes them +## comparable, range([xy]) potentially shows more detail. For +## relation != "same", both are more or less similar. An important +## observation is that with range([xy]), 'shape = aspect ratio of +## panel' does not guarantee symmetric hexagons, so shape has to be +## different for each panel. + +## Only feasible approach I can think of is to produce the trellis +## object first (with known aspect, so aspect="fill" is absolutely +## no-no), then analyze the limits and relevant panel arguments to get +## 'maxcnt' (essentially doing a dry run of the panel calculations). +## This needs undocumented knowledge of the trellis object, which is +## kinda not good, but at least it gets the job done. Once we know +## maxcnt, we can also set up a suitable legend function. + +## Unfortunately, this has the potential to screw up update calls that +## modify certain things. Is there any way to capture those? Maybe +## make a new class that inherits from "trellis". For now, we'll +## pretend that the problem doesn't exist. + + +## tool borrowed from lattice +updateList <- function (x, val) +{ + if (is.null(x)) x <- list() + modifyList(x, val) +} + + +prepanel.hexbinplot <- + function(x, y, type = character(0),...) +{ + if('tmd'%in%type){ + tmp <- x + x <- (y + x)/sqrt(2) + y <- (y - tmp)/sqrt(2) + } + ans <- + list(xlim = range(x, finite = TRUE), + ylim = range(y, finite = TRUE), + dx = IQR(x,na.rm=TRUE), + dy = IQR(y,na.rm=TRUE)) +} + + +panel.hexbinplot <- + function(x, y, ..., groups = NULL) +{ + if (is.null(groups)) panel.hexbin(x, y, ...) + else panel.hexpose(x, y, ..., groups = groups) +} + + +panel.hexbin <- + function(x, y, + xbins = 30, + xbnds = c("data", "panel"), # was: xbnds = c("panel", "data"), + ybnds = c("data", "panel"), # was: ybnds = c("panel", "data"), + + ## special args + .prelim = FALSE, + .cpl = current.panel.limits(), + .xlim = .cpl$xlim, + .ylim = .cpl$ylim, + .aspect.ratio = 1, # default useful with splom(, panel = panel.hexbin) + + type = character(0), + ..., + check.erosion = FALSE) +{ + if ("tmd" %in% type) { + tmp <- x + x <- (y + x)/sqrt(2) + y <- (y - tmp)/sqrt(2) + } + if (is.character(xbnds)) + xbnds <- + switch(match.arg(xbnds), + panel = .xlim, + data = range(x, finite = TRUE)) + if (is.character(ybnds)) + ybnds <- + switch(match.arg(ybnds), + panel = .ylim, + data = range(y, finite = TRUE)) + shape <- + .aspect.ratio * (diff(ybnds) / diff(.ylim)) / + (diff(xbnds) / diff(.xlim)) + if (!missing(check.erosion)) + warning("explicit 'check.erosion' specification ignored") + h <- hexbin(x = x, y = y, + xbins = xbins, shape = shape, + xbnds = xbnds, ybnds = ybnds) + if (.prelim) + return(max(h@count)) + + ## have to do this because grid.hexagons croaks with unrecognized + ## arguments: + args <- list(dat = h, check.erosion = FALSE, ...) + keep <- names(args) %in% names(formals(grid.hexagons)) + + if ('g' %in% type) panel.grid(h = -1, v = -1) + if ('hg' %in% type) panel.hexgrid(h) + + do.call("grid.hexagons", args[keep]) + + if ("r" %in% type) panel.lmline(x, y, ...) + if ("smooth" %in% type) panel.hexloess(h,...) + invisible() +} + +panel.hexboxplot <- + function(x, y, + xbins = 30, + xbnds = c("data", "panel"), # was: xbnds = c("panel", "data"), + ybnds = c("data", "panel"), # was: ybnds = c("panel", "data"), + + ## special args + .prelim = FALSE, + .cpl = current.panel.limits(), + .xlim = .cpl$xlim, + .ylim = .cpl$ylim, + .aspect.ratio = 1, + + type = character(0), + cdfcut=.25, + shadow=.05, + ..., + check.erosion = TRUE) +{ + if (is.character(xbnds)) + xbnds <- + switch(match.arg(xbnds), + panel = .xlim, + data = range(x, finite = TRUE)) + if (is.character(ybnds)) + ybnds <- + switch(match.arg(ybnds), + panel = .ylim, + data = range(y, finite = TRUE)) + shape <- + .aspect.ratio * (diff(ybnds) / diff(.ylim)) / + (diff(xbnds) / diff(.xlim)) + if (!missing(check.erosion)) + warning("explicit 'check.erosion' specification ignored") + h <-hexbin(x = x, y = y, + xbins = xbins, shape = shape, + xbnds = xbnds, ybnds = ybnds,IDs=TRUE) + + if (.prelim) + return(max(h@count)) + + ## have to do this because grid.hexagons croaks with unrecognized + ## arguments: + args <- list(dat = h, check.erosion = FALSE, ...) + keep <- names(args) %in% names(formals(grid.hexagons)) + if ('hg' %in% type) panel.hexgrid(h) + if ('g' %in% type) panel.grid(h = -1, v = -1) + if(shadow) { + eh <- erode(h,cdfcut=shadow) + h.xy <- hcell2xy(eh,check.erosion=TRUE) + dx <- (0.5 * diff(eh@xbnds))/eh@xbins + dy <- (0.5 * diff(eh@ybnds))/(eh@xbins * h@shape * sqrt(3)) + hexC <- hexcoords(dx, dy, sep = NULL) + hexpolygon(h.xy$x,h.xy$y, hexC, density = density, + fill = NA, border = gray(.75)) + } + eh <- erode(h,cdfcut=cdfcut) + h.xy <- hcell2xy(eh,check.erosion=TRUE) + dx <- (0.5 * diff(eh@xbnds))/eh@xbins + dy <- (0.5 * diff(eh@ybnds))/(eh@xbins * h@shape * sqrt(3)) + hexC <- hexcoords(dx, dy, sep = NULL) + hexpolygon(h.xy$x,h.xy$y, hexC, density = density, + fill = "green", border = gray(.75)) + med <- which.max(eh@erode) + xnew <- h.xy$x[med] + ynew <- h.xy$y[med] + hexpolygon(xnew, ynew, hexC, density = density, + fill = "red", border =gray(.25)) + invisible() +} + +panel.hexpose <- + function(x, y, groups, subscripts, + xbins = 30, + xbnds = c("data", "panel"), # was: xbnds = c("panel", "data"), + ybnds = c("data", "panel"), # was: ybnds = c("panel", "data"), + + ## special args + .prelim = FALSE, + .cpl = current.panel.limits(), + .xlim = .cpl$xlim, + .ylim = .cpl$ylim, + .aspect.ratio = 1, + #erode Args + cdfcut=.05, + #hdiff Args + hexpose.focus=c(1,2), + hexpose.focus.colors=c("yellow","blue"), + hexpose.focus.border=c("cyan","orange"), + hexpose.median.color="red", + hexpose.median.border="black", + arrows = TRUE, + size = unit(0.1, "inches"), + arrow.lwd = 2, + eps = 1e-6, + type = character(0), + ..., + check.erosion = TRUE) +{ + if (is.character(xbnds)) + xbnds <- + switch(match.arg(xbnds), + panel = .xlim, + data = range(x, finite = TRUE)) + if (is.character(ybnds)) + ybnds <- + switch(match.arg(ybnds), + panel = .ylim, + data = range(y, finite = TRUE)) + shape <- + .aspect.ratio * (diff(ybnds) / diff(.ylim)) / + (diff(xbnds) / diff(.xlim)) + if (is.numeric(groups)) groups <- as.character(groups[subscripts]) + else groups <- groups[subscripts] + binL <- hexList(x, y, given=groups, xbins=xbins, shape=shape, + xbnds=xbnds, ybnds=ybnds) + if ('hs' %in% type) lapply(binL@hbins,smooth.hexbin) + binL@hbins <- lapply(binL@hbins,erode,cdfcut=cdfcut) + if ('hg' %in% type) panel.hexgrid(binL@hbins[[1]]) ## ??? + if ('g' %in% type) panel.grid(h = -1, v = -1) + eroded <- unlist(lapply(binL@hbins, is, "erodebin")) + tmph.xy <- lapply(binL@hbins, hcell2xy, check.erosion = TRUE) + + ##__________________ Construct hexagon___________________ + dx <- (0.5 * diff(binL@Xbnds))/xbins + dy <- (0.5 * diff(binL@Ybnds))/(xbins * binL@Shape * sqrt(3)) + hexC <- hexcoords(dx = dx, dy = dy) + + ##__________________ Set up intersections and colors___________________ + ## Reorder so that the focus bin objects are at the top of the list + if(length(hexpose.focus) < binL@n) { + binL@hbins <- c(binL@hbins[hexpose.focus], binL@hbins[-hexpose.focus]) + binL@Bnames <- c(binL@Bnames[hexpose.focus], binL@Bnames[-hexpose.focus]) + } + cell.stat <- all.intersect(binL@hbins) + cell.stat.n <- apply(cell.stat, 1, sum) + i.depth <- max(cell.stat.n) + + diff.cols <- vector(mode = "list", length = i.depth) + levcells <- which(cell.stat.n == 1) + whichbin <- apply(cell.stat[levcells, ], 1, which) + ## Set all the focal colors for the unique bin cells + ## if not specified make them equally spaced on the color wheel + ## with high saturation and set the background bins to gray + nfcol <- length(hexpose.focus) + nhb <- binL@n + nbcol <- nhb-nfcol + fills <- + if(is.null(hexpose.focus.colors)) { + if(nbcol > 0) + hsv(h = c(seq(0, 1, length = nfcol+1)[1:nfcol],rep(0, nbcol)), + s = c(rep(1, nfcol), rep(0, nbcol)), + ## V = c(rep(1, nfcol), seq(.9, .1, length=nbcol)) + v = c(rep(1, nfcol), rep(.9, nbcol))) + else hsv(h=seq(0, 1, length = nhb+1))[1:nfcol] + } + else { + foc.col <- t(col2rgb(hexpose.focus.colors))/255 + if(nbcol > 0) { + bcol <- t(col2rgb(rep(grey(.6),nbcol)))/255 + rbind(foc.col, bcol) + } + else foc.col + } + diff.cols[[1]] <- list(fill = fills, border = gray(.8)) + + ##_______________ Full Cell Plotting for Unique BinL Cells_________________ + + if(length(levcells) > 0) { + for(i in unique(whichbin)) { + pcells <- + if(eroded[i]) + binL@hbins[[i]]@cell[binL@hbins[[i]]@eroded] + else binL@hbins[[i]]@cell + pcells <- which(pcells %in% levcells[whichbin == i]) + + hexpolygon(x = tmph.xy[[i]]$x[pcells], + y = tmph.xy[[i]]$y[pcells], hexC, + border = hexpose.focus.border[i] , + fill = hexpose.focus.colors[i] ) + } + } + + ## Now do the intersections. All intersections are convex + ## combinations of the colors of the overlapping unique bins in + ## the CIEluv colorspace. so if the binlist is of length 2 and + ## the focal hbins are "blue" and "yellow" respectively the + ## intersection would be green. First I need to get this to work + ## and then I can think about how to override this with an option + ## in color.control. -NL + + if(i.depth > 1) { + for(dl in 2:(i.depth)) { + levcells <- which(cell.stat.n == dl) + if(length(levcells) == 0) next + + whichbin <- apply(cell.stat[levcells, ], 1, + function(x)paste(which(x), sep = "", collapse = ":")) + inter.nm <- unique(whichbin) + fills <- matrix(0, length(inter.nm), 3) + i <- 1 + for(bn in inter.nm) { + who <- as.integer(unlist(strsplit(bn, ":"))) + ## FIXME (DS): this doesn't work + fills[i, ] <- mixcolors2(1/length(who), + diff.cols[[1]]$fill[who,]) + i <- i+1 + } + fills <- rgb(fills[,1],fills[,2],fills[,3]) + diff.cols[[dl]] <- list(fill = fills, + border = gray((i.depth-dl)/i.depth)) + ##____Full Cell Plotting for Intersecting Cells at Intersection Depth i____ + i <- 1 + for(ints in inter.nm) { + bin.i <- as.integer(unlist(strsplit(ints, ":"))[1]) + pcells <- + if(eroded[bin.i]) + binL@hbins[[bin.i]]@cell[binL@hbins[[bin.i]]@eroded] + else binL@hbins[[bin.i]]@cell + pcells <- which(pcells %in% levcells[whichbin == ints]) + hexpolygon(x = tmph.xy[[bin.i]]$x[pcells], + y = tmph.xy[[bin.i]]$y[pcells], hexC, + border = diff.cols[[dl]]$border , + fill = diff.cols[[dl]]$fill[i] ) + i <- i+1 + } + } + } + + if(any(eroded)) { + hmeds <- matrix(unlist(lapply(binL@hbins[eroded], + function(x)unlist(getHMedian(x)))), + nc = 2, byrow = TRUE) + hexpolygon(x = hmeds[, 1], y = hmeds[, 2], hexC, + border = hexpose.median.border, + fill = hexpose.median.color) + if(arrows) { + for(i in hexpose.focus) { + for(j in hexpose.focus[hexpose.focus < i]) { + if(abs(hmeds[i, 1] - hmeds[j, 1]) + + abs(hmeds[i, 2] - hmeds[j, 2]) > eps) + grid.arrows(c(hmeds[i, 1], hmeds[j, 1]), + c(hmeds[i, 2], hmeds[j, 2]), + default.units = "native", + length = size, gp = gpar(lwd = arrow.lwd)) + } + } + } + } + invisible() +} + + +hexbinplot <- function(x, data, ...) UseMethod("hexbinplot") + + +hexbinplot.formula <- + function(x, data = NULL, + prepanel = prepanel.hexbinplot, + panel = panel.hexbinplot, + groups = NULL, + aspect = "xy", + trans = NULL, + inv = NULL, + colorkey = TRUE, + ..., + maxcnt, + legend = NULL, + legend.width = TRUE, + subset = TRUE) +{ + ocall <- sys.call(sys.parent()) + ocall[[1]] <- quote(hexbinplot) + ccall <- match.call() + if (is.logical(legend.width)) legend.width <- 1.2 * as.numeric(legend.width) + if (is.character(aspect) && aspect == "fill") + stop("aspect = 'fill' not permitted") + if (!is.null(trans) && is.null(inv)) + stop("Must supply the inverse transformation 'inv'") + ccall$data <- data + ccall$prepanel <- prepanel + ccall$panel <- panel + ccall$aspect <- aspect + ccall$trans <- trans + ccall$inv <- inv + ccall$legend <- legend + ccall[[1]] <- quote(lattice::xyplot) + ans <- eval(ccall, parent.frame()) + + ## panel needs to know aspect ratio to calculate shape + ans <- update(ans, .aspect.ratio = ans$aspect.ratio) + + ## also need maxcnt, o.w. can't draw legend, panels not comparable + ## either + if (missing(maxcnt)) + maxcnt <- + max(mapply(panel.hexbinplot, ## note: not 'panel' + x = lapply(ans$panel.args, "[[", "x"), + y = lapply(ans$panel.args, "[[", "y"), + .xlim = + if (is.list(ans$x.limits)) ans$x.limits + else rep(list(ans$x.limits), length(ans$panel.args)), + .ylim = + if (is.list(ans$y.limits)) ans$y.limits + else rep(list(ans$y.limits), length(ans$panel.args)), + MoreArgs = + c(ans$panel.args.common, + list(.prelim = TRUE, .cpl = NA)))) + ans <- update(ans, maxcnt = maxcnt) + if (colorkey) + ans <- + update(ans, + legend = updateList(ans$legend, + list(right = + list(fun = hexlegendGrob, + args = + list(maxcnt = maxcnt, + trans = trans, + inv = inv, + legend = legend.width, + ...))))) + ans$call <- ocall + ans +} + + + +old.hexbinplot.formula <- + function(x, data = parent.frame(), + prepanel = prepanel.hexbinplot, + panel = if (is.null(groups)) panel.hexbinplot + else panel.hexpose, + groups=NULL, + aspect = "xy", + trans = NULL, + inv = NULL, + colorkey = TRUE, + ..., + maxcnt, + legend = NULL, + legend.width = TRUE) +{ + if (is.logical(legend.width)) + legend.width <- 1.2 * as.numeric(legend.width) + if (is.character(aspect) && aspect == "fill") + stop("aspect = 'fill' not permitted") + if (!is.null(trans) && is.null(inv)) + stop("Must supply the inverse transformation 'inv'") + groups <- eval(substitute(groups), data, parent.frame()) + ## There must be a better way to handle this, ugh. + ans <- + if(is.null(groups)) + { + xyplot(x, data = data, + prepanel = prepanel, + panel = panel, + aspect = aspect, + trans = trans, + inv = inv, + legend = legend, + ...) + } + else + { + xyplot(x, data = data, + prepanel = prepanel, + panel = panel, + groups=groups, + aspect = aspect, + trans = trans, + inv = inv, + legend = legend, + ...) + } + ## panel needs to know aspect ratio to calculate shape + ans <- update(ans, .aspect.ratio = ans$aspect.ratio) + + ## also need maxcnt, o.w. can't draw legend, panels not comparable + ## either + if (missing(maxcnt)) + maxcnt <- + max(mapply(panel.hexbinplot, ## note: not 'panel' + x = lapply(ans$panel.args, "[[", "x"), + y = lapply(ans$panel.args, "[[", "y"), + .xlim = + if (is.list(ans$x.limits)) ans$x.limits + else rep(list(ans$x.limits), length(ans$panel.args)), + .ylim = + if (is.list(ans$y.limits)) ans$y.limits + else rep(list(ans$y.limits), length(ans$panel.args)), + MoreArgs = + c(ans$panel.args.common, + list(.prelim = TRUE, .cpl = NA)))) + ans <- update(ans, maxcnt = maxcnt) + if (colorkey) + ans <- + update(ans, + legend = updateList(ans$legend, + list(right = + list(fun = hexlegendGrob, + args = + list(maxcnt = maxcnt, + trans = trans, + inv = inv, + legend = legend.width, + ...))))) + ans +} + + +## want a grob instead of actual plotting + +hexlegendGrob <- + function(legend = 1.2, + inner = legend / 5, + cex.labels = 1, + cex.title = 1.2, + style = "colorscale", + minarea = 0.05, maxarea = 0.8, + mincnt = 1, maxcnt, + trans = NULL, inv = NULL, + colorcut = seq(0, 1, length = 17), + density = NULL, border = NULL, pen = NULL, + colramp = function(n) { LinGray(n,beg = 90,end = 15) }, + ..., + vp = NULL, + draw = FALSE) +{ + ## the formal arg matching should happen + style <- match.arg(style, eval(formals(grid.hexagons)[["style"]])) + if (style %in% c("centroids", "lattice", "colorscale")) { + ## _______________tranformations_______________________ + if(is.null(trans)) + { + sc <- maxcnt - mincnt + bnds <- round(mincnt + sc * colorcut) + } + else + { + if(!is.function(trans) && !is.function(inv)) + stop("'trans' and 'inv' must both be functions if 'trans' is not NULL") + con <- trans(mincnt) + sc <- trans(maxcnt) - con + bnds <- round(inv(con + sc * colorcut)) + } + } + + ## grob + ans <- + switch(style, + "colorscale" = { + + n <- length(bnds) + pen <- colramp(n-1) + + ## rectangles instead of polygons + ## pol <- + ## rectGrob(x = 0.5, y = 1:(n-1)/n, + ## height = 1/n, + ## default.units = "npc", + ## gp = gpar(fill = pen, col = border)) + + hexxy <- hexcoords(dx = 1, n = 1)[c("x", "y")] + maxxy <- max(abs(unlist(hexxy))) + hexxy <- lapply(hexxy, function(x) 0.5 * x/ maxxy) + + pol <- + polygonGrob(x = 0.5 + rep(hexxy$x, n-1), + y = (rep(1:(n-1), each = 6) + hexxy$y) / n, + id.lengths = rep(6, n-1), + gp = gpar(fill = pen, col = border), + default.units = "npc") + txt <- + textGrob(as.character(bnds), + x = 0.5, + y = (0:(n-1) + 0.5) / n, + gp = gpar(cex = cex.labels), + default.units = "npc") + ttl <- textGrob("Counts", gp = gpar(cex = cex.title)) + + key.layout <- + grid.layout(nrow = 2, ncol = 2, + heights = + unit(c(1.5, 1), + c("grobheight", "grobheight"), + data = list(ttl, txt)), + widths = + unit(c(1/n, 1), + c("grobheight", "grobwidth"), + data = list(pol, txt)), + respect = TRUE) + key.gf <- frameGrob(layout = key.layout, vp = vp) + key.gf <- placeGrob(key.gf, ttl, row = 1, col = 1:2) + key.gf <- placeGrob(key.gf, pol, row = 2, col = 1) + key.gf <- placeGrob(key.gf, txt, row = 2, col = 2) + key.gf + }, + "centroids" = , + "lattice" = { + warning("legend shows relative sizes") + + ## Note: it may not be impossible to get absolute + ## sizes. The bigger problem is that when + ## [xy]bnds="data", the sizes (for the same count) may + ## not be the same across panels. IMO, that's a more + ## useful feature than getting the absolute sizes + ## right. + + radius <- sqrt(minarea + (maxarea - minarea) * colorcut) + n <- length(radius) + if(is.null(pen)) pen <- 1 + if(is.null(border)) border <- pen + + hexxy <- hexcoords(dx = 1, n = 1)[c("x", "y")] + maxxy <- max(abs(unlist(hexxy))) + hexxy <- lapply(hexxy, function(x) 0.5 * x/ maxxy) + + pol <- + polygonGrob(x = 0.5 + rep(radius, each = 6) * rep(hexxy$x, n), + y = (rep(0.5 + 1:n, each = 6) + + rep(radius, each = 6) * hexxy$y - 1) / n, + id.lengths = rep(6, n), + gp = gpar(fill = pen, col = border), + default.units = "npc") + txt <- + textGrob(as.character(bnds), + x = 0.5, + y = (1:n - 0.5) / n, + gp = gpar(cex = cex.labels), + default.units = "npc") + ttl <- textGrob("Counts", gp = gpar(cex = cex.title)) + + key.layout <- + grid.layout(nrow = 2, ncol = 2, + heights = + unit(c(1.5, 1), + c("grobheight", "grobheight"), + data = list(ttl, txt)), + widths = + unit(c(1/n, 1), + c("grobheight", "grobwidth"), + data = list(pol, txt)), + respect = TRUE) + key.gf <- frameGrob(layout = key.layout, vp = vp) + + key.gf <- placeGrob(key.gf, ttl, row = 1, col = 1:2) + key.gf <- placeGrob(key.gf, pol, row = 2, col = 1) + key.gf <- placeGrob(key.gf, txt, row = 2, col = 2) + key.gf + }, + "nested.lattice" = , + "nested.centroids" = { + dx <- inner/2 + dy <- dx/sqrt(3) + hexC <- hexcoords(dx, dy, n = 1, sep = NULL) + + ## _____________x scaling_____________________________ + numb <- cut(floor(legend/inner), breaks = c(-1, 0, 2,4)) + ## Note: In old code + ## top breaks=c(-1,0,2,4,8), numb<- 5 and size=1:9 + if (is.na(numb)) numb <- 4 + switch(numb, + { + warning("not enough space for legend") + return(textGrob("")) + }, + size <- 5, + size <- c(1, 5, 9), + size <- c(1, 3, 5, 7, 9)) + xmax <- length(size) + radius <- sqrt(minarea + (maxarea - minarea) * (size - 1)/9) + txt <- as.character(size) + ##___________________y scaling_____________________ + lab <- c("Ones", "Tens", "Hundreds", + "Thousands", "10 Thousands", "100 Thousands", + "Millions", "10 Millions", + "100 Millions", "Billions") + power <- floor(log10(maxcnt)) + 1 + yinc <- 16 * dy + ysize <- yinc * power + xmid <- 0 + x <- inner * (1:xmax - (1 + xmax)/2) + xmid + n <- length(x) + tx <- rep.int(hexC$x, n) + ty <- rep.int(hexC$y, n) + six <- rep.int(6:6, n) + ## y <- rep.int(3 * dy - yinc, xmax) + y <- rep.int(3 * dy - 0.75 * yinc, xmax) + + if (is.null(pen)) { + pen <- 1:power +1 + pen <- cbind(pen, pen +10) + } + if (is.null(border)) border <- TRUE + + key.layout <- + grid.layout(nrow = 1, ncol = 1, + heights = unit(ysize, "inches"), + widths = unit(legend, "inches"), + respect = TRUE) + key.gf <- frameGrob(layout = key.layout, vp = vp) + + ## for debugging + ## key.gf <- + ## placeGrob(key.gf, rectGrob(gp = gpar(fill = "transparent"))) + + n6 <- rep.int(6, n) + for(i in 1:power) { + y <- y + yinc + key.gf <- + placeGrob(key.gf, + polygonGrob(x = unit(legend / 2 + rep.int(hexC$x, n) + rep.int(x, n6), "inches"), + y = unit(rep.int(hexC$y, n) + rep.int(y, n6), "inches"), + id.lengths = n6, + gp = + gpar(col = pen[i, 1], + fill = if (border) 1 else pen[i, 1])), + row = 1, col = 1) + + key.gf <- + placeGrob(key.gf, + polygonGrob(x = legend / 2 + tx * rep.int(radius, six) + rep.int(x, six), + y = ty * rep.int(radius, six) + rep.int(y, six), + default.units = "inches", id=NULL, + id.lengths=rep(6,n), + gp = gpar(fill = pen[i,2], col = border)), + row = 1, col = 1) + + key.gf <- + placeGrob(key.gf, + textGrob(txt, + x = legend / 2 + x, + y = y - 4.5 * dy, + default.units = "inches", + gp = gpar(cex = cex.labels)), + row = 1, col = 1) + key.gf <- + placeGrob(key.gf, + textGrob(lab[i], + x = legend / 2 + xmid, + y = y[1] + 4.5 * dy, + default.units = "inches", + gp = gpar(cex = 1.3 * cex.title)), + row = 1, col = 1) + } + key.gf + }) + if (draw) + { + grid.draw(ans) + invisible(ans) + } + else ans +} diff --git a/R/hexpanel.R b/R/hexpanel.R new file mode 100644 index 0000000..e70f756 --- /dev/null +++ b/R/hexpanel.R @@ -0,0 +1,34 @@ +panel.hexloess <- +function(bin, w=NULL, span = 2/3, degree = 1, family = c("symmetric", + "gaussian"), evaluation = 50, lwd = add.line$lwd, lty = add.line$lty, + col, col.line = add.line$col, ...) +{ + x <- bin@xcm + y <- bin@ycm + if(is.null(w))w <- bin@count + control <- loess.control(...) + notna <- !(is.na(x) | is.na(y)) + new.x <- seq(min(x[notna]), max(x[notna]), length = evaluation) + family <- match.arg(family) + iterations <- if (family == "gaussian") 1 else control$iterations + fit <- stats:::simpleLoess(y, x, w, span, degree, FALSE, FALSE, + normalize = FALSE, "none", "interpolate", + control$cell, iterations, control$trace.hat) + kd <- fit$kd + z <- .C("loess_ifit", as.integer(kd$parameter), as.integer(kd$a), + as.double(kd$xi), as.double(kd$vert), as.double(kd$vval), + as.integer(evaluation), as.double(x), fit = double(evaluation), + PACKAGE = "stats")$fit + if (length(x) > 0) { + if (!missing(col) && missing(col.line)) { + col.line <- col + } + add.line <- trellis.par.get("add.line") + panel.lines(new.x, z, col = col.line, lty = lty, lwd = lwd) + } +} + +panel.hexgrid <- function(h, border=grey(.85)) +{ + hexGraphPaper(h,border=border) +} diff --git a/R/hexplom.R b/R/hexplom.R new file mode 100644 index 0000000..d242107 --- /dev/null +++ b/R/hexplom.R @@ -0,0 +1,348 @@ +panel.hexplom <- + function(...) + panel.hexbinplot(...) + + +hexplom <- function(x, data, ...) +{ + UseMethod("hexplom") +} + + + + + +hexplom.data.frame <- + function (x, data = NULL, ..., groups = NULL, subset = TRUE) +{ + ocall <- sys.call(sys.parent()) + ocall[[1]] <- quote(hexplom) + ccall <- match.call() + if (!is.null(ccall$data)) + warning("explicit 'data' specification ignored") + ccall$data <- list(x = x, groups = groups, subset = subset) + ccall$x <- ~x + ccall$groups <- groups + ccall$subset <- subset + ccall[[1]] <- quote(hexbin::hexplom) + ans <- eval.parent(ccall) + ans$call <- ocall + ans +} + +hexplom.matrix <- + function (x, data = NULL, ..., groups = NULL, subset = TRUE) +{ + ocall <- sys.call(sys.parent()) + ocall[[1]] <- quote(hexplom) + ccall <- match.call() + if (!is.null(ccall$data)) + warning("explicit 'data' specification ignored") + ccall$data <- list(x = x, groups = groups, subset = subset) + ccall$x <- ~x + ccall$groups <- groups + ccall$subset <- subset + ccall[[1]] <- quote(hexbin::hexplom) + ans <- eval.parent(ccall) + ans$call <- ocall + ans +} + + +hexplom.formula <- + function(x, data = NULL, ...) +{ + ocall <- sys.call(sys.parent()) + ocall[[1]] <- quote(hexplom) + ccall <- match.call() + ccall[[1]] <- quote(lattice::splom) + if (is.null(ccall$panel)) ccall$panel <- panel.hexplom + ans <- eval.parent(ccall) + ans$call <- ocall + ans +} + + + + +old.hexplom.formula <- + function(x, + data = parent.frame(), + auto.key = FALSE, + aspect = 1, + between = list(x = 0.5, y = 0.5), + #panel = if (is.null(groups)) "panel.hexplom" + #else "panel.superpose", + panel = panel.hexplom, + prepanel = NULL, + scales = list(), + strip = TRUE, + groups = NULL, + xlab = "Scatter Plot Matrix", + xlim, + ylab = NULL, + ylim, + superpanel = "panel.pairs", + pscales = 5, + varnames, + drop.unused.levels = lattice.getOption("drop.unused.levels"), + ..., + default.scales = list(draw = FALSE, relation = "same", axs = "i"), + subset = TRUE) +{ + ## dots <- eval(substitute(list(...)), data, parent.frame()) + dots <- list(...) + + #groups <- eval(substitute(groups), data, parent.frame()) + if(!is.null(groups))stop("groups not implemented yet") + subset <- eval(substitute(subset), data, parent.frame()) + + ## Step 1: Evaluate x, y, etc. and do some preprocessing + + ## right.name <- deparse(substitute(formula)) + ## formula <- eval(substitute(formula), data, parent.frame()) + form <- + ## if (inherits(formula, "formula")) + latticeParseFormula(x, data, + subset = subset, groups = groups, + multiple = FALSE, + outer = FALSE, subscripts = TRUE, + drop = drop.unused.levels) +## else { +## if (is.matrix(formula)) { +## list(left = NULL, +## right = as.data.frame(formula)[subset,], +## condition = NULL, +## left.name = "", +## right.name = right.name, +## groups = groups, +## subscr = seq(length = nrow(formula))[subset]) +## } +## else if (is.data.frame(formula)) { +## list(left = NULL, +## right = formula[subset,], +## condition = NULL, +## left.name = "", +## right.name = right.name, +## groups = groups, +## subscr = seq(length = nrow(formula))[subset]) +## } +## else stop("invalid formula") +## } + + + ## We need to be careful with subscripts here. It HAS to be there, + ## and it's to be used to index x, y, z (and not only groups, + ## unlike in xyplot etc). This means we have to subset groups as + ## well, which is about the only use for the subscripts calculated + ## in latticeParseFormula, after which subscripts is regenerated + ## as a straight sequence indexing the variables + + if (!is.null(form$groups)) groups <- form$groups[form$subscr] + subscr <- seq(length = nrow(form$right)) + + if (!is.function(panel)) panel <- eval(panel) + if (!is.function(strip)) strip <- eval(strip) + + prepanel <- + if (is.function(prepanel)) prepanel + else if (is.character(prepanel)) get(prepanel) + else eval(prepanel) + + cond <- form$condition + number.of.cond <- length(cond) + x <- as.data.frame(form$right) + + if (number.of.cond == 0) { + strip <- FALSE + cond <- list(as.factor(rep(1, nrow(x)))) + number.of.cond <- 1 + } + + if (!missing(varnames)) colnames(x) <- + eval(substitute(varnames), data, parent.frame()) + + ## create a skeleton trellis object with the + ## less complicated components: + + foo <- do.call(lattice:::trellis.skeleton, + c(list(cond = cond, + aspect = aspect, + between = between, + panel = superpanel, + strip = strip, + xlab = xlab, + ylab = ylab, + xlab.default = "Scatter Plot Matrix"), dots)) + + dots <- foo$dots # arguments not processed by trellis.skeleton + foo <- foo$foo + foo$call <- match.call() + + ## Step 2: Compute scales.common (leaving out limits for now) + + ## FIXME: It is not very clear exactly what effect scales is + ## supposed to have. Not much in Trellis (probably), but there are + ## certain components which are definitely relevant, and certain + ## others (like log) which can be used in innovative + ## ways. However, I'm postponing all that to later, if at all + + if (!is.list(scales)) scales <- list() + + ## some defaults for scales + +# if (is.null(scales$draw)) scales$draw <- FALSE +# if (is.null(scales$relation)) scales$relation <- "same" +# if (is.null(scales$axs)) scales$axs <- "i" + + scales <- updateList(default.scales, scales) + foo <- c(foo, + do.call(lattice:::construct.scales, scales)) + + + ## Step 3: Decide if limits were specified in call: + + have.xlim <- !missing(xlim) + if (!is.null(foo$x.scales$limit)) { + have.xlim <- TRUE + xlim <- foo$x.scales$limit + } + have.ylim <- !missing(ylim) + if (!is.null(foo$y.scales$limit)) { + have.ylim <- TRUE + ylim <- foo$y.scales$limit + } + + ## Step 4: Decide if log scales are being used (has to be NO): + + have.xlog <- !is.logical(foo$x.scales$log) || foo$x.scales$log + have.ylog <- !is.logical(foo$y.scales$log) || foo$y.scales$log + + ## immaterial, since scales has no effect. + +# if (have.xlog) { +# xlog <- foo$x.scales$log +# xbase <- +# if (is.logical(xlog)) 10 +# else if (is.numeric(xlog)) xlog +# else if (xlog == "e") exp(1) +# +# x <- log(x, xbase) +# if (have.xlim) xlim <- log(xlim, xbase) +# } +# if (have.ylog) { +# ylog <- foo$y.scales$log +# ybase <- +# if (is.logical(ylog)) 10 +# else if (is.numeric(ylog)) ylog +# else if (ylog == "e") exp(1) +# +# y <- log(y, ybase) +# if (have.ylim) ylim <- log(ylim, ybase) +# } + + ## Step 5: Process cond + + cond.max.level <- unlist(lapply(cond, nlevels)) + + ## id.na used only to see if any plotting is needed. Not used + ## subsequently, unlike other functions + + id.na <- FALSE + for (j in 1:ncol(x)) + id.na <- id.na | is.na(x[,j]) + for (var in cond) + id.na <- id.na | is.na(var) + if (!any(!id.na)) stop("nothing to draw") + ## Nothing simpler ? + + + ## Step 6: Evaluate layout, panel.args.common and panel.args + + + foo$panel.args.common <- + c(list(z = x, + panel = panel, + panel.subscripts = TRUE, + groups = groups, # xscales = foo$x.scales, yscales =foo$y.scales, + .aspect.ratio=aspect, + pscales = pscales), + dots) + + nplots <- prod(cond.max.level) + if (nplots != prod(sapply(foo$condlevels, length))) stop("mismatch") + foo$panel.args <- vector(mode = "list", length = nplots) + + + cond.current.level <- rep(1, number.of.cond) + + + for (panel.number in seq(length = nplots)) + { + + ##id <- !id.na WHY ? + for(i in 1:number.of.cond) + { + var <- cond[[i]] + id <- if (is.shingle(var)) + ((var >= + levels(var)[[cond.current.level[i]]][1]) + & (var <= + levels(var)[[cond.current.level[i]]][2])) + else (as.numeric(var) == cond.current.level[i]) + } + + foo$panel.args[[panel.number]] <- + list(subscripts = subscr[id]) + + cond.current.level <- + lattice:::cupdate(cond.current.level, + cond.max.level) + } + + + more.comp <- c(lattice:::limits.and.aspect( + lattice:::prepanel.default.splom, + prepanel = prepanel, + have.xlim = have.xlim, xlim = xlim, + have.ylim = have.ylim, ylim = ylim, + x.relation = foo$x.scales$relation, + y.relation = foo$y.scales$relation, + panel.args.common = foo$panel.args.common, + panel.args = foo$panel.args, + aspect = aspect, + nplots = nplots, + x.axs = foo$x.scales$axs, + y.axs = foo$y.scales$axs), + lattice::: cond.orders(foo)) + foo[names(more.comp)] <- more.comp + + + + if (is.null(foo$legend) && !is.null(groups) && + (is.list(auto.key) || (is.logical(auto.key) && auto.key))) + { + foo$legend <- + list(list(fun = "drawSimpleKey", + args = + updateList(list(text = levels(as.factor(groups)), + points = TRUE, + rectangles = FALSE, + lines = FALSE), + if (is.list(auto.key)) auto.key else list()))) + foo$legend[[1]]$x <- foo$legend[[1]]$args$x + foo$legend[[1]]$y <- foo$legend[[1]]$args$y + foo$legend[[1]]$corner <- foo$legend[[1]]$args$corner + + names(foo$legend) <- + if (any(c("x", "y", "corner") %in% names(foo$legend[[1]]$args))) + "inside" + else + "top" + if (!is.null(foo$legend[[1]]$args$space)) + names(foo$legend) <- foo$legend[[1]]$args$space + } + + class(foo) <- "trellis" + foo +} diff --git a/R/hexutil.R b/R/hexutil.R new file mode 100644 index 0000000..a605481 --- /dev/null +++ b/R/hexutil.R @@ -0,0 +1,122 @@ +hcell2xyInt <- function(hbin, xbins=NULL, xbnds=NULL, ybnds=NULL, shape=NULL) +{ + if(missing(hbin) && (is.null(xbnds) || is.null(ybnds))) + stop("Need a hexbin object or boundaries to make lattice") + if(missing(hbin) && (is.null(xbins) || is.null(shape))) + stop("Need xbins and shape to make a lattice") + if(!missing(hbin)) { + xbins <- hbin@xbins + shape <- hbin@shape + xbnds <- if(is.null(xbnds)) hbin@xbnds else xbnds + ybnds <- if(is.null(ybnds)) hbin@ybnds else ybnds + dimen <- hbin@dimen + + } + if(missing(hbin)) { + jmax <- floor(xbins + 1.5001) + imax <- 2 * floor((xbins *shape)/sqrt(3) + 1.5001) + dimen <- c(imax, jmax) + } + cell <- 1:(dimen[1]*dimen[2])-1 + i <- cell %/% dimen[2] + j <- cell %% dimen[2] + list(i=i+1, j=j+1) +} + +hgridcent <- function(xbins, xbnds, ybnds, shape, edge.add=0) +{ + ## auxiliary for hexGraphPaper(): + jmax <- floor(xbins + 1.5001) + c1 <- 2 * floor((xbins *shape)/sqrt(3) + 1.5001) + imax <- (jmax*c1 -1)/jmax + 1 + dimen <- c(imax, jmax) + c3 <- diff(xbnds)/xbins + c4 <- (diff(ybnds) * sqrt(3))/(2 * shape * xbins) + if(edge.add > 0) { + xbnds <- xbnds + 1.5*c(-edge.add*c3, edge.add*c3) + ybnds <- ybnds + c(-edge.add*c4, edge.add*c4) + dimen <- dimen + rep.int(2*edge.add, 2) + } + jmax <- dimen[2] + cell <- 1:(dimen[1]*dimen[2]) + i <- cell %/% jmax + j <- cell %% jmax + y <- c4 * i + ybnds[1] + x <- c3 * ifelse(i %% 2 == 0, j, j + 0.5) + xbnds[1] + list(x = x, y = y, dimen = dimen, dx=c3, dy=c4) +} + +hexGraphPaper <- + function(hb, xbnds=NULL, ybnds=NULL, xbins=30, shape=1, + add=TRUE, fill.edges=1, fill=0, border=1) +{ + if(missing(hb) && (is.null(xbnds) || is.null(ybnds))) + stop("Need a hexbin object or boundaries to make lattice") + if(!missing(hb)) { + xbins <- hb@xbins + shape <- hb@shape + xbnds <- if(is.null(xbnds)) hb@xbnds else xbnds + ybnds <- if(is.null(ybnds)) hb@ybnds else ybnds + dimen <- hb@dimen + } + xy <- hgridcent(xbins, xbnds, ybnds, shape, edge.add=fill.edges) + if(add){ + sx <- xbins/diff(xbnds) + sy <- (xbins * shape)/diff(ybnds) + inner <- 0.5 + outer <- (2 * inner)/sqrt(3) + dx <- inner/sx + dy <- outer/(2 * sy) + if(add){ + hexC <- hexcoords(dx, dy, sep=NULL) + hexpolygon (xy$x, xy$y, hexC, dx, dy, + fill = fill, border = border, hUnit = "native") + } + } + invisible(xy) +} + +hexTapply <- function(hbin,dat,FUN=sum,...,simplify=TRUE) +{ + if(is.null(hbin@cID)) + stop("Must have cell ID's to do this operation \n + please re-bin data using IDs = TRUE") + if((length(dat)> 0) && (length(dat) != length(hbin@cID))) + stop("Length of IDs does not match the length of the data") + tapply(dat,hbin@cID,FUN,...,simplify=simplify) +} + +optShape <- function(vp, height=NULL, width=NULL, mar=NULL) +{ + if(missing(vp) && (is.null(height) || is.null(width))) + stop("Need a viewport object or height and width of the plotting region.") + if(!missing(vp)) { + if("hexVP" %in% class(vp)) { + height <- vp@plt[2] + width <- vp@plt[1] + } + else if("viewport"%in%class(vp)) { + #height <- convertHeight(unit(1,"npc"),"inches") + #width <- convertWidth (unit(1,"npc"),"inches") + height <- convertUnit(vp$height,"inches") + width <- convertUnit(vp$width,"inches") + } + else + stop("need valid viewport or hexViewport") + } + if(!is.null(mar)){ + height <- height - mar[1] - mar[3] + width <- width - mar[2] - mar[4] + } + + shape <- as.numeric(height)/as.numeric(width) + shape +} + +inout.hex <- function(hbin,mincnt) +{ + if(is.null(hbin@cID)) + stop("bin object must have a cID slot, \n try re-binning with ID = TRUE") + tI <- table(hbin@cID) + which(hbin@cID%in%(names(tI)[tI .Fortran("hbin", *) + +hboxplot + |--> hcell2xy() + |--> hexpolygon() + \-----\-> hexcoords() + +hcell + \--> .Fortran("hcell", *) + +hcell2xy + +hdiffplot + \--> hcell2xy(), plot(), hexpolygon(), hexcoords() + +erode.hexbin + \--> .Fortran("herode", *) + +hexagons + \--> hcell2xy(), plot(), hexpolygon(), hexcoords(), polygon() + +hex.legend + \--> hexcoords(), hexpolygon() + +hmatplot + |--> hcell2xy() + |--> hboxplot + \--> hdiffplot {2 x} + +plot.hexbin --> [ LinGraY() ] + |--> hex.legend() + |--> hexagons() + + +smooth.hexbin + \--> .Fortran("hsm" , * ) + +hray + \--> { polygon, lines } diff --git a/TODO b/TODO new file mode 100644 index 0000000..aba86e8 --- /dev/null +++ b/TODO @@ -0,0 +1,31 @@ +o The new 3D plots -- should rather make the new functions "internal" + and choosable with *arguments* from given functions ! + +o hexbin *class* {as mentioned by man/hexbin.Rd } -- done + +o find the references (on paper) and read ! + --> "References" in ./Biocore-notes + + ftp://www.galaxy.gmu.edu/pub/faculty/dcarr/eda/bin2d/ + ftp://www.galaxy.gmu.edu/pub/faculty/dcarr/software/bin2d.rev/ + + +o example(hmatplot) is still doing many pages instead of one + + +------------ +March 5, 2005 +o Implement conversions between different hexagon coordinate systems + +o Smoothing on a hexagonal basis using tensor products + + smoothing histograms + + smoothing the intensity of a Poisson process + +o Family of hex apply functions + +o Hbin list class and constructors + +--- + +o Use standard convertColor() function more and + and try to get rid of dependency on 'colorspace' diff --git a/data/NHANES.rda b/data/NHANES.rda new file mode 100644 index 0000000000000000000000000000000000000000..6540520423cf9899552903a4c16604991191b337 GIT binary patch literal 162590 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 z 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 RW@THDQvo3lFW9F%^`C=4xx4@X literal 0 HcmV?d00001 diff --git a/inst/doc/hexagon_binning.Rnw b/inst/doc/hexagon_binning.Rnw new file mode 100644 index 0000000..0005171 --- /dev/null +++ b/inst/doc/hexagon_binning.Rnw @@ -0,0 +1,498 @@ +%% Emacs: use Rnw-mode if available, else noweb +%% NOTE -- ONLY EDIT THE .Rnw FILE ! + +%\VignetteIndexEntry{Hexagon Binning} +%\VignetteDepends{hexbin, grid, cluster, marray} +%\VignetteKeywords{Over plotting, Large data set, Visualization} +%\VignettePackage{hexbin} + +\documentclass[]{article} + +\usepackage[authoryear,round]{natbib} +\usepackage{amsmath} +\usepackage{hyperref} + + +\author{Nicholas Lewin-Koh\footnote{with minor assistance by Martin M\"achler}} + +\begin{document} + +\title{Hexagon Binning: an Overview} +\maketitle{} + +\section{Overview} +Hexagon binning is a form of bivariate histogram useful for visualizing +the structure in datasets with large $n$. The underlying concept of +hexagon binning is extremely simple; +\begin{enumerate} +\item the $xy$ plane over the set (range($x$), range($y$)) is tessellated +by a regular grid of hexagons. + +\item the number of points falling in each hexagon are counted and +stored in a data structure + +\item the hexagons with count $ > 0$ are plotted using a color ramp or +varying the radius of the hexagon in proportion to the counts. +\end{enumerate} + +The underlying algorithm is extremely fast and effective for displaying the +structure of datasets with $n \ge 10^6$. +If the size of the grid and the cuts in the color ramp are chosen in a +clever fashion than the structure inherent in the data should emerge +in the binned plots. The same caveats apply to hexagon binning as +apply to histograms and care should be exercised in choosing the +binning parameters. + +The hexbin package is a set of function for creating, manipulating and plotting +hexagon bins. The package extends the basic hexagon binning ideas with +several functions for doing bivariate smoothing, finding an +approximate bivariate median, and looking at the difference between +two sets of bins on the same scale. The basic functions can be +incorporated into many types of plots. This package is based on the +original package for splus by Dan Carr at George Mason University and +is mostly the fruit of his graphical genius and intuition. + +\section{Theory and Algorithm} +Why hexagons? There are many reasons for using hexagons, at least over +squares. Hexagons have symmetry of nearest neighbors which is lacking +in square bins. Hexagons are the maximum number of sides a polygon can +have for a regular tesselation of the plane, so in terms of packing a +hexagon is 13\% more efficient for covering the plane than +squares. This property translates into better sampling efficiency at +least for elliptical shapes. Lastly hexagons are visually less biased +for displaying densities than other regular tesselations. For instance +with squares our eyes are drawn to the horizontal and vertical lines +of the grid. The following figure adapted from \cite[]{carretal}shows +this effectively. + +\begin{figure}[H] + \centering +<>= +library("hexbin")#,lib.loc="/home/nikko/R-devel/hex.devel/tst") +x <- rnorm(1000) +y <- rnorm(1000) +##-- Hexagon Bins: -- +hbin <- hexbin(x,y, xbins = 25) +grid.newpage() +pushViewport(viewport(layout=grid.layout(1, 2))) +pushViewport(viewport(layout.pos.col=1,layout.pos.row=1)) +plot(hbin, style="lattice", legend=0, xlab = "X", ylab = "Y", newpage=FALSE) +popViewport() + +##-- Manual "square" binning: -- +## grid +rx <- range(x); bx <- seq(rx[1],rx[2], length=29) +ry <- range(y); by <- seq(ry[1],ry[2], length=29) +## midpoints +mx <- (bx[-1]+bx[-29])/2 +my <- (by[-1]+by[-29])/2 +gg <- as.matrix(expand.grid(mx,my))# dim = (28^2, 2) +zz <- unname(table(cut(x, b = bx), cut(y, b = by)))# 28 x 28 +ind <- zz > 0 +if(FALSE) ## ASCII image: + symnum(unname(ind)) +sq.size <- zz[ind]^(1/3) / max(zz) +## if we used base graphics: +## symbols(gg[ind,], squares = sq.size, inches = FALSE, fg = 2, bg = 2) +pushViewport(viewport(layout.pos.col=2, layout.pos.row=1)) +vp <- plot(hbin, style="lattice", legend=0, + xlab = "X", ylab = "Y", newpage=FALSE, type="n") +pushHexport(vp$plot, clip="on") +grid.rect(x= gg[ind,1], y=gg[ind,2], width = sq.size, height= sq.size, + default.units = "native", gp = gpar(col="black",fill="black")) +popViewport() +@ + \caption[bivariate: squares and hexagons]{A bivariate point set binned + into squares and hexagons. Bins are + scaled approximately equal, and the size of the glyph is proportional + to the count in that bin.} + \label{fig:compHexSq} +\end{figure} + + +We can see in Figure~\ref{fig:compHexSq} that when the data are plotted +as squares centered on a regular lattice our eye is drawn to the regular lines +which are parrallel to the underlying grid. Hexagons tend to break up +the lines. + +How does does the hexagon binning algorithm work? + +\begin{enumerate} +\item Squash $Y$ by $\sqrt{3}$ +\item Create a dual lattice +\item Bin each point into pair of near neighbor rectangles +\item Pick closest of the rectangle centers (adjusting for $\sqrt{3}$) +\end{enumerate} + + +<< nearNeighbor, echo = false, results = hide >>= +x <- -2:2 +sq <- expand.grid(list(x = x, y = c(-1,0,1))) +fc.sq <- rbind(sq,sq+.5) # face centered squares +fc.sq$y <- sqrt(3)*fc.sq$y # stretch y by the sqrt(3) +nr <- length(fc.sq$x)/2 +@ + +\begin{figure}[H] + \centering +<< fig = TRUE,width = 4,height = 8,echo = FALSE >>= +par(mfrow = c(3,1)) +par(mai = c(.1667,0.2680,0.1667,0.2680)) ##par(mai=.25*par("mai")) +plot(fc.sq$x, fc.sq$y, pch = 16, cex = .5) +nr <- length(fc.sq$x)/2 +points(fc.sq$x[1:nr], fc.sq$y[1:nr], pch = 15, cex = .7, col = 5) +points(-.25,.15, col = 2, pch = 16, cex = .5) + +par(mai = c(.1667, 0.2680, 0.1667, 0.2680))##par(mai=.25*par("mai")) +plot(fc.sq$x, fc.sq$y, pch = 16, cex = .5) +nr <- length(fc.sq$x)/2 +points(fc.sq$x[1:nr], fc.sq$y[1:nr], pch = 15, cex = .7, col = 5) +px <- c(-1,-2,-2,-1)+1 +py <- sqrt(3)*(c(0,0,-1,-1)+1) +polygon(px, py, density = 0, col = 5) +polygon(px+.5, py-sqrt(3)/2, density = 0) +points(-.25, .15, col = 2, pch = 16, cex = .5) + +par(mai = c(.1667, 0.2680, 0.1667, 0.2680))##par(mai=.25*par("mai")) +plot(fc.sq$x, fc.sq$y, pch = 16, cex = .5) +nr <- length(fc.sq$x)/2 +points(fc.sq$x[1:nr], fc.sq$y[1:nr], pch = 15, cex = .7, col = 5) +px <- c(-1,-2,-2,-1) + 1 +py <- sqrt(3)*(c(0,0,-1,-1) + 1) +polygon(px, py, density = 0, col = 5) +polygon(px+.5, py-sqrt(3)/2, density = 0) +px <- c(-.5,-.5,0,.5, .5, 0) +py <- c(-.5, .5,1,.5,-.5,-1) /sqrt(3) +polygon(px, py, col = gray(.5), density = 0) +polygon(px-.5, py+sqrt(3)/2, density = 0, col = 4) +points(-.25, .15, col = 2, pch = 16, cex = .5) +plot.new() +arrows(-.25, .15, 0, 0, angle = 10, length = .05) +@ +\caption[Near Neighbor Rectangles]{} +\label{fig:binalg} +\end{figure} + +Figure~\ref{fig:binalg} shows graphically how the algorithm works. In +the first panel we see the the dual lattice laid out in black and blue +points. The red point is an arbitrary point to be binned. The second +panel shows the near neigbor rectangles for each lattcie around the +point to be binned, the intersection of the rectangles contains the +point. The last panel shows the simple test for locating the point in +the hexagon, the closest of the two corners which are not +intersections is the center of the hexagon to which the point should +be allocated. The binning can be calculated in one pass through the +data, and is clearly $O(n)$ with a small constant. Storage is vastly +reduced compared to the original data. + +\section{Basic Hexagon Binning Functions} +Using the basic hexagon binning functions are not much more involved +than using the basic plotting functions. The following little example +shows the basic features of the basic plot and binning functions. +We start by loading the package and generating a toy example data set. + +<< basic, fig = TRUE, results = hide >>= +x <- rnorm(20000) +y <- rnorm(20000) +hbin <- hexbin(x,y, xbins = 40) +plot(hbin) +@ +There are two things to note here. The first is that the function +\texttt{gplot.hexbin} is defined as a \texttt{plot} method for the S4 class +\texttt{hexbin}. The second is that the default color scheme for the +hexplot is a gray scale. However, there is an argument to plot, +\texttt{colramp}, that allows the use of any function that excepts an +argument \texttt{n} and returns $n$ colors. Several functions are supplied +that provide alternative color-ramps to R's built in color ramp functions, +see \texttt{help(ColorRamps)}. + +<< showcol, fig = TRUE, width = 7, height = 4, echo = FALSE >>= +#nf <- layout(matrix(c(1,1,2,2,4,3,3,4), ncol=4, nrow=2, byrow=TRUE), +# widths = rep(1,4), heights=rep(1,2)) +grid.newpage() +mar <- unit(0.1 + c(5,4,4,2),"lines") +mai <- as.numeric(convertUnit(mar, "inches")) +vpin <- c(convertWidth (unit(1,"npc"),"inches"), + convertHeight(unit(1,"npc"),"inches")) +shape <- optShape(height = vpin[2],width = vpin[1]/3,mar = mai) + +x <- rnorm(20000) +y <- rnorm(20000) +hbin <- hexbin(x,y, xbins = 40, shape = shape) +grid.newpage() +pushViewport(viewport(layout = grid.layout(1, 3))) +pushViewport(viewport(layout.pos.col = 1,layout.pos.row = 1)) +plot(hbin, legend = 0, xlab = "X", ylab = "Y", newpage = FALSE) +popViewport() +pushViewport(viewport(layout.pos.col = 2,layout.pos.row = 1)) +plot(hbin, legend = 0, xlab = "X", ylab = "Y", + newpage = FALSE, colramp = terrain.colors) +popViewport() +pushViewport(viewport(layout.pos.col = 3,layout.pos.row = 1)) +plot(hbin, legend = 0, xlab = "X", ylab = "Y", + newpage = FALSE, colramp = BTY) +popViewport() +@ + +The figure shows three examples of using hexagons in a plot for large $n$ with +different color schemes. Upper left: the default gray scale, upper right: the +R base \texttt{terrain.colors()}, and lower middle: \texttt{BTY()}, a +blue to yellow color ramp supplied with hexbin on a perceptually linear +scale. + +The hexbin package supplies a plotting method for the hexbin data +structure. The plotting method \texttt{gplot.hexbin} accepts all the +parameters for the hexagon function and supplies a legend as well, for +easy interpretation of the plot. Figure~2 shows a hex binned plot with +a legend. A function \texttt{grid.hexlegend} is supplied for creating user +specified hexagon legends. + +\section{Extended Hexagon Functions} +So far we have looked at the basic hexagon plot. The hexbin package +supplies several extensions to the basic hexbin, and the associated +hexplot. The extensions discussed in this section will be smoothing +hexbin objects using the hsmooth function, apporximating a bivariate +median with hexagons and a version of a bivariate boxplot, and using +eroded hexbin objects to look at the overlap of two bivariate populations. + +\subsection{Smoothing with \texttt{hsmooth}} +At this point the hexbin package only provides a single option for +smoothig using a discrete kernel. Several improvements are in +development including an apply function over neighborhoods and spline +functions using a hexagonal basis or tensor products. The apply +function should facilitate constructing more sophisticated kernel +smoothers. The hexagon splines will provide an alternative to +smoothing on a square grid and allow interpolation of hexagons to +finer grids. + +The current implementation uses the center cell, immediate +neighbors and second neighbors to smooth the counts. The counts for +each resulting cell is a linear combination of the counts in the +defined neighborhood, including the center cell and weights. The +counts are blurred over the the domain, and the domain increases +because of shifting. Generally the dimension of the occupied cells of +the lattice increases by one, sometimes two. + +Some examples of using the hsmooth function are given below. Notice in +the plots that the first plot is with no smoothing, weights are +\texttt{c(1,0,0)} meaning that only the center cell is used with +identity weights. The second plot shows a first order kernel using +weights \texttt{c(24,12,0)}, while the third plot uses weights for +first and second order neighbors specified as \texttt{c(48,24,12)}. +The code segment generating these plots rescales the smoothed counts +so that they are on the original scale. + +<< showsmth, fig = TRUE, width = 8, height = 4, echo = FALSE >>= +#nf <- layout(matrix(c(1,1,2,2,4,3,3,4), ncol=4, nrow=2, byrow=TRUE), +# widths = rep(1,4), heights=rep(1,2)) +x <- rnorm(10000) +y <- rnorm(10000) +grid.newpage() +mar <- unit(0.1 + c(5,4,4,2),"lines") +mai <- as.numeric(convertUnit(mar, "inches")) +vpin <- c(convertWidth (unit(1,"npc"), "inches"), + convertHeight(unit(1,"npc"), "inches")) +shape <- optShape(height = vpin[2],width = vpin[1]/3,mar = mai) +hbin <- hexbin(x,y, xbins = 30,shape = shape) +hsmbin1 <- hsmooth(hbin, c( 1, 0,0)) +hsmbin2 <- hsmooth(hbin, c(24,12,0)) +hsmbin2@count <- as.integer(ceiling(hsmbin2@count/sum(hsmbin2@wts))) +hsmbin3 <- hsmooth(hbin,c(48,24,12)) +hsmbin3@count <- as.integer(ceiling(hsmbin3@count/sum(hsmbin3@wts))) +pushViewport(viewport(layout = grid.layout(1, 3))) +pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1)) +plot(hsmbin1, legend = 0, xlab = "X", ylab = "Y", newpage= FALSE,colramp = BTY) +popViewport() +pushViewport(viewport(layout.pos.col = 2,layout.pos.row = 1)) +plot(hsmbin2, legend = 0, xlab = "X", ylab = "Y", newpage= FALSE,colramp = BTY) +popViewport() +pushViewport(viewport(layout.pos.col = 3,layout.pos.row = 1)) +plot(hsmbin3, legend = 0, xlab = "X", ylab = "Y", newpage= FALSE,colramp = BTY) +popViewport() +@ +\subsection{Bin Erosion and the \texttt{hboxplot}} +The next tool to introduce, gray level erosion, extends the idea of +the boxplot. The idea is to extract cells in a way that the most +exposed cells are removed first, ie cells with fewer neighbors, but +cells with lower counts are removed preferentially to cells with +higher counts. The algorithm works as follows: +Mark the high count cells containing a given fraction, cdfcut, of +the total counts. Mark all the cells if cdfcut is zero. +The algorithm then performs gray-level erosion on the +marked cells. Each erosion cycle removes counts from cells. The +counts removed from each cell are a multiple of the cell's exposed-face +count. The algorithm choses the multiple so at least one cell will be +empty or have a count deficit on each erosion cycle. The erode vector +contains an erosion number for each cell. The value of erode is + +\begin{center} + $6\times$(The erosion cycle at cell removal) $ - $ + (The cell deficit at removal) +\end{center} + +The cell with the highest erosion number is a candidate bivariate +median. A few ties in the erosion order are common. + +The notion of an ordering to the median is nice because it allows us +to create a version of a bivariate box plot built on hexagons. The +following example comes from a portion of the ''National Health and Nutrition +Examination Survey'' included in \texttt{hexbin} as the sample data +set NHANES. The data consist of 9575 persons and mesures various +clincal factors. Here in Figure~\ref{hbox} we show the levels of +transferin, a measure of iron binding against hemoglobin for all + +\begin{figure}[H] + \centering + +<< hbox, fig = TRUE, width = 6, height = 4, echo = FALSE >>= +data(NHANES) +#grid.newpage() +mar <- unit(0.1 + c(5,4,4,2),"lines") +mai <- as.numeric(convertUnit(mar, "inches")) +#vpin <- c(convertWidth (unit(1,"npc"), "inches"), +# convertHeight(unit(1,"npc"), "inches")) +vpin <- c(unit(6,"inches"),unit(4, "inches")) +shape <- optShape(height = vpin[2], width = vpin[1], mar = mai) +hb <- hexbin(NHANES$Transferin, NHANES$Hemoglobin, shape = shape) +hbhp <- hboxplot(erode(hb,cdfcut = .05),unzoom = 1.3) +pushHexport(hbhp,clip = 'on') +hexGraphPaper(hb,fill.edges = 3) +popViewport() +@ +\caption{Hexagon "boxplots" showing the top 95 percent of the data for + males and females. The red hexagons are an estimate of the bivariate median.} +\label{hbox} +\end{figure} + +Note that we have added ``hexagon graph paper'' to the plot. This can +be done for any hexbin plot, using the command +\texttt{hexGraphPaper()} where the main argument is the hexbin object. + +\subsection{Comparing Distributions and the \texttt{hdiffplot}} +With univariate data, if there are multiple groups, one often uses a +density estimate to overlay densities, and compare two or more +distirbutions. The hdiffplot is the bivariate analog. The idea behind +the hdiff plot is to plot one or more bin objects representing +multiple groups to compare the distributions. The following example +uses the National Health data supplied in the hexbin package, +(\texttt{NHANES}). Below we show a comparison of males and females, +the bivariate relationship is transferin, which is a derived measure +of the ability of blood to bind oxygen, vs the level of hemoglobin. +Note that in the call to \texttt{hdiffplot} we erode the bins to +calculate the bivariate medians, and only display the upper 75\% of +the data. +\begin{figure}[H] + \centering +<< hdiff, fig = TRUE, width = 6, height = 4, echo = TRUE >>= +#grid.newpage() +shape <- optShape(height = vpin[2],width = vpin[1],mar = mai) +xbnds <- range(NHANES$Transferin,na.rm = TRUE) +ybnds <- range(NHANES$Hemoglobin,na.rm = TRUE) +hbF <- hexbin(NHANES$Transferin[NHANES$Sex == "F"], + NHANES$Hemoglobin[NHANES$Sex == "F"], + xbnds = xbnds, ybnds = ybnds, shape = shape) +hbM <- hexbin(NHANES$Transferin[NHANES$Sex == "M"], + NHANES$Hemoglobin[NHANES$Sex == "M"], + xbnds = xbnds, ybnds = ybnds, shape = shape) +plot.new() +hdiffplot(erode(hbF,cdfcut = .25),erode(hbM,cdfcut = .25),unzoom = 1.3) +@ +\caption{A difference plot of transferin vs hemoglobin for males and females.} +\label{hdiffplot} +\end{figure} + + + +\subsection{Plotting a Third Concomitant Variable} +In many cases, such as with spatial data, one may want to plot the +levels of a third variable in each hexagon. The grid.hexagons function +has a pair of arguments, \texttt{use.count} and \texttt{cell.at}. If +\texttt{use.count = FALSE} and \texttt{cell.at} is a numeric vector of +the same length as \texttt{hexbin@count} then the attribute vector +will be used instead of the counts. \texttt{hexTapply} will +sumarrerize values for each hexagon according to the supplied function +and return the table in the right order to use as an attribute +vector. Another alternative is to set the \texttt{cAtt} slot of the +hexbin obeject and grid.hexagons will automatically plot the attribute +if \texttt{use.count = FALSE} and \texttt{cell.at = NULL}. + +Here is an example using spatial data. Often in cartographers use +graduated symbols to display varying numerical quantities across a region. + + + +\section{Example: cDNA Chip Normalization} +This example is taken from the marray package, which +supplies methods and classes for the normalization and diagnostic +plots of cDNA microarrays. In this example the goal is not to make any +comments about the normalization methodology, but rather to show how +the diagnostic plots can be enhanced using hexagon binning due to the +large number of points ($n = 8,448$ cDNA probes per chip). + +We look at the diagnostic plot $M$ vs $A$, where $M$ is the +log--ratio, $M = \log <- 2 \frac{R}{G}$ and $A$ is the overall intensity, +$A = \log <- 2\sqrt{RG}$. Figure~3 shows the plot using points and on the +right hexagons. The hexagon binned plot shows that most of the pairs +are well below zero, and that the overall shape is more like a comet +with most of the mass at the bottom of the curve, rather than a thick +bar of points curving below the line. + +<< marray1, fig = TRUE, results = hide >>= +### Need to redo this part. +library("marray") +data(swirl, package = "marray") ## use swirl dataset + +hb1 <- hexbin(maA(swirl[,1]), maM(swirl[,1]), xbins = 40) +grid.newpage() +pushViewport(viewport(layout = grid.layout(1, 2))) + +pushViewport(viewport(layout.pos.col = 1,layout.pos.row = 1)) +nb <- plot(hb1, type = 'n', xlab = 'A', ylab = 'M', + main = "M vs A plot with points", legend = 0, newpage = FALSE) +pushHexport(nb$plot.vp) +grid.points(maA(swirl[,1]), maM(swirl[,1]),pch = 16,gp = gpar(cex = .4)) +popViewport() +nb$hbin <- hb1 +hexVP.abline(nb$plot.vp,h = 0,col = gray(.6)) +hexMA.loess(nb) +popViewport() + +pushViewport(viewport(layout.pos.col = 2,layout.pos.row = 1)) +hb <- plotMAhex(swirl[,1], newpage = FALSE, + main = "M vs A plot with hexagons", legend = 0) +hexVP.abline(hb$plot.vp,h = 0,col = gray(.6)) +hexMA.loess(hb) +popViewport() +@ + + + +\section{Manipulating Hexbins} +The underlying functions for hexbin have been rewritten and now depend +on the grid graphics system. The support unit for all hexagon plots is +the hexViewport. The function \texttt{hexViewport()} takes a hexbin +object as input and creates a viewport scaled to the current device or +viewport so that the aspect ratio is scaled appropriately for the +hexagons. Unlike in the base graphic functions where the aspect ratio +is maintained by shifting the range of the axes, here the extra space +is shifted into the margins. Currently hexViewport returns a +hexViewport object that has information on the margins and +its own pushViewport method. In the next example we will 1st show how +to manipulate an existing plot using grid commands and second show how to +create a custom plotting function using \texttt{hexViewport} and grid. + +\subsection{Adding to an existing plot} +Adding to an existing plot requires the use of grid +functions. For instance, in the following code, +<< addto,fig = TRUE,echo = TRUE >>= +hplt <- plot(hb1,style = 'centroid',border = gray(.65)) +pushHexport(hplt$plot.vp) +ll.fit <- loess(hb1@ycm ~ hb1@xcm, weights = hb1@count, span = .4) +pseq <- seq(hb1@xbnds[1]+1, hb1@xbnds[2]-1, length = 100) +grid.lines(pseq, predict(ll.fit,pseq), + gp = gpar(col = 2), default.units = "native") +@ +we have to use \texttt{grid.lines()}, as opposed to \texttt{lines()}. + + +\end{document} diff --git a/inst/doc/hexagon_binning.pdf b/inst/doc/hexagon_binning.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9217eac4b3de74be0cc2cefce31140f216cb3547 GIT binary patch literal 1427198 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
  • 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

    Hn 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

    )!ORl1=*V)<4k%AqE`9HSGYM$J_DGn>X>1$Y- z$w3puay+)?!cR($c7VD7&Ydup)Ypyh+~p@W>CGo!%5*x>qaL&vAfrePQ0tDi6+RhZp}5XTld|W z_U=?r-%3B*HIg7w4&uyv`uZTa<1hE{Ct-0_n!%7sXB%9UE?rvoGcipjfp1#;5 z-3(`;6HO4yDQ)3O_H3I}-#xp#dgJ=L07e$iK~LSIr54BzAmUO)%-*FDtRyqiT#QXz z)<&cvx%b$z0~#U2srcr<_L`ZDFQJ>^xm{=)S#|)Oc--oSn$Pm?rHxj2_+Lvrm_t_?08)|{{2L(Tg|PIjBTO`k~(Z~ zu@QT0Y%Vzk%}h;X18#+AMgX+^Ir^tQG{7cjhXSzWXTUOM7W$p-Me4?h^dL-wY5+G? zwxDJk6Ih)hNnt0-7o(>s0$7GA!ot5KLu;kZsHC{9COr+1T1HQOG=R)1;hR0E2#4aP z2w)l36Bg2wo;NJddKhy$F9Bexj0Y>zMnY^_#WIbWx26bS8Pd}%Q@@dc=r~1_U3wZI zyp_j5fhlZ%lETOgEEEAO!xUk0Xsvl8JtT5T4}Mhh)&Q4AYuWW$izs|9XDLpB1vEtf z%P>V)Sf93T-`XHIM-jFmMFa6eiB0z}l;JUuu4vSmtI1?&MH9qwR=Ai>*`=&O->+6B zfZ26z)`$y|;&X>h<46Zd{Tg#kG(jw9g)4UnOIx-IUAgYOjLp+${bYvTPK>rZhu)S@ z7Ql=Qnjn^AZOw&cjF}{(Q*FZ72#=o0Mp%)`aCApQ=S*6(MuCUJ&MBAVVVmU<K3-}u(rI%TmWPQFO@y>3kt#Bz!TgB2I+Hpa%S4W`Fqi%mAd*fMYA zimGYR<~{@VMy{xnUe;~U1YvBk+vZ{>#}43ph((k(Hjrns5ih8pGWRdgMvYTQW@Mrn zbA+4~uADsCChKKAX(Rcxwnng$*t_m!)=aja(#cnLU}ze#9BXSX#-{ZzZ6sjjkikk@ z5N4@jzAtS?TYL#o)mA#u1YwS1TXb;zjI3nW)VlbhDpxxv>(&T9IP*r@JOMAgoF4 zCB2)Vqa9>BF0up2746Fh%|Mv9qqwFWpt}{S;1`=5$gs&x@=5O!X8{_U?`X&;Of=X; zJYZSr;F@gGH!?~aJKkf{Z3`ht%2Vnbq2_J$VmQvL-92c65MPhta!AWea%$k%#SEl2 zYXog&CHhjH-h|Lh)|#kagL(LgnkIK+ki05@9QmI@5VHP@7LsjHEh#1Kkb5HCdW5rZn{>S{^feXX_a9$q6nd_QBjrWl}G8=1H6^E5KN zlKw`c=ZzRpUTKq)1ss&d7VkC?tR!pOT&&yJZ*( zu9mHQ-@r8qG^H*udKfrnQ{1Tm3IK=2#KalpU2h+ zYZ9-(8G+-(vTl@zj^-0h5cbQX@QUcCJnqY9xu>o79Brt1`Ah z6U1^nlg))TS*gcH6{zln{A5K_y@_CiO_tro$$}AN$8M+$t!<(S5}Ux6HrMQxsr2lF zc(lx9BkZ@xuGX|h(jDsD+Q5=08r|cNwPhxoiyf$^_SpEf>tvp?^2yCcyb(Mn2vuf| zl_WFXl;X-TdzBiooS93^VhJ2tbcl&jJODsu8=X z6~J}mOkuz>W){@79q3kvvmu@-HB%#A7qd|gDqJy9WrkRdE1!iTfQ8H~n8u=sc`f^) zxRZVBMu!mu*Phos5F;#7O`g7+e>6>y(a9fNZZOyU>DGrUW*#Z^QX@Qd4MVp+Of$|T z^qxzQK@-GsG_=7rk4ToX+Y%PATbt2XLV3zB8o z!?5%@7jIFaN(UK zN4re-KwRh9*VrZ-fjyNEnV9o#S`g*)H^|@IADU=_44>uuByt0>($ZF4a0kBy8ZUB>9_jvlSX6i+*T4 z+w6%&8{@70mRq;|#t0+nbt9uANP29sQe|}Ing>k~>?R(lxtQW%lj<}i6m~Zx2o{i; zR7+oZ0Q)U=LqxTF;3vZIRnDMqMq2+u(@5-HlEX!I)v;T*K3p+Fl?tYju}^gmBv}Ea zw4a-9e{zfX6219i#Bz!zTxb)Q$3}18eS7CA9$O>KNk&57K6^PkS2sfvCk9QBjSa017Nqp<7n*M*X)YydXiWo^2B5mPf2aa{){)W>w*0N%^ zzO0x;E?!BuK7!C(@GPmfUw(Sf1hJf=2^ZRW2k0FZkHkjqnQVm384Cn)_iyA}>Y=z6 zn`nYqPH77lgC15wPu?}WGiqyV1m_TK>g{WHkaOSX*<&-`GmHzhSQo z7MomyLZtNA8eu?{PwHlf&n*~RMI8O* zH1EKPCdi1mgNvQi5l3%>@Obu}(bfp;sjBJr`y>Ir=vNP=eEFaW;$sNUWOHGflH-}A zvU5J=?7?Gegou-o(8F5pp3t{ z2q`_2x+{?^fDI&V1EEn^>(=)m)O4??AjIcZD>O#9NLS+@T+B%CZr_!t*p-=_kQAS~ z2jLyyL|3yU1lObZHqiu$-3~5?@UjvTBWf~r_~W=5plYreA-y6A*Bh5!%pt{<^4Y*L&!zl;fvYs4yD3#KJEffJPV`iCd(de!Oj?IcvGlMHTyud7)y^Hruqyri2%0i}rMUc*ZcmUTN`GhF zjaZI`Hn?JpS}Xmv2uosmGqy&Sk$`wXN3T&|%Amb4kG2uZv9{)7N41~O_bhNeno0iU zu{AD!A%iA}++KoN>Gv+k*6(kQq@MXe11% zBss9z7PCsad#k6moT3RAL9KVOzFt9@ps~dVPDuQl-)$*LUT@}KormHYGy{nb99)Fi zp-uN{Ysawcp2ujSWeM|3uo0H(jPz8bGx-_Z8X!J z&y2Uy_3>wCuN=H(Y-CuD)C)}^kz;MeB?J$fnItNqS~E%VUD|@+m9o3Zo*W@5o1={` zJLajm9W+5Kr?iEOnH;-YcO@#!bT_b(Wd+EL2(yx%Tv0ETQqyO(ExQr+a&|y-d5SYO z4sjgn@k+7DMi!4t!`+_CZK9HmO_bfVS5^DDXgOs6|fzl9zg375th& zYTOzUQH>UY^fW~P%dnoX_%c;l27!lSTmF!qwwzT16l!I21S?m9hz;QPgzWlO0n3n{ zW}!e3g)C5^OQuZ2q$;NdaH%yOf)W|3#*^bu;+8X@g(84uSWj3eD7xa*8HBbYc2Z%i z0U9Rdd+9xxf_W>~PpxQRp$K3Z($g#$ar<4p|L>^I#i*Q%G=iM6gnTtXLrN~d6$&#A zk_IeAss>N`NUoSzQqKfb$pjjq|C2}z;%X4ljW8AR6%$Pm%PDQ)iiubo(aJe2vsz2# zuL#IU*pB7nbq?(68KX$WLj1DVooIqsj*~G zO>UG-G(jwyjD5m$7l`8>H_f*Ez6OEqRAdk7FT&W*~{5Idisww=JrQ za@^$!lASifMl5SoHAZhwPeeHIb8~vk29~5j6U1_gCS2^~j?MZWfU9`+OJ=eWmObkR zVk;qxw|+8TX`5(*SWamhwlz8-I^%VPyx3$T*jv_3_xNgTeJ;r9F`L6S*)%~Gn`|y@ za?B*>z|M17OYCV(&y* z*Pc$BJxg6fPBf`1EvIP0#c+l;BC&H=o-%cHBRp)@P0_l1d(J@gO~Q7lO%ud&tgX4| zfRCB%DvGo*Gua5w)RO3T*SzHnMkma%6-zzu4QbEEMp^rW_S14 z2%*jwCz>G3*qUn|8(mCmbDVGu(+K;$qKrR8m1vxmB-Fa8H_-&K9FL85D5ftD)_No zD>Cc4Ea!qkIwmzjdnFz~ea;G*_O~7z2iHz>nBCSE1in}az0c$|OrK|oO3yK1q6uO- zMH8+mH<0s5Qq?s~Blw`2Nu2|`BZj+{Evxooca?V;G(p^YFPd=0CunRs2Xa-|vTcuzb6`gt;zDa1F(^kBIxA-CWdW`t89(>6NQi_C znjn@_+QQ}ZB-#{(vly^&mMZ)3*ogIs6!wME{ebLtKMqAc=3yMT_5&%VQ&U zxf-+qdEFXemSPi%W_ltQ{MJS%)7{32CWz$}O}OF#OB<_O9yb}@CU>!dbX^DHCt`QU zZgkJ8EP2ojB>9Epn2Y`1(R5UZo(PYvYsTd%yV68pw1Fg7X3{;91xZ~u>Qk&#JIQ0C zLL`xrEvFpRclLw$rX4l`V%dzXyt2MGXxrk6qJKdWUk4Z3I#))JQV#NS%uPdUVASV` z(V~%yXJCqw6jdbNsq!1J3=Ondc%+Us1WhF*(lbs64G@IOhY$``kf0}9SmmnpEEEAO z!+OF(vNLKzf`g=ZKWaSnUbLhnHWCPx8eqI}!$i+0Zi)bwAwA84BW%w>fK#c@c<_7D z)4=G`6BN~IMRD2#+`95aE))SQLwcHpZb8qRZmr?8(UW7e26(tyc|s<~snSEuVJR36 zzF1QbiU5{jim*&Q2%ioToiw0CXPpiTVV%p%>U5APvZ}H%efdrq<4hC8a-?i<(F$o# z=(nWHhBAEvagZoJmt9(@t`I3-6v4EXH8S0JHsbKJ!o~XZ{?)hb6?u6|vJoxTgxG@> z!VF7xdVYGhI`cSa1~RHh99PZSlIauGa5$0#pS3mO>r;M8MLu~V(%XvHIxp0@8>4k} z;)xouoS6&Bj^OeZ`nz-N7jLZe3>sk}S~ez6rms~>#+Z5(WTMe2qc&*f78-MUX$f)gb1p7R5Q{vK`h5(Yp!|SIKxx-Nr_9&4;sP!RZP+Q*UB_` z?#_mDI>_=hO(T|LZOt{^{_t6#){@6hM}+98Gc|3#lHH&a`|&Wup^9u(h`4VzeDo^bI#<@siZ_U=Vg!o|1aZV;g>1CwSg( z6HO4yv9{*IO2^n}S}GRmDYI^kP=vHL!a~iPBNAhyvl&YsG(jw}ZGWt{ol#?( z$k-b3A)Wc?ciP^w0%)Uq8EtH-q6uP`y23@g9WzNsQ<!KlMWxI_pp=Q(xCfWu~5X-T)<{~5L z2&#hv`9S#k24EwEvSds;UaBC30r?6H#x4v88V&w_?N>9{iL{b8HfKQ3wxQ zelqp21Q@ZL6)t9N%%pmm@g=nbbb=Qo)}6o8u90*Wud_J$vJqeOMs$#Px50%akNi~c zy=aykDdf5QCUaRppM-Gorc9g1PsGvJ=~R1YwJQb;WJDYx=9(go-doN{ay~wg;T470 zZi$`AeL0J>=U!+U!8Eek&E+G}tQ);dLX=}b&LSIe!14-kf~Q_8I%D+&o0F+k5~E8$+OdQ!{@7T}p|1S^RxgQ(lWDy1jsZ?VZHCmM!Xp1Uonxw0pv zjda?}MiO0{y8&E7`6RhbiJ?5GY2=oJQ`m(ffMsYhnuTgn@j!Yyorb22u>qvij=^E7 zSeKp(BKS+yHvml$z%rz#SkV{{@y3#K+0ev$1UJxvk7 zGOQ;oxZU=_a$TAg{AHO$13Yb6k{qC(gj}>Hl3Ku7!a@{|C#ZR_ML74+*;dVrySl^>yrWJ-G^nyf ze^XjJn4~D#05s0MEJw-)7YjGEu~Bpej<%6~52X9-YysDljI?aTZw}UM3>tPzAtU<^ z7pv9Qr#IKs(Lfun%wubWq9-F^cTy5-B%RlF_PIi1>1 zkeqeuFD==tk_0AaBCn(g>$&|3#FZ>F*<3J>Oo#r74sdbqYuyP>b49uvr*31T@OTXQl0OU}qyo1U9}l69jUV#KLy@p)0*+AZg+ZxeeZ zCz>FZv%)poBpna7!@L6;S*)9mhBKXI2k3mDJV5V~MwT7WT(h>${+5|+WSJ%Wp>8Hk zGYJw;+%wt8GLy|U&7?c_+BuY_iJ0o)3nAc^OH>b^r5BQ1TZn7x6&fR!qnR9B^v`;C zON2uvOOp=jf^;;-yE$j!DJ$wYG0;r1-zpqTNX}!0h>QK^i0y2E48^tGm`Q(QS9UXI zQV411G?TuWR92dq9LSi-!8Ok$c?}^>l9)dElFdfgK*>GuoQ`AZVOJKTiyPXd3yqQN z<)TUSbA!!equzE!@1k+`zl^P` z^ohplLgbXTaIunOY}DjBvqM`v*JdM&m2gJuoDtbsB~EtTB%El1ELPH7la=7`6a>l3 znOqI60dHtMBc(pS(s!kEX+!6%SSUblku+c#GYi|aa|Fs`1h^U(@JiNl@e0a*($eBMrgq4x|u3`P~+sn6TVY+qAQ8DmJL|O z%tDi~Z2}jlD-k>#&!~B8fXS)q2j`{$M2{~;GreE!Y=EW+U>VZWEF@1|`H}6Z`NzY> z^crB@DvIcBVKyvJlH`MSvFa(Nx+wx!hV_JnDbUPnN9n5(Jg2xi7ia`WUVc{{WcAS* zf!9@B$P}_dW5jZ#Y;ZBE5icoHV^ln73=V`ev7ZqitLZ?0 z*AeQo+G1JZbaWO3>-STFST_BOMtCCjAyYqS29gzY2Up`KCGGvYk@p*T0x*xQ5llNz ziEq?yW!^fg!^_3mo2C)V@iR6T&p5_LzfzrVw6S|iTM*2ubI-~b(3Uz-f8~>4V)Jd9 zAeK|w!o?Dgv2o%@(klyyyU^DUjMyQYPZ?`PzBml$p7>8wDj1JZ2P0U z>iwoKgW*^-lc@(M1P5Y10+sr;%w+te-q%&W0@t7!NOq~d6=p6{(nT9jAU>Wc`KdDf znx#~>o66a>ZuE~bx613wPfs*PEXU8-T#T*v8!Z^SU}n8sNdwfrdLjZYBa$lem;pF_ zm?;cc#>_(3qDRFBRnkqSOY))xYalmZ0Ek%H!VuP`22gJi0Ni2&SVjP|IK``&#>FCU zdsNrtHGtTXLOWbnzw{k~+F*2koGmOA0W3p$nguD+>sch-= z=*B2VcjK&;Qe4VcXpC5nl=Z#do^WfUEvQp-=7KuT+7_g5a1l+t14lNf_-eahOUL6c zNY{hSmAb~-WO}s}gnnylgf&kz!}PqD(H7abY=mk?22Bv2Iy2H-Ol@Z&zIRg#lJkjy zEcc$c`>InU=B;yI5R6Mm-+O9={J6baxH2R5irAfcJ8B&F?h3+Frm|E1D4HdUW(TT8 zr}=N1AeN(b+iWhP(%4-rH*DN2ijm++46vLvYd8Qcte(BBUj2arnj(N@NKvySvTIbR zR@y=@i~fUmR{#P!1D2bb^aQXBKS@|7J?d;K zB2W@zOtp)HxJ@KB(O|5aT%NlSy8eZXo@o%vS>f_8+Gmib>KXC5*~N8@%THZ)rR>() zSnk$Fs|N3{ku^;a%PDQ)a)gRD+9}HJWfbi*g0SZ03w0YpP5YW?OG+;UWTKJlE;&tO zE?*mnw%k47DbrBzd+wNaXJDk&>KA|{+t?sDTGB)lWXYSGD_Ki~8!WcaLb;b}Dg)#EbWV8`*X)$S*m^W)%5MrD8sH8oUDD4cGji;5wku=Rfdj6Y>{Il~m zy{YN3u}z|_k;UGKf4Vcm+IELnXUZDw3XKuV@iR8p%IUBZ7R?e*sj=xLGQ}F%P4YIP zrs61wyJ+k{+yO(FXa-_A(&m@JYW{6oS~oT8)cdJ9v9?A~5p8PdiDr4bOidWg z%x#~bwk2B|JHWn#JT<+y1xYonqR|#WzMD8A>n2Cg+*V{&@foD^*5;xr)Kgm21Y!l zNVEB|AroKlNb(vpg@JMO)GTaDjof;?pEubRR2(#7B!=%5K=Ii-y`78he5+GNk#2aC2w7HwF#y2O(< z8pat~YinfD)?BkTY*jl$@~Y(i3Ff6s$^i*VP0|-PJ*x z`-Y+kVma2PeRD;VtT19ocDjY;fzw=Ie&CWjA6ug@lU^wC3Mq zQ>mFW!;)-5DvtzdnnoxM&4BwCQ+ONy%wH?wZK+rtWA zzfMl8qc)?D$V-T~}*3{B77F>OIQrYR%W4kYu* zNR+Q=cjM&Rmkp$2T5~b}wi4BH<|99eO*TSl*m(wr-ij+EK+#5St?mQJpb26*9ve+2 zbNNv-lQ@y^kvMq=EC@-m`9Qn_h@jDr>3IhbcA91&$XVecg0@%o<<)x1^#3LVcOgE# zcA!?0t|66`=;bo?k{H{d8A$qngNrHdIO>BXc`kxcjcr0)Iiih@AZf8=rveqC&N*BY zO_1J`;gU^`{YEXJZW}hqUe-+NFHsnAGVQUcRuGNDOe5q9LhwK<$l?>4E9VWeNj0ow z+%yGB*#Zz`BnRah7-v)DngP^|(xKO&2#}!BEci^Vs`XS^4O8bL0T5g3MJ1z#0eY}4 z>#4IKDIOHWS1C>iZ>k^K*mBXvT_Hu8$-22LL^DfVgJvMMz=_L? zp0Tk?D*CvfL?g@E8o?DMUb0F$ALXJG`HE+Wd_~Arr}mM7|1oRx%Y(A3(NoLaY9e_omL5suf5IH#_f_)@bq!c!*B%5@>#}XrRDZnWl(ulO z5r#I};PTy!t#?2p%dHivFFz6WP<8-FR=amVBbH-r&1FXzDf6Mp^!ln#B!{yxv+@gCzV63Sc&taLSg~VsXhu6a|Fjs=spWW#FqkOq5fO%ud&G`7J-RPG#79?yHpWohlV zAd5}(?qV-z-BKS+cGHOEcqW_6_Lp_j(TwJVgfshXLHcB?4q{}tZGk#s(Q4yy(`#4| zTOe!OTqG64bLpOW@!_02wniKk{FJ#dF6)l$GJWf>*tyXN0VLj~xfq9L#PJOu>=ht9 zCO>WjBg>kAVCWi2-^ak?D(3(*R!7<=6|xsjomOQ0oZwv{x(Q&x(q@3$*2 z(V!E}b7llG(db;MZdJ7} zW9y21dG4;-m$5mqVBTgLh9G2&ZE($F)5B;^c*@SX2Ew5Il+eg4BB?7R$hAxP*Pt0l z$_)+ET=Nc42OT~g+IRIkkkO?hZDg0|8c^AdzIiPV1lL3p1UX(eXw1caZ$GK8SF56c zuk(@x>70WYq;9>8rQ-{O!b+vBWe=qDlI9{WT6Q;$HY{Ko8{t1l$4(Gg0NPSL=`Sng z83)ZkdTh-_7C3t2Og%qr(qP8Fc)vA5pigG5r56oexmOY&%u4F|RMP~poLcR0;gv@; zrGQqAPB7}zp+@i=@lzo30NnD(NtE7dr(wNGm>V=fEXV8CTu$QSl}X$5lw4fy`mGTr zG^+$6ZCp(5NKGQIwmHb431T_c)?7rzF*a&z)uudUd*w#3_jp{Qx#F8{uw=AM1%@u9 zX&PC)a&s|x!z*jOSrdN6?0VgT6uVbI=S5mKe`B%{^$}KSgp{175f_O4jeQAOFRiCd z21HygD+$7Y%1>@`NnRcRzI5q?Xy<}VG)64P+M0{5g;u1rRi7AbY{k+xkes1ys=J%# zZVO~3*>7-7G(nJ4+QNk+82e2vTdYg%hGee`(td(Qr(z(-uYF<%qP7TJ6HSnu4*6Sv z;>w#{8e7-Y9JDY?8rwjyiTJ5h*&JngpNfVl#Fv2#njn^=u}O|9aU}Z=v}clgb8K1t zp^(HkzbdU~qQ#VTqst-h0zzTsSpt!FS)~DqoThh$9jXh_F1HYE)w8<}W~ zSdO1jNsGAV%$)8fOTR_Y)F(xaP_4D+!mOAR%BW!zm~|n8CWz%ooBnd3xg5Z<1IWzD z=(qS6M(!Q3AY{*eN)XIri*!7FVrAWwMB*AW1MyxaR}L3T%)&%l6?5Xl<5^oH$nKeR z2_|jbc_B&1gsi`5f>=(?WO2!$WNqF7I7kYIEt*pJK<|Jcw7I*_R1R_rq|fsRhor

    bFPTO4N3vBMd;7@YyQxikU@jzU`0xfwKW&6 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⋙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

    whAs-bP-&T=qk8i(OGa&2v3l=1u3{-u|;q} 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

    6?e%jj)eK%oGe<kH^KYsL5mZM`Y#ytC8XsWWq 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 0]) +# Which are just these 6 : +\dontrun{ +Diet.Iron 141 +Albumin 252 +Serum.Iron 1008 +TIBC 853 +Transferin 1019 +Hemoglobin 759 +}%dont +} +\keyword{datasets} diff --git a/man/colramp.Rd b/man/colramp.Rd new file mode 100644 index 0000000..807b72e --- /dev/null +++ b/man/colramp.Rd @@ -0,0 +1,58 @@ +\name{ColorRamps} +\title{Color Ramps on Perceptually Linear Scales} +\alias{ColorRamps} +\alias{LinGray} +\alias{BTC} +\alias{BTY} +\alias{LinOCS} +\alias{heat.ob} +\alias{magent} +\alias{plinrain} +\description{ + Functions for returning colors on perceptually linear scales, + where steps correspond to \sQuote{just detectable differences}. +} +\usage{ +LinGray (n, beg=1, end=92) +BTC (n, beg=1, end=256) +LinOCS (n, beg=1, end=256) +heat.ob (n, beg=1, end=256) +magent (n, beg=1, end=256) +plinrain(n, beg=1, end=256) +} +\arguments{ + \item{n}{number of colors to return from the ramp} + \item{beg}{begining of ramp, integer from 1-255} + \item{end}{end of ramp, integer from 1-255} +} +\value{ + returns an array of colors +} +\details{ + Several precalulated color ramps, that are on a perceptually linear + color scale. A perceptually linear color scale is a scale where each + jump corresponds to a \dQuote{just detectable difference} in color and the + scale is percieved as linear by the human eye (emprically determined). + + When using the ramps, if \code{beg} is less than \code{end} the ramp + will be reversed. +} +\references{ + Haim Levkowitz (1997) + \emph{Color Theory and Modeling for Computer Graphics, + Visualization, and Multimedia Applications}. + Kluwer Academic Publishers, Boston/London/Dordrecht. + \url{http://www.cs.uml.edu/~haim/ColorCenter/} +} +\seealso{ + \code{\link[grDevices]{rainbow}}, \code{\link[grDevices]{terrain.colors}}, \code{\link[grDevices]{rgb}}, + \code{\link[grDevices]{hsv}} +} +\examples{ +h <- hexbin(rnorm(10000),rnorm(10000)) +plot(h, colramp= BTY) +## looks better if you shave the tails: +plot(h, colramp= function(n){LinOCS(n,beg=15,end=225)}) +} +\author{Nicholas Lewin-Koh} +\keyword{color} diff --git a/man/erode.hexbin.Rd b/man/erode.hexbin.Rd new file mode 100644 index 0000000..7eaf584 --- /dev/null +++ b/man/erode.hexbin.Rd @@ -0,0 +1,85 @@ +\name{erode.hexbin} +\alias{erode} +\alias{erode.hexbin} +\alias{erode,hexbin-method} +\alias{erodebin-class} + +\title{Erosion of a Hexagon Count Image} +\description{ + This erosion algorithm removes counts from hexagon cells at a rate + proportional to the cells' exposed surface area. When a cell becomes + empty, algorithm removes the emptied cell and notes the removal + order. Cell removal increases the exposure of any neighboring cells. + The last cell removed is a type of bivariate median. +} + +\usage{ +erode(hbin, cdfcut = 0.5) +erode.hexbin(hbin, cdfcut = 0.5) +} + +\arguments{ + \item{hbin}{an object of class \code{\link{hexbin}}.} + \item{cdfcut}{number in (0,1) indicating the confidence level for the + limits.} +} + +\value{ + An \code{"erodebin"} object (with all the slots from \code{hbin}) and + additionally with + high count cells and a component \code{erode} that gives the erosion order. +} + +\details{ + The algorithm extracts high count cells with containing a given + fraction (cdfcut) of the total counts. The algorithm extracts all + cells if cdfcut=0. The algorithm performs gray-level erosion on the + extracted cells. Each erosion cycle removes counts from cells. The + counts removed for each cell are a multiple of the cell's exposed-face + count. The algorithm choses the multiple so at least one cell will be + empty or have a count deficit on each erosion cycle. The erode vector + contain an erosion number for each cell. The value of erode is + + 6*erosion\_cycle\_ at\_ cell\_ removal - cell\_deficit\_at\_removal + + Cells with low values are eroded first. The cell with the highest + erosion number is a candidate bivariate median. A few ties in erode + are common. +} + +\seealso{ + \code{\link{hexbin}}, \code{\link{smooth.hexbin}}, + \code{\link{hcell2xy}}, %%FIXME\code{\link{hcell}}, + %% \code{\link{hboxplot}}, \code{\link{hdiffplot}}, + %% \code{\link{hmatplot}}, + \code{\link{gplot.hexbin}}, + \code{\link{grid.hexagons}}, \code{\link{grid.hexlegend}} +} + +\examples{ +set.seed(153) +x <- rnorm(10000) +y <- rnorm(10000) +bin <- hexbin(x,y) + +smbin <- smooth.hexbin(bin) +erodebin <- erode.hexbin(smbin, cdfcut=.5) +plot(erodebin) + +## bivariate boxplot +hboxplot(erodebin, main = "hboxplot(erodebin)") + + +%% MM: This looks wrong -- both the graphic and the logic in "par" here : +# show erosion order +plot(bin,style= "lat", minarea=1, maxarea=1, + legend=FALSE, border=gray(.7)) + +%% FIXME: {compare with example in "hexbin0"} +grid.hexagons(erodebin,style= "lat", minarea=1, maxarea=1,pen="green") +xy <- hcell2xy(erodebin) +grid.text(lab = as.character(erodebin@erode), xy$x, xy$y, + gp = gpar(col="white", cex=0.65)) + +} +\keyword{hplot} diff --git a/man/getHMedian.Rd b/man/getHMedian.Rd new file mode 100644 index 0000000..447511d --- /dev/null +++ b/man/getHMedian.Rd @@ -0,0 +1,34 @@ +\name{getHMedian} +\alias{getHMedian} +\alias{getHMedian,erodebin-method} +\title{Get coordiantes of the median cell after the erode operation} +\description{ + A method for a eroded hexbin object to extract the coordinates of the + median cell. The median is simply the cell with the highest erosion + number or the last cell to be eroded. +} +\usage{ +getHMedian(ebin) +} +\arguments{ + \item{ebin}{result of \code{\link{erode.hexbin}()}.} +} +\section{Methods}{ + \describe{ + \item{ebin = "erodebin"}{...} + } +} +\seealso{\code{\link{erode.hexbin}} +} +\examples{ +set.seed(153) +x <- rnorm(10000) +y <- rnorm(10000) +bin <- hexbin(x,y) + +smbin <- smooth.hexbin(bin) +erodebin <- erode.hexbin(smbin, cdfcut=.5) +getHMedian(erodebin) +} +\keyword{methods} + diff --git a/man/gplot.hexbin.Rd b/man/gplot.hexbin.Rd new file mode 100644 index 0000000..bc04efd --- /dev/null +++ b/man/gplot.hexbin.Rd @@ -0,0 +1,144 @@ +\name{gplot.hexbin} +\alias{gplot.hexbin} +\alias{plot,hexbin,missing-method} +\title{Plotting Hexagon Cells with a Legend} +\description{ + Plots Hexagons visualizing the counts in an hexbin object. Different + styles are availables. Provides a legend indicating the count + representations. +} +\usage{ +%% In future: No longer export gplot.hexbin() ! +gplot.hexbin(x, style = "colorscale", legend = 1.2, lcex = 1, + minarea = 0.04, maxarea = 0.8, mincnt = 1, maxcnt = max(x@count), + trans = NULL, inv = NULL, colorcut = seq(0, 1, length = min(17, maxcnt)), + border = NULL, density = NULL, pen = NULL, + colramp = function(n) LinGray(n,beg = 90,end = 15), + xlab = "", ylab = "", main = "", newpage = TRUE, + type = c("p", "l", "n"), xaxt = c("s", "n"), yaxt = c("s", "n"), + clip = "on", verbose = getOption("verbose")) +%% FIXME: This is the S4 plot method for 'hexbin' +%% currently also exported "standalone" - for testing,debugging.. +%% we'd really don't want to repeat the argument list; use \synopsis{.} ? +\S4method{plot}{hexbin,missing}(x, style = "colorscale", legend = 1.2, lcex = 1, + minarea = 0.04, maxarea = 0.8, mincnt = 1, maxcnt = max(x@count), + trans = NULL, inv = NULL, colorcut = seq(0, 1, length = min(17, maxcnt)), + border = NULL, density = NULL, pen = NULL, + colramp = function(n) LinGray(n,beg = 90,end = 15), + xlab = "", ylab = "", main = "", newpage = TRUE, + type = c("p", "l", "n"), xaxt = c("s", "n"), yaxt = c("s", "n"), + clip = "on", verbose = getOption("verbose")) +} +\arguments{ + \item{x}{an object of class \code{\link{hexbin}}.} +% \item{y}{(required by the S4 method for \code{\link{plot}} but unused +% here; must be missing)} + \item{style}{string specifying the style of hexagon plot, + see \code{\link{grid.hexagons}} for the possibilities.} + \item{legend}{numeric width of the legend in inches of \code{FALSE}. + In the latter case, or when \code{0}, no legend is not produced.} + \item{lcex}{characters expansion size for the text in the legend} + \item{minarea}{fraction of cell area for the lowest count} + \item{maxarea}{fraction of the cell area for the largest count} + \item{mincnt}{cells with fewer counts are ignored.} + \item{maxcnt}{cells with more counts are ignored.} + \item{trans}{\code{\link{function}} specifying a transformation for + the counts such as \code{sqrt}.} +% FIXME: use better description of these in hexagons() -- or use same +% ---- help page ?! + \item{inv}{the inverse transformation of \code{trans}.} + \item{colorcut}{vector of values covering [0, 1] that determine + hexagon color class boundaries and hexagon legend size boundaries. + Alternatively, an integer (\code{<= maxcnt}) specifying the + \emph{number} of equispaced colorcut values in [0,1].} + \item{border, density, pen}{color for polygon borders and filling of + each hexagon drawn, passed to \code{\link{grid.hexagons}}.} + \item{colramp}{function accepting an integer \code{n} as an argument and + returning n colors.} + \item{xlab, ylab}{x- and y-axis label.} + \item{main}{main title.} + \item{newpage}{should a new page start?.} + \item{type, xaxt, yaxt}{strings to be used (when set to \code{"n"}) for + suppressing the plotting of hexagon symbols, or the x- or y-axis, + respectively.} + \item{clip}{either 'on' or 'off' are the allowed arguments, when on + everything is clipped to the plotting region.} + \item{verbose}{logical indicating if some diagnostic output should happen.} + \item{\dots}{all arguments of \code{gplot.hexbin} can also be used for + the S4 \code{\link{plot}} method.} +} +\details{ + This is the (S4) \code{\link{plot}} method for \code{\link{hexbin}} (and + \code{erodebin}) objects (\link{erodebin-class}). + + To use the standalone function + \code{gplot.hexbin()} is \bold{\emph{deprecated}}. + For \code{style}, \code{minarea} etc, see the \bold{Details} section of + \code{\link{grid.hexagons}}'s help page. + + The legend functionality is somewhat preliminary. Later versions may + include refinements and handle extreme cases (small and large) for + cell size and counts. +} +\value{ + invisibly, a list with components + \item{plot.vp}{the \code{\link{hexViewport}} constructed and used.} + \item{legend.vp}{if a legend has been produced, its + \code{\link[grid]{viewport}}.} +} + +\references{ see in \code{\link{grid.hexagons}}.} +\author{ + Dan Carr \email{dcarr@voxel.galaxy.gmu.edu}, + ported by Nicholas Lewin-Koh \email{kohnicho@comp.nus.edu.sg} and + Martin Maechler. +} +\seealso{\code{\link{hexbin}}, \code{\link{hexViewport}}, + \code{\link{smooth.hexbin}}, + \code{\link{erode.hexbin}}, + \code{\link{hcell2xy}}, \code{\link{hboxplot}}, + \code{\link{hdiffplot}}. %%, \code{\link{hmatplot}}. +} +\examples{ +## 1) simple binning of spherical normal: +x <- rnorm(10000) +y <- rnorm(10000) +bin <- hexbin(x,y) + +## Plot method for hexbin ! +## ---- ------ -------- +plot(bin) +# nested lattice +plot(bin, style= "nested.lattice") + +# controlling the colorscheme +plot(bin, colramp=BTY, colorcut=c(0,.1,.2,.3,.4,.6,1)) + +## 2) A mixture distribution +x <- c(rnorm(5000),rnorm(5000,4,1.5)) +y <- c(rnorm(5000),rnorm(5000,2,3)) +bin <- hexbin(x,y) + +pens <- cbind(c("#ECE2F0","#A6BDDB","#1C9099"), + c("#FFF7BC","#FEC44F","#D95F0E")) +plot(bin, style = "nested.lattice", pen=pens) +# now really crazy +plot(bin, style = "nested.lattice", pen=pens,border=2,density=35) + +# lower resolution binning and overplotting with counts +bin <- hexbin(x,y,xbins=25) +P <- plot(bin, style="lattice", legend=FALSE, + minarea=1, maxarea=1, border="white") +## +%% FIXME! +pushHexport(P$plot.vp) +xy <- hcell2xy(bin) + # to show points rather than counts : +grid.points(x,y,pch=18,gp=gpar(cex=.3,col="green")) +grid.text(as.character(bin@count), xy$x,xy$y, + gp=gpar(cex=0.3, col="red"),default.units="native") +popViewport() + +# Be creative, have fun! +} +\keyword{hplot} diff --git a/man/grid.hexagons.Rd b/man/grid.hexagons.Rd new file mode 100644 index 0000000..46fcd94 --- /dev/null +++ b/man/grid.hexagons.Rd @@ -0,0 +1,198 @@ +\name{grid.hexagons} +\alias{grid.hexagons} +\title{Add Hexagon Cells to Plot} +\description{ + Plots cells in an hexbin object. The function distinquishes among + counts using 5 different styles. This function is the hexagon + plotting engine from the \code{plot} method for \code{\link{hexbin}} + objects. +} +\usage{ +grid.hexagons(dat, style = c("colorscale", "centroids", "lattice", + "nested.lattice", "nested.centroids", "constant.col"), + use.count=TRUE, cell.at=NULL, + minarea = 0.05, maxarea = 0.8, check.erosion = TRUE, + mincnt = 1, maxcnt = max(dat@count), trans = NULL, + colorcut = seq(0, 1, length = 17), + density = NULL, border = NULL, pen = NULL, + colramp = function(n){ LinGray(n,beg = 90, end = 15) }, + def.unit= "native", + verbose = getOption("verbose")) +} +\arguments{ + \item{dat}{an object of class \code{hexbin}, see \code{\link{hexbin}}.} + \item{style}{character string specifying the type of plotting; must be (a + unique abbrevation) of the values given in \sQuote{Usage} above.} + \item{use.count}{logical specifying if counts should be used.} + \item{cell.at}{numeric vector to be plotted instead of counts, must + besame length as the number of cells.} + \item{minarea}{numeric, the fraction of cell area for the lowest count.} + \item{maxarea}{the fraction of the cell area for the largest count.} + \item{check.erosion}{logical indicating only eroded points should be + used for \code{"erodebin"} objects; simply passed to + \code{\link{hcell2xy}}, see its documentation.} + \item{mincnt}{numeric; cells with counts smaller than \code{mincnt} + are not shown.} + \item{maxcnt}{cells with counts larger than this are not shown.} + \item{trans}{a transformation function (or \code{NULL}) for the counts, + e.g., \code{\link{sqrt}}.} + \item{colorcut}{a vector of values covering [0, 1] which determine + hexagon color class boundaries or hexagon size boundaries -- for + \code{style = "colorscale"} only.} + \item{density}{\code{\link[grid]{grid.polygon}} argument for shading. 0 causes + the polygon not to be filled. \emph{This is not implemented (for + \code{\link[grid]{grid.polygon}}) yet}.} + \item{border}{\code{\link[grid]{grid.polygon}()} argument. Draw the border for + each hexagon.} + \item{pen}{colors for \code{\link[grid]{grid.polygon}()}. Determines the color + with which the polygon will be filled.} + \item{colramp}{function of an integer argument \code{n} returning n + colors. \code{n} is determined }%% how? FIXME + \item{def.unit}{default \code{\link[grid]{unit}} to be used.}% FIXME + \item{verbose}{logical indicating if some diagnostic output should happen.} +} +\section{SIDE EFFECTS}{Adds hexagons to the plot.} + +\details{ + The six plotting styles have the following effect: + \describe{ + \item{\code{style="lattice"} or \code{"centroids"}:}{ + + Plots the hexagons in different sizes based on counts. The + \code{"lattice"} version centers the hexagons at the cell centers + whereas \code{"centroids"} moves the hexagon centers close to the + center of mass for the cells. In all cases the hexagons will not + plot outside the cell unless \code{maxarea > 1}. Counts are rescaled + into the interval [0,1] and colorcuts determine the class + boundaries for sizes and counts. The pen argument for this style + should be a single color or a vector of colors of + \code{length(bin@count)}.} + + \item{\code{style="colorscale"}:}{ + Counts are rescaled into the interval [0,1] and colorcuts determines + the class boundaries for the color classes. For this style, the + function passed as \code{colramp} is used to define the n colors for + the n+1 color cuts. The pen argument is ignored. + %% S-plus: In motif color options try polygon: black 16 white + See \code{\link{LinGray}} for the default \code{colramp} and + alternative \dQuote{color ramp} functions. + } + \item{\code{style="constant.col"}:}{ + This is an even simpler alternative to \code{"colorscale"}, + using constant colors (determined \code{pen} optionally). + } + + \item{\code{style="nested.lattice"} and \code{"nested.centroids"}:}{ + Counts are partitioned into classes by power of 10. The encoding + nests hexagon size within powers of 10 color contours. + + If the pen argument is used it should be a matrix of colors with 2 + columns and either \code{ceiling(log10(max(bin@count)))} or + \code{length(bin@count)} rows. The default uses the \R color palatte + so that pens numbers 2-11 determine colors for completely filled + cell Pen 2 is the color for 1's, Pen 3 is the color for 10's, etc. + Pens numbers 12-21 determine the color of the foreground hexagons. The + hexagon size shows the relative count for the power of 10. Different + color schemes give different effects including 3-D illusions + %% S-plus : + %% One motif color option for the first 4 powers is black \#BBB \#36F + %% \#0E3 \#F206 \#FFF4 \#FFF + %% + %% A second option is for the first 5 power is black \#FFF \#08F \#192 + %% \#F11 \#FF04 \#000 \#999 \#5CF \#AFA \#FAAF \#000 + } + } + + \emph{Hexagon size encoding \code{minarea} and \code{maxarea}} + determine the area of the smallest and largest hexagons + plotted. Both are expressed fractions of the bin cell size. Typical + values might be .04 and 1. When both values are 1, all plotted + hexagons are bin cell size, if \code{maxarea} is greater than 1 than + hexagons will overlap. This is sometimes interesting with the lattice + and centroid styles. + + \emph{Count scaling} + + \code{relcnt <- (trans(cnt)-trans(mincnt)) / (trans(maxcnt)-trans(mincnt))} + \cr + \code{area <- minarea + relcnt*maxarea} + + By default the transformation \code{trans()} is the identity + function. The legend routine requires the transformation inverse + for some options. + + \emph{Count windowing \code{mincnt} and \code{maxcnt}} + Only routine only plots cells with cnts in [mincnts, maxcnts] +} +\references{ + Carr, D. B. (1991) + Looking at Large Data Sets Using Binned Data Plots, + pp. 7--39 in \emph{Computing and Graphics in Statistics}; + Eds. A. Buja and P. Tukey, Springer-Verlag, New York. +} +\author{ + Dan Carr ; + ported and extended by Nicholas Lewin-Koh \email{nikko@hailmail.net}. +} +\seealso{\code{\link{hexbin}}, \code{\link{smooth.hexbin}}, + \code{\link{erode.hexbin}}, \code{\link{hcell2xy}},% \code{\link{hcell}}, + \code{\link{gplot.hexbin}}, \code{\link{hboxplot}}, \code{\link{hdiffplot}}, + \code{\link{grid.hexlegend}}% \code{\link{hmatplot}} +} + +\examples{ +set.seed(506) +x <- rnorm(10000) +y <- rnorm(10000) + +# bin the points +bin <- hexbin(x,y) + +# Typical approach uses plot( ) which controls the plot shape : +plot(bin, main = "Bivariate rnorm(10000)") + +## but we can have more manual control: + +# A mixture distribution +x <- c(rnorm(5000),rnorm(5000,4,1.5)) +y <- c(rnorm(5000),rnorm(5000,2,3)) +hb2 <- hexbin(x,y) + +# Show color control and overplotting of hexagons +## 1) setup coordinate system: +P <- plot(hb2, type="n", main = "Bivariate mixture (10000)")# asp=1 + +## 2) add hexagons (in the proper viewport): +pushHexport(P$plot.vp) +grid.hexagons(hb2, style= "lattice", border = gray(.1), pen = gray(.6), + minarea = .1, maxarea = 1.5) +popViewport() + +## How to treat 'singletons' specially: +P <- plot(hb2, type="n", main = "Bivariate mixture (10000)")# asp=1 +pushHexport(P$plot.vp) +grid.hexagons(hb2, style= "nested.centroids", mincnt = 2)# not the single ones +grid.hexagons(hb2, style= "centroids", maxcnt = 1, maxarea=0.04)# single points +popViewport() + + +%% FIXME --- this would mix grid- and traditional-graphics +%% ----- would need grid-graphics for 'gpclib' -- aaargs... +% # And if we had all the information... +% if(require(gpclib)){ +% h1 <- chull(x[1:5000], y[1:5000]) +% h2 <- chull(x[5001:10000], y[5001:10000]) +% h2 <- h2+5000 +% h1 <- as(cbind(x[1:5000],y [1:5000])[h1, ], "gpc.poly") +% h2 <- as(cbind(x,y)[h2, ], "gpc.poly") +% plot(hb2, type="n", main = "Bivariate mixture (10000)")# asp=1 +% +% plot(h1,poly.args = list(col ="#CCEBC5"),add = TRUE) +% plot(h2,poly.args = list(col ="#FBB4AE"),add = TRUE) +% plot(intersect(h1, h2), poly.args = list(col = 2), add = TRUE) +% grid.hexagons(hb2, style= "centroids", border = gray(.1), pen = gray(.6), +% minarea = .1, maxarea = 1.5) +% } + +} +\keyword{aplot} diff --git a/man/grid.hexlegend.Rd b/man/grid.hexlegend.Rd new file mode 100644 index 0000000..991d005 --- /dev/null +++ b/man/grid.hexlegend.Rd @@ -0,0 +1,81 @@ +\name{grid.hexlegend} +\alias{grid.hexlegend} +\title{Add a Legend to a Hexbin Plot} +\description{ + Plots the legend for the \code{plot} method of \code{\link{hexbin}}. + Provides a legend indicating the count representations. +} +\usage{ +grid.hexlegend(legend, ysize, lcex, inner, style = , + minarea = 0.05, maxarea = 0.8, mincnt = 1, maxcnt, trans = NULL, + inv = NULL, colorcut, density = NULL, border = NULL, pen = NULL, + colramp = function(n) { LinGray(n,beg = 90,end = 15) }, + leg.unit = "native") +} +\arguments{ + \item{legend}{positive number giving width of the legend in inches.} + \item{ysize}{height of legend in inches} + \item{lcex}{the characters expansion size for the text in the legend, + see \code{\link{par}(cex=)}.} + \item{inner}{the inner diameter of a hexagon in inches.} + \item{style}{the hexagon style; see \code{\link{grid.hexagons}}.} + \item{minarea, maxarea}{fraction of the cell area for the lowest and largest + count, respectively.} + \item{mincnt, maxcnt}{minimum and maximum count accepted in \code{plot}.} + \item{trans}{a transformation function for the counts such as + \code{\link{sqrt}}.} + \item{inv}{the inverse transformation function.} + \item{colorcut}{numeric vector of values covering [0, 1] the determine + hexagon color classes boundaries and hexagon legend size boundaries.} + \item{border}{argument for \code{\link{polygon}()}. Draw the border + for each hexagon.} + \item{density}{argument for \code{\link{polygon}()} filling. A + \code{0} causes the polygon not to be filled.} + \item{pen}{color argument used for \code{\link{polygon}(col = .)}. + Determines the color with which the polygon will be filled.} + \item{colramp}{function accepting an integer \code{n} as an argument and + returning n colors.} + \item{leg.unit}{unit to use}%FIXME + +} +\details{ + The \code{plot} method for \code{\link{hexbin}} objects calls this function + to produce a legend + by setting the graphics parameters, so \code{hex.legend} itself is not a + standalone function. + + The legend function is \bold{preliminary}. Later version will include + refinements and handle extreme cases (small and large) for cell size + and counts. + + See the \bold{Details} section of \code{\link{grid.hexagons}}'s help page. +} +\value{ + This function does not return any value. +} +\references{ see in \code{\link{grid.hexagons}}.} +\author{ + Dan Carr + + ported by Nicholas Lewin-Koh +} + +\seealso{\code{\link{hexbin}}, \code{\link{grid.hexagons}}, +% FIXME + \code{\link{smooth.hexbin}}, \code{\link{erode.hexbin}}, +% \code{\link{hcell}}, + \code{\link{hcell2xy}}, + \code{\link{gplot.hexbin}},% \code{\link{hboxplot}},% \code{\link{hdiffplot}}, +% \code{\link{hmatplot}} +} + +\examples{ +## Not a stand alone function; typically only called from plot.hexbin() +%% Hence we should not run it here! +%% FIXME: Improve hex.legend() such that it *can* be added to plots !!! +\dontrun{ + grid.hexlegend(legend = 2, ysize = 1,lcex=8,inner=0.2, + maxcnt = 100, colorcut = c(0.5,0.5)) +} +} +\keyword{aplot} diff --git a/man/hboxplot.Rd b/man/hboxplot.Rd new file mode 100644 index 0000000..feb359a --- /dev/null +++ b/man/hboxplot.Rd @@ -0,0 +1,97 @@ +\name{hboxplot} +\alias{hboxplot} +\title{2-D Generalization of Boxplot} + +\description{ + If \code{bin} is an \emph{eroded} \code{\link{hexbin}} object, i.e., + an \code{erodebin} object, \code{hboxplot()} plots the high counts cells + selected by \code{\link{erode}()}. By default, the high counts + cells contain 50 percent of the counts so analagous to the + interquartile \dQuote{range}. The function distinguishes the last + cells eroded using color. These cells correspond to one definition of the + bivariate median. +%% FIXME ^^ (bad style, content +- ok) +} + +\usage{ +hboxplot(bin, xbnds = NULL, ybnds = NULL, + density, border = c(0, grey(0.7)), pen = c(2, 3), + unzoom = 1.1, clip ="off", reshape = FALSE, + xlab = NULL, ylab = NULL, main = "") +} +\arguments{ + \item{bin}{an object of class \code{\link{hexbin}}.} + \item{xbnds,ybnds}{global x- and y-axis plotting limits for multiple + plots.} + \item{density, border}{arguments for \code{\link{polygon}()} each of + length two, the first for the median, the second for the other cells.} + \item{pen}{colors (\dQuote{pen numbers}) for \code{polygon()}.} + \item{unzoom}{plot limit expansion factor when \code{xbnds} is + missing.} + \item{clip}{either 'on' or 'off' are the allowed arguments, when on + everything is clipped to the plotting region.} + \item{reshape}{logical value to reshape the plot although \code{xbnds} + and \code{ybnds} are present.} + \item{xlab, ylab, main}{x- and y- axis labels and main title} +} + +\value{ + invisibly, the \code{\link{hexViewport}()} used internally. + Used to add to the plot afterwards. +} + +\references{ see in \code{\link{grid.hexagons}}.} + +\details{ + The \code{density}, \code{border}, and \code{pen} arguments correspond + to the \code{\link{polygon}} function calls for plotting two types of + cells. The cell types, pen numbers and suggested colors are\cr + \tabular{lll}{ + TYPE \tab PEN \tab COLOR \cr + cells of bin \tab 2 \tab light gray \cr + last eroded cells of bin (median cells)\tab 1 \tab black \cr + } + + The erode components of the hexbin objects must be present for the + medians cells to plot. + + When \code{xbnds} is missing or \code{reshape} is true, the plot + changes graphics parameters and resets them. When \code{xbnds} is + missing the function also zooms in based on the available data to + provide increased resolution. + + The zoom used the hexagon cell centers. The unzoom argument backs off + a bit so the whole hexagon will fit in the plot. + + \code{Hboxplot()} is used as a stand alone function, for producing separate + legends .....%%FIXME for \code{\link{hmatplot}()} and for panels in + %% \code{\link{hmatplot}()}. +} + +\seealso{ + \code{\link{hexbin}}, \code{\link{erode}}, + %\code{\link{smooth.hexbin}}, + \code{\link{hcell2xy}},% \code{\link{hcell}}, + \code{\link{gplot.hexbin}}, +% \code{\link{hmatplot}}, + \code{\link{grid.hexagons}}, \code{\link{grid.hexlegend}} +} + +\examples{ +\dontshow{set.seed(753)} +## boxplot of smoothed counts +x <- rnorm(10000) +y <- rnorm(10000) + +bin <- hexbin(x,y) +erodebin <- erode(smooth.hexbin(bin)) + +hboxplot(erodebin) +hboxplot(erodebin, density = c(32,7), border = c(2,4)) +hp <- hboxplot(erodebin, density = c(-1,17), + main = "hboxplot(erode*(smooth*(.)))") +pushHexport(hp) +grid.points(x[1:10], y[1:10])# just non-sense to show the principle +popViewport() +} +\keyword{hplot} diff --git a/man/hcell2xy.Rd b/man/hcell2xy.Rd new file mode 100644 index 0000000..83c926b --- /dev/null +++ b/man/hcell2xy.Rd @@ -0,0 +1,63 @@ +\name{hcell2xy} +\alias{hcell2xy} +\alias{hcell2xy,hexbin-method} + +\title{Compute X and Y Coordinates for Hexagon Cells} + +\description{ + Computes x and y coordinates from hexagon cell id's. +} +\usage{ +hcell2xy(hbin, check.erosion = TRUE) +} +\arguments{ + \item{hbin}{a object of class \code{"hexbin"}, typically produced by + \code{\link{hexbin}(*)}.} + \item{check.erosion}{logical indicating if only the eroded points + should be returned in the case where \code{hbin} inherits from + \code{"erodebin"} (see \code{\link{erodebin-class}}); is \code{TRUE} + by default.} +} +\value{ + A list with two components of the same length as \code{bin$cell}, + \item{x}{} + \item{y}{} +} + +%%FIXME \references{see in \code{\link{hcell}}.} + +\details{ + The hexbin object \code{hbin} contains all the needed information. + The purpose of this function is to reduce storage. The cost is + additional calculation. +} + +\seealso{%%FIXME \code{\link{hcell}}, \code{\link{hray}}, + \code{\link{hexbin}}. +} + +\examples{ +x <- rnorm(10000) +y <- rnorm(10000) +plot(x,y, pch=".") +hbin <- hexbin(x,y) +str(xys <- hcell2xy(hbin)) +points(xys, cex=1.5, col=2) ; title("hcell2xy( hexbin(..) )", col.main=2) + +%% __________ FIXME ________ +\dontshow{ +## Temporal trends with confidence bounds plotted on a map: +## Illustration only pending access to user functions +## mtapply() # like tapply but for matrices +## sens.season.slope() # computes sen's seasonal slope + +## This part does not work and commented out +#hbin <- hcell(dat$x,dat$y) # x and y are in map projection units +#newdat < dat[,c('month','year','value')] # extract columns +#stats <- mtapply(newdat,bin$cell,sens.season.slope,season=12) +#plot(mymap,type='l') # map boundaries in map projection units +#xy <- hcell2xy(hbin) # x and y coordinates for hexagon cell centers +#hray(xy$x, xy$y,val=stat[,1],lower= stat[,2],upper=stat[,3]) +} +} +\keyword{manip} diff --git a/man/hcell2xyInt.Rd b/man/hcell2xyInt.Rd new file mode 100644 index 0000000..93ac7e0 --- /dev/null +++ b/man/hcell2xyInt.Rd @@ -0,0 +1,47 @@ +\name{hcell2xyInt} +\alias{hcell2xyInt} +%- Also NEED an '\alias' for EACH other topic documented here. +\title{Change cell ids to 2d integer coordinate system} +\description{ + Transforms the cell representation of a a lattice into a 2d integer + coordinate system. +} +\usage{ + hcell2xyInt(hbin, xbins=NULL, xbnds=NULL, ybnds=NULL, shape=NULL) +} + +\arguments{ + \item{hbin}{a object of class \code{"hexbin"}, typically produced by + \code{\link{hexbin}(*)}.} + \item{xbins}{the number of bins partitioning the range of xbnds.} + \item{xbnds, ybnds}{horizontal and vertical limits of the binning + region in x or y units respectively; must be numeric vector of + length 2.} + \item{shape}{the \emph{shape} = yheight/xwidth of the plotting regions.} + +} +\details{ + Takes a grid defined by either the hexbin parameters or dimen in a + hexbin object and translates the cell ids for the grid into 2d integer + coordinates. +} +\value{ + An integer matrix with two columns, i and j representing the integer + xy coordinates of the hexagon grid. + \item{i}{Integer coordiante of the rows, increases from bottom to top} + \item{j}{Integer coordiante of the columns, increases from left to right} +} + +\author{Nicholas Lewin-Koh } + + +\seealso{\code{\link{hcell2xy}}} +\examples{ + x<-rnorm(10000) + y<-rnorm(10000) + hbin<-hexbin(x,y) + ijInt<-hcell2xyInt(hbin) +} + +\keyword{dplot} +\keyword{misc} diff --git a/man/hdiffplot.Rd b/man/hdiffplot.Rd new file mode 100644 index 0000000..3461019 --- /dev/null +++ b/man/hdiffplot.Rd @@ -0,0 +1,134 @@ +\name{hdiffplot} +\alias{hdiffplot} +\title{Plot of Domain and Median Differences of Two "hexbin" Objects} +\description{ + Let \code{bin1} and \code{bin2} represent two \code{\link{hexbin}} + objects with scaling, plot shapes, and bin sizes. This plot + distinguishes cells unique to \code{bin1}, cells in common, and cells + unique to \code{bin2} using color. When the erode components are + present, color also distinguishes the two erosion medians. An arrow + shows the vector from the median of \code{bin1} to the median of + \code{bin2}. +} +\usage{ +hdiffplot(bin1, bin2 = NULL, xbnds, ybnds, + focus = NULL,% if(is.null(bin2)) 1:length(bin1) else c(1, 2), + col.control = list(medhex = "white", med.bord = "black", + focus = NULL, focus.border = NULL, back.col = "grey"), + arrows = TRUE, size = unit(0.1, "inches"), lwd = 2, + eps = 1e-6, unzoom = 1.08, clip="off", xlab = "", ylab = "", + main = deparse(mycall), \dots) +} + +\arguments{ + \item{bin1, bin2}{two objects of class \code{\link{hexbin}}.} + \item{xbnds,ybnds}{global x- and y-axis plotting limits. Used + primarily for multiple comparison plots.} +%%%------- FIXME -------- + \item{focus}{a vector of integers specifying which hexbin objects + should be treated as focal. Excluded hexbins are treated as background.} + \item{col.control}{a list for detailed color control.}%% <<< FIXME + \item{arrows}{a logical indicating wheter or not to draw arrows + between the focal hexbin objects median cells.} +%not yet \item{density}{fill arguments to polygon} +%not yet \item{pen}{pen numbers for polgyon} + \item{border}{border arguments to polygon} + \item{size}{arrow type size in inches.} + \item{eps}{distance criteria for distinct medians} + \item{unzoom}{plot limit expansion factor when xbnds is missing} + \item{clip}{either 'on' or 'off' are the allowed arguments, when on + everything is clipped to the plotting region.} + \item{lwd}{Line width for arrows, ignored when \code{arrows=FALSE} or + when bins have no erosion component} + \item{xlab}{label for x-axis} + \item{ylab}{label for y-axis} + \item{main}{main title for the plot; automatically constructed by default.} + \item{\dots}{...............} +} + +% \value{ +% ((currently unspecified --- proposals are welcome))%% FIXME +% } + +\details{ + The hexbin objects for comparison, \code{bin1} and \code{bin2}, must + have the same plotting limits and cell size. The plot produces a + comparison overlay of the cells in the two objects. If external + global scaling is not supplied, the algorithm determines plotting + limits to increase resolution. For example, the objects may be the + result of the \code{\link{erode.hexbin}()} and include only high count cells + containing 50 of the counts. The density, border, and pen arguments + correspond to the polygon function calls for plotting six types of + cells. The cell types are respectively: + \tabular{l}{ + unique cells of bin1,\cr + joint cells,\cr + unique cells of bin2,\cr + median cell of bin1,\cr + median cell of bin2,\cr + median cell if identical.\cr + } + + The \code{erode} components of the hexbin objects must be present for the + medians to plot. The algorithm select a single cell for the median if + there are algorithmic ties. + +%% FIXME: no 'pen' argument anymore .. (?) + The \code{pen} numbers for types of cells start at Pen 2. Pen 1 is + presumed black. The suggested six additional colors are light blue, + light gray, light red, blue, red, and black. Carr (1991) shows an + example for black and white printing. That plot changes the six + colors to light gray, dark gray, white, black, black, and black. It + changes the 4th, 5th, and 6th argument of border to TRUE. It also + changes 4th, 5th and 6th argument of density to 0. In other words + cells in common do not show and medians cells appear as outlines. + + When \code{xbnds} is missing, the plot changes graphics parameters and + resets them. The function also zooms in based on the available data + to provide increased resolution. +} + +\references{ see in \code{\link{grid.hexagons}}.}%>> ./hexagons.Rd + +\seealso{ + \code{\link{hexbin}}, \code{\link{smooth.hexbin}}, \code{\link{erode.hexbin}}, + % MISSING: hthin, + \code{\link{hcell2xy}}, % \code{\link{hcell}}, + \code{\link{gplot.hexbin}}, + \code{\link{hboxplot}}, % \code{\link{hmatplot}}, + \code{\link{grid.hexagons}}, \code{\link{grid.hexlegend}}. +} +\examples{ +## Comparison of two bivariate boxplots +x1 <- rnorm(10000) +y1 <- rnorm(10000) +x2 <- rnorm(10000,mean=.5) +y2 <- rnorm(10000,mean=.5) +xbnds <- range(x1,x2) +ybnds <- range(y1,y2) + +bin1 <- hexbin(x1,y1,xbnds=xbnds,ybnds=ybnds) +bin2 <- hexbin(x2,y2,xbnds=xbnds,ybnds=ybnds) +erodebin1 <- erode.hexbin(smooth.hexbin(bin1)) +erodebin2 <- erode.hexbin(smooth.hexbin(bin2)) + +hdiffplot(erodebin1,erodebin2) + +## Compare *three* of them: -------------------- + +x3 <- rnorm(10000,mean=-1) +y3 <- rnorm(10000,mean=-.5) +xbnds <- range(x1,x2,x3) +ybnds <- range(y1,y2,y3) + +bin1 <- hexbin(x1,y1,xbnds=xbnds,ybnds=ybnds) +bin2 <- hexbin(x2,y2,xbnds=xbnds,ybnds=ybnds) +bin3 <- hexbin(x3,y3,xbnds=xbnds,ybnds=ybnds) +erodebin1 <- erode.hexbin(smooth.hexbin(bin1)) +erodebin2 <- erode.hexbin(smooth.hexbin(bin2)) +erodebin3 <- erode.hexbin(smooth.hexbin(bin3)) + +bnlst <- list(b1=erodebin1, b2=erodebin2, b3=erodebin3) +hdiffplot(bnlst) +} +\keyword{hplot} diff --git a/man/hexGraphPaper.Rd b/man/hexGraphPaper.Rd new file mode 100644 index 0000000..3da2c0c --- /dev/null +++ b/man/hexGraphPaper.Rd @@ -0,0 +1,66 @@ +\name{hexGraphPaper} +\alias{hexGraphPaper} +\alias{hgridcent} +\title{Create a Hexgon Grid} +\description{ + Creates a hexagon grid that can be added to a plot created with grid + graphics. +} +\usage{ +hexGraphPaper(hb, xbnds = NULL, ybnds = NULL, xbins = 30, shape = 1, + add = TRUE, fill.edges = 1, fill = 0, border = 1) + +hgridcent(xbins, xbnds, ybnds, shape, edge.add = 0) +} +\arguments{ + \item{hb}{a object of class \code{"hexbin"}, typically produced by + \code{\link{hexbin}(*)}.} + \item{xbnds, ybnds}{horizontal and vertical limits of the binning + region in x or y units respectively; must be numeric vector of + length 2.} + \item{xbins}{the number of bins partitioning the range of xbnds.} + \item{shape}{the \emph{shape} = yheight/xwidth of the plotting regions.} + \item{add}{a logical value indicating whether or not to add the grid + to the current plot.} + \item{fill.edges}{integer number of hexagons to add around the border} + \item{fill}{the fill color for the hexagons} + \item{border}{the color of the border of the hexagons} + \item{edge.add}{offset (typically \code{fill.edges} above) used in + \code{hgridcent}.} +} +\details{ + If a hexbin object is given then the parameters xbins and shape are + ignored. Different bounds can still be specified. The \code{fill.edges} + parameter should be an integer. \code{fill.edges} takes the current + grid and adds a layer of hexagons around the grid for each level of + fill. So for example if \code{fill.edges= 2} than the dimensions of + the grid would be \code{(i,j)+4}. + + \code{hgridcent()} is the utility function computing the resulting + list (see section \dQuote{Value}). + + \strong{WARNING! If using a hexVP be sure to set clip to "on", otherwise the + hexagon grid will bleed over the plot edges.} +} +\value{ + Invisibly returns a list with th following components + \item{x}{The x coordinates of the grid} + \item{y}{the y coordinates of the grid} + \item{dimen}{a vector of length 2 gining the rows and columns of the grid} + \item{dx}{the horizontal diameter of the hexagons} + \item{dy}{the vertical diameter of the hexagons} +} +\author{Nicholas Lewin-Koh} +\seealso{\code{\link{hcell2xy}}, \code{\link{hexpolygon}}, + \code{\link{grid.hexagons}}} +\examples{ + x <- rnorm(10000) + y <- rnorm(10000,x,x) + hbin <- hexbin(x,y) + hvp <- plot(hbin,type="n") + pushHexport(hvp$plot,clip="on") + hexGraphPaper(hbin,border=grey(.8)) + grid.hexagons(hbin) +} +\keyword{aplot} +\keyword{dplot} diff --git a/man/hexList.Rd b/man/hexList.Rd new file mode 100644 index 0000000..6438881 --- /dev/null +++ b/man/hexList.Rd @@ -0,0 +1,50 @@ +\name{hexList} +\alias{hexList} +\alias{hexbinList-class} +\alias{coerce,list,hexbinList-method} +\title{Conditional Bivariate Binning into Hexagon Cells } +\description{ + Creates a list of \code{\link{hexbin}} objects. Basic components are + a cell id and a count of points falling in each occupied cell. + Basic methods are \code{\link[methods]{show}()}, \code{plot()} %(\link{plot.hexbin}) + and \code{\link{summary}()}, but also \code{\link{erode}}. + % .. \code{\link{smooth.hexbin}} +} +\usage{ +hexList(x, y = NULL, given = NULL, xbins = 30, shape = 1, + xbnds = NULL, ybnds = NULL, xlab = NULL, ylab = NULL) +} +%- maybe also 'usage' for other objects documented here. +\arguments{ + \item{x}{ ~~Describe \code{x} here~~ } + \item{y}{ ~~Describe \code{y} here~~ } + \item{given}{ ~~Describe \code{given} here~~ } + \item{xbins}{ ~~Describe \code{xbins} here~~ } + \item{shape}{ ~~Describe \code{shape} here~~ } + \item{xbnds}{ ~~Describe \code{xbnds} here~~ } + \item{ybnds}{ ~~Describe \code{ybnds} here~~ } + \item{xlab}{ ~~Describe \code{xlab} here~~ } + \item{ylab}{ ~~Describe \code{ylab} here~~ } +} +\details{ + There is also a \code{\link[methods]{coerce}} method to produce + \code{hexbinList} objects from \code{\link{list}}s. + %% i.e., \code{as(list(....), "hexbinList")} should work +} +\value{ + + If it is a LIST, use + \item{comp1 }{Description of 'comp1'} + \item{comp2 }{Description of 'comp2'} + ... +} + +\author{Nicholas Lewin-Koh} +% \note{ ~~further notes~~ } + +\seealso{\code{\link{hexbin}}, \code{\link{hdiffplot}} } +\examples{ + +} +\keyword{dplot} +\keyword{misc} diff --git a/man/hexMA.loess.Rd b/man/hexMA.loess.Rd new file mode 100644 index 0000000..4f25d19 --- /dev/null +++ b/man/hexMA.loess.Rd @@ -0,0 +1,42 @@ +\name{hexMA.loess} +\alias{hexVP.loess} +\alias{hexMA.loess} +\title{Add Loess Fit to Hexplot } +\description{ + Fit a loess line using the hexagon centers of mass as the x and y + coordinates and the cell counts as weights. +} +\usage{ +hexMA.loess(pMA, span = 0.4, col = "red", n = 200) +hexVP.loess(hbin, hvp = NULL, span = 0.4, col = "red", n = 200) +} + +\arguments{ + \item{hbin}{an object of class \code{hexbin}, see \code{\link{hexbin}}.} + \item{hvp}{A \code{hexViewport} object.} + \item{pMA}{the list returned by \code{\link{plotMAhex}}.} + \item{span}{the parameter alpha which controls the degree of smoothing.} + \item{col}{line color for the loess fit.} + \item{n}{number of points at which the fit should be evaluated.} +} +\value{ + Returns invisibly the object associated with the loess fit. +} + +\author{Nicholas Lewin-Koh } + +\seealso{ \code{\link{hexVP.abline}}, \code{\link{plotMAhex}}, + \code{\link{gplot.hexbin}}, \code{\link{hexViewport}}; + \code{\link{loess}} +} +\examples{ + if(require(marray)){ + data(swirl) + %% the following had 'newpage = FALSE, ' -- why ?? + hb <- plotMAhex(swirl[,1], main = "M vs A plot with hexagons", legend=0) + hexVP.abline(hb$plot, h=0, col= gray(.6)) + hexMA.loess(hb) + } +} +\keyword{aplot} + diff --git a/man/hexTapply.Rd b/man/hexTapply.Rd new file mode 100644 index 0000000..159b624 --- /dev/null +++ b/man/hexTapply.Rd @@ -0,0 +1,58 @@ +\name{hexTapply} +\alias{hexTapply} + +\title{Apply function to data from each hexagon bin.} + +\description{ + A wrapper for tapply except that it operates with each hexagon bin + being the category. The function operates on the data associated on + the points from each bin. +} + +\usage{ +hexTapply(hbin, dat, FUN = sum, ..., simplify=TRUE) +} +\arguments{ + \item{hbin}{a object of class \code{"hexbin"}, typically produced by + \code{\link{hexbin}(*)}.} + \item{dat}{A vector of data the same length as \code{hbin@cID}} + \item{FUN}{the function to be applied. In the case of functions like + \code{+}, \code{\%*\%}, etc., the function name must be quoted. If + \code{FUN} is \code{NULL}, tapply returns a vector which can be used + to subscript the multi-way array \code{tapply} normally produces.} + \item{\dots}{optional arguments to \code{FUN}.} + \item{simplify}{If \code{FALSE}, \code{tapply} always returns an array + of mode \code{"list"}. If \code{TRUE} (the default), then if + \code{FUN} always returns a scalar, \code{tapply} returns an array + with the mode of the scalar.} +} +\details{ + This function is a wrapper for tapply, except that the cell id is + always the categorical variable. This function is specifically good for + adding variables to the cAtt slot of a hexbin object or for plotting + a third variable in a hexagon plot. See below for examples. +} + +\value{ + Returns a vector of the result of 'FUN' as in + \code{\link{tapply}}. See \code{\link{tapply}} for detailed + description of output. +} + +\author{Nicholas Lewin-Koh} +\seealso{ \code{\link{tapply}},\code{\link{hexbin}} } +\examples{ + data(NHANES) + hbin<-hexbin(log(NHANES$Diet.Iron+1),log(NHANES$BMI),xbins=25,IDs=TRUE) + hvp<-plot(hbin) + mtrans<-hexTapply(hbin,NHANES$Transferin,median,na.rm=TRUE) + pushHexport(hvp$plot.vp) + grid.hexagons(hbin,style='lattice',pen=0,border='red',use.count=FALSE, +cell.at=mtrans) + + + +} +\keyword{dplot} +\keyword{utilities}% at least one, from doc/KEYWORDS + diff --git a/man/hexVP-class.Rd b/man/hexVP-class.Rd new file mode 100644 index 0000000..5c7041e --- /dev/null +++ b/man/hexVP-class.Rd @@ -0,0 +1,71 @@ +\name{hexVP-class} +\docType{class} +\alias{hexVP-class} +\alias{getFig,hexVP-method} +\alias{getMargins,hexVP-method} +\alias{getPlt,hexVP-method} +\alias{getXscale,hexVP-method} +\alias{getYscale,hexVP-method} + +\title{Formal class "hexVP" of a Hexagon Viewport} +\description{ + Hexagon Viewports are \dQuote{value-added} grid viewports (see + \code{\link[grid]{viewport}}) where the extra slots contain scaling and + \dQuote{embedding} information. A hexViewport is created my taking the + available area in the cuurent viewport on the graphics device and + maximizing the amount of area with a fied aspect ratio. The default + when the shape parameter is 1, is a 1:1 aspect ratio in terms of the + size of the viewport, not the scale of the x and y axis. The plotting + area is centered within the existing margins and the maximum size + determined. Extra area is then allocated to the margins. This viewport + is replicated twice, once with clipping set to "on" and once with + clipping "off". This feature can be used for toggling clipping on and + off while editing the plot. +} +\section{Objects from the Class}{ + Objects are typically created by calls to \code{\link{hexViewport}()} + or by low level calls of the form \code{new("hexVP", ...)}. +} +\section{Slots}{ + \describe{ + \item{\code{hexVp.off}:}{Object of class \code{"viewport"} with + clipping set to off, see \code{\link[grid]{viewport}}.} + \item{\code{hexVp.off}:}{Object of class \code{"viewport"}, with the same + dimensions and parameters as hexVp.off, but with + clipping set to on, see \code{\link[grid]{viewport}}.} + \item{\code{mar}:}{\code{\link[grid]{unit}} vector of four margins + (typically in \code{"lines"}).} + \item{\code{fig}:}{\code{\link[unit]{unit}} vector of two figure sizes + (typically in \code{"npc"}).} + \item{\code{plt}:}{\code{\link[grid]{unit}} vector of two figure sizes + (typically in \code{"npc"}).} + %% MM {FIXME?}: Is n't this simply ``xlim'' - then call it so! + %% NL, yes it is, but xscale and yscale is the parameters used by grid. + \item{\code{xscale}:}{numeric of length two specifying x-range.} + \item{\code{yscale}:}{numeric of length two specifying y-range.} + } +} +\section{Methods}{ + These are methods accessing the slots of corresponding name. + \describe{ + \item{getFig}{\code{signature(hvp = "hexVP")}: ... } + \item{getMargins}{\code{signature(hvp = "hexVP")}: ... } + \item{getPlt}{\code{signature(hvp = "hexVP")}: ... } + \item{getXscale}{\code{signature(hvp = "hexVP")}: ... } + \item{getYscale}{\code{signature(hvp = "hexVP")}: ... } + } +} +\author{ + Nicholas Lewin-Koh \email{kohnicho@comp.nus.edu.sg}. +} +\seealso{ + The constructor function \code{\link{hexViewport}}. + \code{\link{hexbin}}, and its S4 plotting method, + \code{\link{gplot.hexbin}}. +} +\examples{ + example(hexViewport, echo=FALSE) + ## continued: + str(P$plot.vp) +} +\keyword{classes} diff --git a/man/hexVP.abline.Rd b/man/hexVP.abline.Rd new file mode 100644 index 0000000..2873760 --- /dev/null +++ b/man/hexVP.abline.Rd @@ -0,0 +1,47 @@ +\name{hexVP.abline} +\alias{hexVP.abline} +\title{Add a Straight Line to a HexPlot} +\description{ + This function adds one or more straight lines through the current + plot; it is the hexbin version of \code{\link[graphics]{abline}()}. +} +\usage{ +hexVP.abline(hvp, a = NULL, b = NULL, h = numeric(0), v = numeric(0), + col = "black", lty = 1, lwd = 2, \dots) +} +\arguments{ + \item{hvp}{A hexViewport object that is currently on the active device} + \item{a,b}{the intercept and slope or if \code{b} is \code{NULL}, + an \code{lm} object or a vector of length 2 with + \code{c(intercept,slope)}} + \item{h}{the y-value for a horizontal line.} + \item{v}{the x-value for a vertical line.} + \item{col, lty, lwd}{line color, type and width.} + \item{\dots}{further graphical parameters.} +} +\details{ + The first form specifies the line in intercept/slope form + (alternatively \code{a} can be specified on its own and is taken to + contain the slope and intercept in vector form). + + The \code{h=} and \code{v=} forms draw horizontal and vertical + lines at the specified coordinates. + + The \code{coef} form specifies the line by a vector containing the + slope and intercept. + + \code{lm} is a regression object which contains \code{reg$coef}. If it is + of length 1 then the value is taken to be the slope of a line + through the origin, otherwise, the first 2 values are taken to be + the intercept and slope. +} +\author{Nicholas Lewin-Koh} + +\seealso{\code{\link{gplot.hexbin}}, \code{\link{hexViewport}}, + \code{\link{hexMA.loess}} +} +\examples{ +%% FIXME: add some +} +\keyword{aplot} + diff --git a/man/hexViewport.Rd b/man/hexViewport.Rd new file mode 100644 index 0000000..a1956cc --- /dev/null +++ b/man/hexViewport.Rd @@ -0,0 +1,56 @@ +\name{hexViewport} +\alias{hexViewport} +\title{Compute a Grid Viewport for Hexagon / Hexbin Graphics} +\description{ + Builds a \code{grid} viewport for hexagon or \code{\link{hexbin}} + graphics. This builds on the concepts of the \pkg{grid} package, + see \code{\link[grid]{viewport}}. +} +\usage{% see ../R/hexViewport.R +hexViewport(x, offset = unit(0,"inches"), mar = NULL, + xbnds = NULL, ybnds = NULL, newpage = FALSE, + clip = "off", vp.name = NULL) +} +\arguments{ + \item{x}{a \code{\link{hexbin}} object.} + \item{offset}{a \code{\link[grid]{unit}} object.} + \item{mar}{margins as \code{\link[grid]{unit}}s, of length 4 or 1.} + \item{xbnds, ybnds}{bounds for x- and y- plotting range; these default + to the corresponding slots of \code{x}.} + \item{newpage}{logical indicating if a new graphics page should be + openend, i.e., \code{\link[grid]{grid.newpage}()}.} + \item{clip}{simply passed to \code{\link[grid]{viewport}()}.} + \item{vp.name}{name of viewport; defaults to random name.} +} +\details{ + %... +} +\value{ + an S4 object of class \code{"hexVP"}, see \link{hexVP-class} for more, + with its main slot \code{hexVp} a \code{\link[grid]{viewport}} for grid graphics. +} + +\seealso{\code{\link[grid]{viewport}} and the main + \emph{\dQuote{handlers}} \code{\link{pushHexport}} and + \code{\link[grid]{popViewport}}; further + \code{\link{gplot.hexbin}} and \code{\link{hboxplot}} which build on + \code{hexViewport}. +} +\examples{ +set.seed(131) +x <- rnorm(7777) +y <- rt (7777, df=3) + +## lower resolution binning and overplotting with counts +bin <- hexbin(x,y,xbins=25) +P <- plot(bin) +xy <- hcell2xy(bin) +pushHexport(P$plot.vp) +i <- bin@count <= 3 +grid.text(as.character(bin@count[i]), xy$x[i], xy$y[i], + default.units = "native") +grid.points(x[1:20],y[1:20]) # to show some points rather than counts +popViewport() +} +\keyword{hplot}% ? +\keyword{aplot} diff --git a/man/hexbin.Rd b/man/hexbin.Rd new file mode 100644 index 0000000..293abe6 --- /dev/null +++ b/man/hexbin.Rd @@ -0,0 +1,110 @@ +\name{hexbin} +\title{Bivariate Binning into Hexagon Cells} +\alias{hexbin} +\alias{hexbin-class} +\alias{integer or NULL-class} +\alias{show,hexbin-method} +\alias{summary,hexbin-method} +\description{ + Creates a \code{"hexbin"} object. Basic components are a cell id and + a count of points falling in each occupied cell. + + Basic methods are \code{\link[methods]{show}()}, \code{plot()} %(\link{plot.hexbin}) + and \code{\link{summary}()}, but also \code{\link{erode}}. + % .. \code{\link{smooth.hexbin}} +} +\usage{ +hexbin(x, y, xbins = 30, shape = 1, + xbnds = range(x), ybnds = range(y), + xlab = NULL, ylab = NULL, IDs = FALSE) +} +\arguments{ + \item{x, y}{vectors giving the coordinates of the bivariate data + points to be binned. Alternatively a single plotting structure can + be specified: see \code{\link[grDevices]{xy.coords}}. \code{\link{NA}}'s are + allowed and silently omitted.} + \item{xbins}{the number of bins partitioning the range of xbnds.} + \item{shape}{the \emph{shape} = yheight/xwidth of the plotting regions.} + \item{xbnds, ybnds}{horizontal and vertical limits of the binning + region in x or y units respectively; must be numeric vector of length 2.} + \item{xlab, ylab}{optional character strings used as labels for + \code{x} and \code{y}. If \code{NULL}, sensible defaults are used.} + \item{IDs}{logical indicating if the individual cell \dQuote{IDs} + should be returned, see also below.} +} +\value{ + an S4 object of class \code{"hexbin"}. + It has the following slots: + \item{cell}{vector of cell ids that can be mapped into the (x,y) + bin centers in data units.} + \item{count}{vector of counts in the cells.} + \item{xcm}{The x center of mass (average of x values) for the cell.} + \item{ycm}{The y center of mass (average of y values) for the cell.} + \item{xbins}{ number of hexagons across the x axis. hexagon inner + diameter =diff(xbnds)/xbins in x units} + \item{shape}{plot shape which is yheight(inches) / xwidth(inches)} + \item{xbnds}{x coordinate bounds for binning and plotting} + \item{ybnds}{y coordinate bounds for binning and plotting} + \item{dimen}{The i and j limits of cnt treated as a matrix cnt[i,j]} + \item{n}{number of (non NA) (x,y) points, i.e., \code{sum(* @count)}.} + \item{ncells}{number of cells, i.e., \code{length(* @count)}, etc} + \item{call}{the function call.} + \item{xlab, ylab}{character strings to be used as axis labels.} + \item{cID}{of class, \code{"integer or NULL"}, only if \code{IDs} + was true, an integer vector of length \code{n} where + \code{cID[i]} is the cell number of the i-th original point + \code{(x[i], y[i])}. Consequently, the \code{cell} and \code{count} + slots are the same as the \code{\link{names}} and entries of + \code{table(cID)}, see the example.} +} + +\seealso{ + \code{\link{hcell2xy}}%, \code{\link{hcell}}, +% FIXME + \code{\link{gplot.hexbin}},% \code{\link{hboxplot}}, +% \code{\link{hdiffplot}}, \code{\link{hmatplot}}, + \code{\link{grid.hexagons}}, \code{\link{grid.hexlegend}}. +} + +\references{ + Carr, D. B. et al. (1987) + Scatterplot Matrix Techniques for Large \eqn{N}. + \emph{JASA} \bold{83}, 398, 424--436. +} + +\details{ + Returns counts for non-empty cells only. The plot shape must be maintained for + hexagons to appear with equal sides. Some calculations are in single + precision. + + Note that when plotting a \code{hexbin} object, the + \pkg{grid} package is used. + You must use its graphics (or those from package \pkg{lattice} if you + know how) to add to such plots. +} + +\examples{ +set.seed(101) +x <- rnorm(10000) +y <- rnorm(10000) +(bin <- hexbin(x, y)) +## or +plot(hexbin(x, y + x*(x+1)/4), + main = "(X, X(X+1)/4 + Y) where X,Y ~ rnorm(10000)") + +## Using plot method for hexbin objects: +plot(bin, style = "nested.lattice") + +hbi <- hexbin(y ~ x, xbins = 80, IDs= TRUE) +str(hbi) +tI <- table(hbi@cID) +stopifnot(names(tI) == hbi@cell, + tI == hbi@count) + +## NA's now work too: +x[runif(6, 0, length(x))] <- NA +y[runif(7, 0, length(y))] <- NA +hbN <- hexbin(x,y) +summary(hbN) +} +\keyword{dplot} diff --git a/man/hexbinplot.Rd b/man/hexbinplot.Rd new file mode 100644 index 0000000..fe0b5a2 --- /dev/null +++ b/man/hexbinplot.Rd @@ -0,0 +1,222 @@ +\name{hexbinplot} +\alias{hexbinplot} +\alias{hexbinplot.formula} +\alias{panel.hexbinplot} +\alias{prepanel.hexbinplot} +\alias{hexlegendGrob} +\title{Trellis Hexbin Displays} +\description{ + + Display of hexagonally binned data, as implemented in the + \code{hexbin} packge, under the Trellis framework, with associated + utilities. \code{hexbinplot} is the high level generic function, with + the \code{"formula"} method doing the actual work. + \code{prepanel.hexbinplot} and \code{panel.hexbinplot} are associated + prepanel and panel functions. \code{hexlegendGrob} produces a + suitable legend. + +} +\usage{ + +hexbinplot(x, data, \dots) + +\method{hexbinplot}{formula}(x, data = NULL, + prepanel = prepanel.hexbinplot, + panel = panel.hexbinplot, + groups = NULL, + aspect = "xy", + trans = NULL, + inv = NULL, + colorkey = TRUE, + \dots, + maxcnt, + legend = NULL, + legend.width = TRUE, + subset) + +prepanel.hexbinplot(x, y, type = character(0), \dots) + +panel.hexbinplot(x, y, ..., groups = NULL) + +hexlegendGrob(legend = 1.2, + inner = legend / 5, + cex.labels = 1, + cex.title = 1.2, + style = "colorscale", + minarea = 0.05, maxarea = 0.8, + mincnt = 1, maxcnt, + trans = NULL, inv = NULL, + colorcut = seq(0, 1, length = 17), + density = NULL, border = NULL, pen = NULL, + colramp = function(n) { LinGray(n,beg = 90,end = 15) }, + \dots, + vp = NULL, + draw = FALSE) + + +} +\arguments{ + \item{x}{ For \code{hexbinplot}, the object on which method dispatch + is carried out. + + For the \code{"formula"} methods, a formula describing the form of + conditioning plot. Formulas that are valid for \code{xyplot} are + acceptable. + + In \code{panel.hexbinplot}, the x variable. + } + \item{y}{ In \code{panel.hexbinplot}, the y variable. } + + \item{data}{For the \code{formula} method, a data frame containing + values for any variables in the formula, as well as \code{groups} + and \code{subset} if applicable (using \code{groups} currently + causes an error with the default panel function). By default, the + environment where the function was called from is used. } + + \item{minarea, maxarea, mincnt, maxcnt, trans, inv, colorcut, density, + border, pen, colramp, style}{ see + \code{\link[hexbin:gplot.hexbin]{gplot.hexbin}} } + + \item{prepanel, panel, aspect}{ See + \code{\link[lattice]{xyplot}}. \code{aspect="fill"} is not + allowed. The current default of \code{"xy"} may not always be the + best choice, often \code{aspect=1} will be more reasonable. } + + \item{colorkey}{logical, whether a legend should be drawn. Currently + a legend can be drawn only on the right. } + + \item{legend.width, legend}{ width of the legend in inches when + \code{style} is \code{"nested.lattice"} or + \code{"nested.centroids"}. The name \code{legend.width} is used to + avoid conflict with the standard trellis argument \code{legend}. It + is possible to specify additional legends using the \code{legend} or + \code{key} arguments as long as they do not conflict with the + hexbin legend (i.e., are not on the right). } + + \item{inner}{ Inner radius in inches of hexagons in the legend when + \code{style} is \code{"nested.lattice"} or + \code{"nested.centroids"}. } + + \item{cex.labels, cex.title}{ in the legend, multiplier for numeric + labels and text annotation respectively } + + \item{type}{ character vector controlling additional augmentation of + the display. A \code{"g"} in \code{type} adds a reference grid, + \code{"r"} adds a regression line (y on x), \code{"smooth"} adds a + loess smooth } + \item{draw}{ logical, whether to draw the legend grob. Useful when + \code{hexlegendGrob} is used separately } + \item{vp}{ grid viewport to draw the legend in } + + \item{\dots}{ extra arguments, passed on as appropriate. Arguments to + \code{\link[hexbin:gplot.hexbin]{gplot.hexbin}}, + \code{\link[lattice]{xyplot}}, \code{panel.hexbinplot} and + \code{hexlegendGrob} can be supplied to the high level + \code{hexbinplot} call. + + \code{panel.hexbinplot} calls one of two (unexported) low-level + functions depending on whether \code{groups} is supplied (although + specifying \code{groups} currently leads to an error). Arguments of + the appropriate function can be supplied; some important ones are + + \describe{ + + \item{\code{xbins}:}{ number of hexagons covering x values. The + number of y-bins depends on this, the aspect ratio, and + \code{xbnds} and \code{ybnds}} + + \item{\code{xbnds, ybnds}:}{ Numeric vector specifying range of + values that should be covered by the binning. In a multi-panel + display, it is not necessarily a good idea to use the same + bounds (which along with \code{xbins} and the aspect ratio + determine the size of the hexagons) for all panels. For + example, when data is concentrated in small subregions of + different panels, more detail will be shown by using smaller + hexagons covering those regions. To control this, \code{xbnds} + and \code{ybnds} can also be character strings \code{"panel"} or + \code{"data"} (which are not very good names and may be changed + in future). In the first case, the bounds are taken to be the + limits of the panel, in the second case, the limits of the data + (packet) in that panel. Note that all panels will have the same + limits (enough to cover all the data) by default if + \code{relation="free"} in the standard trellis argument + \code{scales}, but not otherwise.} + + } + + } + + \item{groups}{ in \code{hexbinplot}, a grouping variable that is + evaluated in \code{data}, and passed on to the panel function. } + + \item{subset}{ an expression that is evaluated in evaluated in + \code{data} to produce a logical vector that is used to subset the + data before being used in the plot. } + +} +\details{ + + The panel function \code{panel.hexbinplot} creates a hexbin object + from data supplied to it and plots it using + \code{\link[hexbin:grid.hexagons]{grid.hexagons}}. To make panels + comparable, all panels have the same \code{maxcnt} value, by default + the maximum count over all panels. This default value can be + calculated only if the aspect ratio is known, and so + \code{aspect="fill"} is not allowed. The default choice of aspect + ratio is different from the choice in \code{hexbin} (namely, + \code{1}), which may sometimes give better results for multi-panel + displays. \code{xbnds} and \code{ybnds} can be numeric range vectors + as in \code{hexbin}, but they can also be character strings specifying + whether all panels should have the same bins. If they are not, then + bins in different panels could be of different sizes, in which case + \code{style="lattice"} and \code{style="centroids"} should be + interpreted carefully. + + + The dimensions of the legend and the size of the hexagons therein are + given in absolute units (inches) by \code{legend.width} and + \code{inner} only when \code{style} is \code{"nested.lattice"} or + \code{"nested.centroids"}. For other styles, the dimensions of the + legend are determined relative to the plot. Specifically, the height + of the legend is the same as the height of the plot (the panel and + strip regions combined), and the width is the minimum required to fit + the legend in the display. This is different in some ways from the + \code{hexbin} implementation. In particular, the size of the hexagons + in the legend are completely unrelated to the sizes in the panels, + which is pretty much unavoidable because the sizes need not be the + same across panels if \code{xbnds} or \code{ybnds} is \code{"data"}. + The size of the hexagons encode information when \code{style} is + \code{"lattice"} or \code{"centroids"}, consequently a warning is + issued when a legend is drawn with wither of these styles. + +} + +\value{ + \code{hexbinplot} produces an object of class \code{"trellis"}. The + code{update} method can be used to update components of the object and + the \code{print} method (usually called by default) will plot it on an + appropriate plotting device. \code{hexlegendGrob} produces a + \code{"grob"} (grid object). + +} +\author{ Deepayan Sarkar \email{deepayan@stat.wisc.edu}} +\seealso{ + \code{\link{hexbin}}, \code{\link[lattice]{xyplot}} +} + +\examples{ +mixdata <- + data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)), + y = c(rnorm(5000),rnorm(5000,2,3)), + a = gl(2, 5000)) +hexbinplot(y ~ x, mixdata, aspect = 1, + trans = sqrt, inv = function(x) x^2) +hexbinplot(y ~ x | a, mixdata) +hexbinplot(y ~ x | a, mixdata, style = "lattice", + xbnds = "data", ybnds = "data") +hexbinplot(y ~ x | a, mixdata, style = "nested.centroids") +hexbinplot(y ~ x | a, mixdata, style = "nested.centroids", + border = FALSE, type = c("g", "smooth")) +} + +\keyword{dplot} diff --git a/man/hexplom.Rd b/man/hexplom.Rd new file mode 100644 index 0000000..dec71f6 --- /dev/null +++ b/man/hexplom.Rd @@ -0,0 +1,95 @@ +\name{hexplom} +\title{Hexbin Plot Matrices} +\alias{hexplom} +\alias{hexplom.formula} +\alias{hexplom.data.frame} +\alias{hexplom.matrix} +\alias{panel.hexplom} + +\usage{ +hexplom(x, data, \dots) + +\method{hexplom}{formula}(x, data = NULL, \dots) + +\method{hexplom}{data.frame}(x, data = NULL, \dots, groups = NULL, subset = TRUE) + +\method{hexplom}{matrix}(x, data = NULL, \dots, groups = NULL, subset = TRUE) + +panel.hexplom(\dots) +} + +\description{ + \code{hexplom} draws Conditional Hexbin Plot Matrices. It is similar + to \code{splom}, expect that the default display is different. + Specifically, the default display is created using + \code{panel.hexplom}, which is an alias for \code{panel.hexbinplot}. +} + +\arguments{ + \item{x}{ + The object on which method dispatch is carried out. + + For the \code{"formula"} method, a formula describing the structure + of the plot, which should be of the form \code{~ x | g1 * g2 * + \dots}, where \code{x} is a data frame or matrix. Each of \code{g1, + g2, \dots} must be either factors or shingles. The conditioning + variables \code{g1, g2, \dots} may be omitted. + + For the \code{data.frame} and \code{matrix} methods, a data frame or + matrix as appropriate. + } + \item{data}{ + For the \code{formula} method, an optional data frame in which + variables in the formula (as well as \code{groups} and + \code{subset}, if any) are to be evaluated. By default, the + environment where the function was called from is used. + } + + \item{groups, subset, \dots}{ see \code{\link[lattice]{splom}}. The + non-standard evaluation of \code{groups} and \code{subset} only + applies in the \code{formula} method. Apart from arguments that + apply to \code{splom} (many of which are only documented in + \code{\link[lattice]{xyplot}}), additional arguments meant for + \code{panel.hexplom} (which is an alias for + \code{\link{panel.hexbinplot}}) may also be supplied. Such + arguments may include ones that control details of the hexbin + calculations, documented in \code{\link{gplot.hexbin}}} + +} +\value{ + + An object of class \code{"trellis"}. The + \code{\link[lattice:update.trellis]{update}} method can be used to + update components of the object and the + \code{\link[lattice:print.trellis]{print}} method (usually called by + default) will plot it on an appropriate plotting device. + +} + +\seealso{ + \code{\link[lattice]{splom}}, \code{\link[lattice]{xyplot}}, + \code{\link[lattice]{hexbinplot}}, + \code{\link[lattice]{Lattice}}, \code{\link[lattice]{panel.pairs}} +} + +\author{ Deepayan Sarkar \email{Deepayan.Sarkar@R-project.org}, + Nicholas Lewin-Koh \email{nikko@hailmail.net}} + +\examples{ + +## Simple hexplom +data(NHANES) +hexplom(~NHANES[,7:14], xbins=15) + +## With colors and conditioning +hexplom(~NHANES[,9:13] | Sex, data = NHANES, + xbins = 15, colramp = magent) + +## With custom panel function +hexplom(NHANES[,9:13], xbins = 20,colramp = BTY, + upper.panel = panel.hexboxplot) + + +} +\keyword{hplot} + diff --git a/man/hexpolygon.Rd b/man/hexpolygon.Rd new file mode 100644 index 0000000..1c3a181 --- /dev/null +++ b/man/hexpolygon.Rd @@ -0,0 +1,77 @@ +\name{hexpolygon} +\alias{hexpolygon} +\alias{hexcoords} +\title{Hexagon Coordinates and Polygon Drawing} +\description{ + Simple \sQuote{low-level} function for computing and drawing hexagons. + Can be used for \sQuote{grid} (package \pkg{grid}) or + \sQuote{traditional} (package \pkg{graphics}) graphics. +} +\usage{ +hexcoords(dx, dy = NULL, n = 1, sep = NULL) + +hexpolygon(x, y, hexC = hexcoords(dx, dy, n = 1), dx, dy = NULL, + fill = 1, border = 0, hUnit = "native", ...) +} +\arguments{ + \item{dx,dy}{horizontal and vertical width of the hexagon(s).} + \item{n}{number of hexagon \dQuote{repeats}.} + \item{sep}{separator value to be put between coordinates of different + hexagons. The default, \code{NULL} doesn't use a separator.} + \item{x,y}{numeric vectors of the same length specifying the hexagon + \emph{centers} around which to draw.} + \item{hexC}{a list as returned from \code{hexcoords()}. + Its component \code{no.sep} determines if grid or traditional + graphics are used. The default (via default of \code{hexcoords}) is + now to use grid graphics.} + \item{fill,border}{passed to \code{\link[grid]{grid.polygon}} (for \pkg{grid}).} + \item{hUnit}{string or \code{NULL} determining in which units (x,y) + values are.} + \item{\dots}{further arguments passed to \code{\link{polygon}} (for + \pkg{graphics}).} +} +\value{ + \code{hexcoords()} returns a list with components + \item{x,y}{numeric vectors of length \eqn{n \times 6}{n * 6} (or + \eqn{n \times 7}{n * 7} if \code{sep} is not NULL) + specifying the hexagon polygon coordinates (with \code{sep} appended + to each 6-tuple).} + \item{no.sep}{a logical indicating if \code{sep} was \code{NULL}.} + + \code{hexpolygon} returns what its last \code{\link[grid]{grid.polygon}(.)} + or \code{\link{polygon}(.)} call returns. +} +\author{Martin Maechler, originally.} +\seealso{\code{\link{grid.hexagons}} which builds on these.} +\examples{ +str(hexcoords(1, sep = NA)) # multiple of (6 + 1) +str(hexcoords(1, sep = NULL))# no separator -> multiple of 6 +\dontshow{ +stopifnot(3 * (6+1) == sapply(hexcoords(2, n = 3, sep = NA)[1:2], length), + 6 == sapply(hexcoords(1)[1:2], length)) +set.seed(1001) +} + +## hexpolygon()s: +x <- runif(20, -2, 2) +y <- x + rnorm(20) + +## 1) traditional 'graphics' +plot(x,y, asp = 1, "plot() + hexpolygon()") +hexpolygon(x,y, dx = 0.1, density = 25, col = 2, lwd = 1.5) + +## 2) "grid" : + +addBit <- function(bnds, f = 0.05) bnds + c(-f, f) * diff(bnds) +sc <- addBit(rxy <- range(x,y))# same extents (cheating asp=1) +grid.newpage() +pushViewport(plotViewport(.1+c(4,4,2,1), xscale = sc, yscale = sc)) +grid.rect() +grid.xaxis() +grid.yaxis() +grid.points(x,y) +hexpolygon(x,y, hexcoords(dx = 0.1, sep=NULL), border = "blue", fill=NA) +popViewport() +} +\keyword{dplot} +\keyword{aplot} diff --git a/man/hsmooth-methods.Rd b/man/hsmooth-methods.Rd new file mode 100644 index 0000000..ee8185a --- /dev/null +++ b/man/hsmooth-methods.Rd @@ -0,0 +1,28 @@ +\name{hsmooth-methods} +\docType{methods}% + generic -- still use this doctype ? +\alias{hsmooth}% generic +\alias{hsmooth-methods} +\alias{hsmooth,hexbin-method} +\title{Hexagon Bin Smoothing: Generic hsmooth() and Methods} +\description{ + Methods for the generic function \code{hsmooth} in package + \pkg{hexbin}: + There is currently only the one for \code{\link{hexbin}} objects. +} +\usage{ +\S4method{hsmooth}{hexbin}(bin, wts) +} +\arguments{ + \item{bin}{a \code{\link{hexbin}} object, or an extension such as + \code{\link{erodebin-class}}.} + \item{wts}{weights vector, see \code{\link{smooth.hexbin}}} +} +\section{Methods}{ + \describe{ + \item{bin = "hexbin"}{is just the \code{\link{smooth.hexbin}} + function (for back compatibility); see its documentation, also for + examples.} + } +} +\keyword{methods} + diff --git a/man/inout.hex.Rd b/man/inout.hex.Rd new file mode 100644 index 0000000..307e051 --- /dev/null +++ b/man/inout.hex.Rd @@ -0,0 +1,31 @@ +\name{inout.hex} +\alias{inout.hex} +\title{Check points for inclusion} +\description{ + Check which points are in hexagons with \code{count} <= mincnt. +} +\usage{ +inout.hex(hbin, mincnt) +} + +\arguments{ + \item{hbin}{an object of class \code{\link{hexbin}}.} + \item{mincnt}{Cutoff, id's for counts less than mincnt are returned} +} +\details{ + Check which points are in hexagons with \code{count} <= mincnt and + returns the row ids for those points. One can use the ids to plot low + ount hexagons as points instead. +} +\value{ + A vector with the row ids of points which fall in hexagons with + \code{count} less than or equal to mincnt +} + +\author{Nicholas Lewin-Koh} + + +\seealso{\code{\link{plotMAhex}}} + +\keyword{misc} + diff --git a/man/list2hexList.Rd b/man/list2hexList.Rd new file mode 100644 index 0000000..ab40823 --- /dev/null +++ b/man/list2hexList.Rd @@ -0,0 +1,25 @@ +\name{list2hexList} +\alias{list2hexList} +\title{Convert list to hexList} +\description{ + Converts a list of hexbin objects with same xbnds, ybnds, shape and + xbins to a \code{\link{hexList}} object. +} +\usage{ +list2hexList(binlst) +} +\arguments{ + \item{binlst}{A list of hexbin objects} +} + +\value{ + a \code{\link{hexList}} object +} + +\author{Nicholas Lewin-Koh} + + +\seealso{\code{\link{hexList}},\code{\link{hdiffplot}} } + +\keyword{misc} + diff --git a/man/old-classes.Rd b/man/old-classes.Rd new file mode 100644 index 0000000..efec494 --- /dev/null +++ b/man/old-classes.Rd @@ -0,0 +1,24 @@ +\name{old-classes} +\title{Class "unit" and "viewport" as S4 classes} +% +\docType{class} +\alias{unit-class} +\alias{viewport-class} +% +\description{Package "hexbin" now uses S4 classes throughout and hence + needs to \code{\link[methods]{setOldClass}} both \code{"unit"} and + \code{"viewport"} (which are S3 classes from the \pkg{grid} package), + in order to be able to use those in slots of its own classes. +} +\section{Objects from the Class}{A virtual Class: No objects may be + created from it.} +\section{Extends}{ + Class \code{"oldClass"}, directly. +} +\section{Methods}{ + No methods defined with class "unit" in the signature. +} +% \seealso{ +% add link to grid ?? +% } +\keyword{classes} diff --git a/man/optShape.Rd b/man/optShape.Rd new file mode 100644 index 0000000..973d950 --- /dev/null +++ b/man/optShape.Rd @@ -0,0 +1,49 @@ +\name{optShape} +\alias{optShape} +%- Also NEED an '\alias' for EACH other topic documented here. +\title{Optimal Shape Parameter for Hexbin Viewport} +\description{ + Takes a viewport or a given height and width and returns the shape + parameter that will fill the specified plotting region with the + appropriately shaped hexagons. If margins are specified the margins + are subtracted from height and width before the shape parameter is + specified. +} +\usage{ +optShape(vp, height = NULL, width = NULL, mar = NULL) +} +\arguments{ + \item{vp}{a \code{viewport} object, optional see details} + \item{height}{the height of the plotting region, can be numeric or units} + \item{width}{The width of the plotting region, can be numeric or units} + \item{mar}{A four element numeric or units vector describing the + margins in the order \code{c(bottom, left, top, right)}} +} +\value{ + a scalar numeric value specifiyng \code{shape}. +} +\author{Nicholas Lewin-Koh} +\section{Warning}{If a viewport is given as an argument it should + already be pushed on the graphics device or it will have null units + and a meaningless shape parameter will be returned. +} +\seealso{\code{\link{hexViewport}}, \code{\link{hexVP-class}}, + \code{\link{hexbin}}} +\examples{ +x <- rgamma(10000,.9) +m <- as.logical(rbinom(10000,1,.17)) +x[m] <- -x[m] +y <- rnorm(x,abs(x)) +vp <- plotViewport(xscale= range(x)+c(-.5,.5), + yscale= range(y)+c(-.5,.5), + default.units = "native") +grid.newpage() +pushViewport(vp) +grid.rect() +shape <- optShape(vp) +shape +hb <- hexbin(x,y,xbins=40,shape=shape) +grid.hexagons(hb,colramp=BTY) +} +\keyword{dplot} + diff --git a/man/panel.hexboxplot.Rd b/man/panel.hexboxplot.Rd new file mode 100644 index 0000000..870c566 --- /dev/null +++ b/man/panel.hexboxplot.Rd @@ -0,0 +1,49 @@ +\name{panel.hexboxplot} +\alias{panel.hexboxplot} +\title{Boxplot for hexbin lattice plot} +\description{ +A panel function to add a boxplot to a hexbin lattice plot. +} +\usage{ +panel.hexboxplot(x, y, xbins = 30, + xbnds = c("data", "panel"), ybnds = c("data", "panel"), + .prelim = FALSE, .cpl = current.panel.limits(), + .xlim = .cpl$xlim, .ylim = .cpl$ylim, + .aspect.ratio, type = character(0), cdfcut = 0.25, + shadow = 0.05, ..., check.erosion = TRUE) +} +\arguments{ + \item{x, y}{numeric vector or factor.} + \item{xbins}{the number of bins partitioning the range of xbnds.} + \item{xbnds, ybnds}{horizontal and vertical limits of the binning + region in x or y units respectively; must be numeric vector of + length 2.} + \item{.prelim, .cpl, .xlim, .ylim, .aspect.ratio}{for internal use.} + \item{type}{character vector controlling additional augmentation of + the display. A \code{"g"} in \code{type} adds a reference grid, an + \code{"hg"} adds a hexagonal grid.} + \item{cdfcut}{number in (0,1) indicating the confidence level for the + erosion limits. See \code{\link{erode.hexbin}} for more information.} + \item{shadow}{number in (0,1) indicating the confidence level for the + erosion limits of a boxplot shadow. See \code{\link{erode.hexbin}} + for more information.} + \item{\dots}{potential further arguments passed on.} + \item{check.erosion}{logical indicating only eroded points should be + used for \code{"erodebin"} objects; simply passed to + \code{\link{hcell2xy}}, see its documentation.} +} +\value{ + There is no return value from this function. The results are plotted on + the current active device. +} +\author{Nicholas Lewin-Koh \email{nikko@hailmail.net}} +\seealso{\code{\link{hexbinplot}}, \code{\link{panel.hexgrid}}, + \code{\link[lattice]{panel.boxplot}} +} +\examples{ +mixdata <- + data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)), + y = rep(1:2, 5000)) +hexbinplot(y ~ x, mixdata, panel = panel.hexboxplot) +} +\keyword{hplot} diff --git a/man/panel.hexgrid.Rd b/man/panel.hexgrid.Rd new file mode 100644 index 0000000..41ad9e7 --- /dev/null +++ b/man/panel.hexgrid.Rd @@ -0,0 +1,25 @@ +\name{panel.hexgrid} +\alias{panel.hexgrid} +\title{Hexagonal grid for a lattice plot} +\description{ +A panel function to add a hexagonal grid to a lattice plot. +} +\usage{ +panel.hexgrid(h, border = grey(0.85)) +} + +\arguments{ + \item{h}{an object of class \code{hexbin}.} + \item{border}{a color for the hexagon border colors} +} +\details{ +} +\value{ + There is no return value from this function. The results are plotted on + the current active device. +} +\author{Nicholas Lewin-Koh \email{nikko@hailmail.net}} +\seealso{\code{\link{hexbinplot}}, \code{\link{hexGraphPaper}}} +\examples{ +} +\keyword{hplot} diff --git a/man/panel.hexloess.Rd b/man/panel.hexloess.Rd new file mode 100644 index 0000000..bbf13d4 --- /dev/null +++ b/man/panel.hexloess.Rd @@ -0,0 +1,39 @@ +\name{panel.hexloess} +\alias{panel.hexloess} +\title{Loess line for hexbin lattice plot} +\description{ +A panel function to add a loess line to a hexbin lattice plot. +} +\usage{ +panel.hexloess(bin, w = NULL, span = 2/3, degree = 1, family = c("symmetric", "gaussian"), evaluation = 50, + lwd = add.line$lwd, lty = add.line$lty, col, col.line = add.line$col, \dots) +} +\arguments{ + \item{bin}{an object of class \code{hexbin}.} + \item{w}{optional counts for object \code{bin}.} + \item{span}{smoothness parameter for \code{loess}.} + \item{degree}{degree of local polynomial used.} + \item{family}{if \code{"gaussian"} fitting is by least-squares, and + if \code{"symmetric"} a re-descending M-estimator is used.} + \item{evaluation}{number of points at which to evaluate the smooth curve.} + \item{lwd}{line weight graphical parameter.} + \item{lty}{line type graphical parameter.} + \item{col}{same as \code{col.line}.} + \item{col.line}{line color graphical parameter.} + \item{\dots}{optional arguments to \code{\link[stats]{loess.control}}.} +} +\details{ +} +\value{ + There is no return value from this function. The results are plotted on + the current active device. +} +\author{Nicholas Lewin-Koh \email{nikko@hailmail.net}} +\seealso{ +\code{\link{hexbinplot}}, \code{\link{panel.hexgrid}}, +\code{\link[stats]{loess.smooth}}, \code{\link[stats]{loess.control}}, +\code{\link[lattice]{panel.loess}} +} +\examples{ +} +\keyword{hplot} diff --git a/man/plotMAhex.Rd b/man/plotMAhex.Rd new file mode 100644 index 0000000..04f4c13 --- /dev/null +++ b/man/plotMAhex.Rd @@ -0,0 +1,133 @@ +\name{plotMAhex} +\alias{plotMAhex} +\title{MA-plot using hexagon bins} +\description{ + Creates an MA-plot using hexagons with color/glyph coding for control spots. +} +\usage{ +plotMAhex(MA, array = 1, xlab = "A", ylab = "M", + main = colnames(MA)[array], xlim = NULL, ylim = NULL, + status = NULL, values, pch, col, cex, nbin = 40, + zero.weights = FALSE, style = "colorscale", legend = 1.2, + lcex = 1, minarea = 0.04, maxarea = 0.8, mincnt = 2, + maxcnt = NULL, trans = NULL, inv = NULL, colorcut = NULL, + border = NULL, density = NULL, pen = NULL, + colramp = function(n) { LinGray(n, beg = 90, end = 15) }, + newpage = TRUE, type = c("p", "l", "n"), + xaxt = c("s", "n"), yaxt = c("s", "n"), + verbose = getOption("verbose")) +} +\arguments{ + \item{MA}{an \code{RGList}, \code{MAList} or \code{MArrayLM} object, + or any list with components \code{M} containing log-ratios and + \code{A} containing average intensities. Alternatively a + \code{matrix}, \code{Affybatch} or \code{ExpressionSet} object.} + \item{array}{integer giving the array to be plotted. Corresponds to + columns of \code{M} and \code{A}.} + \item{xlab, ylab, main}{character strings giving label for x-axis, + y-axis or main tile of the plot.} + \item{xlim, ylim}{numeric vectors of length 2 giving limits for x-axis + (or y-axis respectively), defaulting to min and max of the data.} + \item{status}{character vector giving the control status of each spot + on the array, of same length as the number of rows of \code{MA$M}. + If omitted, all points are plotted in the default color, symbol and size.} + \item{values}{character vector giving values of \code{status} to be + highlighted on the plot. Defaults to unique values of \code{status}. + Ignored if there is no \code{status} vector.} + \item{pch}{vector or list of plotting characters. Default to integer code 16. + Ignored is there is no \code{status} vector.} + \item{col}{numeric or character vector of colors, of the same length + as \code{values}. Defaults to \code{1:length(values)}. Ignored if + there is no \code{status} vector.} + \item{cex}{numeric vector of plot symbol expansions, of the the same + length as \code{values}. Defaults to 0.2 for the most common status + value and 1 for the others. Ignored if there is no \code{status} vector.} + \item{nbin}{ ~~Describe \code{nbin} here~~ } %% << FIXME + \item{zero.weights}{logical, should spots with zero or negative + weights be plotted?} + \item{style}{string specifying the style of hexagon plot, + see \code{\link{grid.hexagons}} for the possibilities.} + \item{legend}{numeric width of the legend in inches of \code{FALSE}. + In the latter case, or when \code{0}, no legend is not produced.} + \item{lcex}{characters expansion size for the text in the legend.} + \item{minarea}{fraction of cell area for the lowest count.} + \item{maxarea}{fraction of the cell area for the largest count.} + \item{mincnt}{cells with fewer counts are ignored.} + \item{maxcnt}{cells with more counts are ignored.} + \item{trans}{\code{\link{function}} specifying a transformation for + the counts such as \code{sqrt}.} + \item{inv}{the inverse transformation of \code{trans}.} + \item{colorcut}{vector of values covering [0, 1] that determine + hexagon color class boundaries and hexagon legend size boundaries. + Alternatively, an integer (\code{<= maxcnt}) specifying the + \emph{number} of equispaced colorcut values in [0,1].} + \item{border, density, pen}{color for polygon borders and filling of + each hexagon drawn, passed to \code{\link{grid.hexagons}}.} + \item{colramp}{function accepting an integer \code{n} as an argument and + returning n colors.} + \item{newpage}{should a new page start?} + \item{type, xaxt, yaxt}{strings to be used (when set to \code{"n"}) for + suppressing the plotting of hexagon symbols, or the x- or y-axis, + respectively.} + \item{verbose}{logical indicating if some diagnostic output should happen.} +} + +\details{ + An MA-plot is a plot of log-intensity ratios (M-values) versus + log-intensity averages (A-values). If \code{MA} is an \code{RGList} or + \code{MAList} then this function produces an ordinary within-array + MA-plot. If \code{MA} is an \code{MArrayLM} object, then the plot is an + fitted model MA-plot in which the estimated coefficient is on the y-axis + and the average A-value is on the x-axis. + + If \code{MA} is a \code{matrix} or \code{ExpressionSet} object, then this + function produces a between-array MA-plot. In this case the A-values in + the plot are the average log-intensities across the arrays and the + M-values are the deviations of the log-intensities for the specified + array from the average. If there are more than five arrays, then the + average is computed robustly using medians. With five or fewer arrays, + it is computed by means. + + The \code{status} vector is intended to specify the control status of + each spot, for example "gene", "ratio control", "house keeping gene", + "buffer" and so on. The vector is usually computed using the function + \code{\link[limma]{controlStatus}} from package \pkg{limma} and a + spot-types file. However the function may be used to highlight any + subset of spots. + + The arguments \code{values}, \code{pch}, \code{col} and \code{cex} + can be included as attributes to \code{status} instead of being + passed as arguments to \code{plotMA}. + + See \code{\link[graphics]{points}} for possible values for \code{pch}, + \code{col} and \code{cex}. +} + +\value{ + A plot is created on the current graphics device. + and a list with the following items is returned invisibly: + \item{plot.vp}{the \code{\link{hexViewport}} constructed and used.} + \item{legend.vp}{if a legend has been produced, its + \code{\link[grid]{viewport}}.} + \item{hbin}{a \code{hexbin} object built with A as the x coordinate + and M as the y coordinate.} +} + +\references{See \url{http://www.statsci.org/micrarra/refs/maplots.html}} + +\author{Nicholas Lewin-Koh, adapted from code by Gordon Smyth} + +\seealso{\code{\link[limma]{plotMA}} from package \pkg{limma}, + and \code{\link{gplot.hexbin}}. +} + +\examples{ + if(require(marray)){ %% for the data only --> data(swirl, package="marray") + data(swirl) + hb <- plotMAhex(swirl[,1],newpage=FALSE, + main = "M vs A plot with hexagons", legend=0) + hexVP.abline(hb$plot.vp,h=0,col=gray(.6)) + hexMA.loess(hb) + } +} +\keyword{hplot} diff --git a/man/pushHexport.Rd b/man/pushHexport.Rd new file mode 100644 index 0000000..da4db31 --- /dev/null +++ b/man/pushHexport.Rd @@ -0,0 +1,28 @@ +\name{pushHexport} +\alias{pushHexport} +\title{Push a Hexagon Viewport ("hexVP")} +\description{ + Push a Hexagon Viewport (\code{"hexVP"}, see \link{hexVP-class}) on to + the tree of (grid) viewports, calling \code{\link[grid]{pushViewport}}. +} +\usage{ +pushHexport(hvp, clip = "off") +} +\arguments{ + \item{hvp}{a hexagon viewport, i.e., an object of class + \code{"hexVP"}, see \link{hexVP-class}, typically produced by + \code{\link{hexViewport}(..)}.} + \item{clip}{which viewport to push, either 'on' or 'off' are the + allowed arguments, see details.} +} +\seealso{the underlying \code{\link[grid]{pushViewport}} from the + \pkg{grid} package. +} +\details{ + A hexagon viewport (\code{"hexVP"}) object has slots for two replicate + viewports one with clipping turned on and one with clipping off. This + allows toggling the clipping option. +} +%\examples{ +%} +\keyword{dplot} diff --git a/man/smooth.hexbin.Rd b/man/smooth.hexbin.Rd new file mode 100644 index 0000000..92adc21 --- /dev/null +++ b/man/smooth.hexbin.Rd @@ -0,0 +1,84 @@ +\name{smooth.hexbin} +\alias{smooth.hexbin} +\alias{smoothbin-class} +\title{Hexagon Bin Smoothing} +\description{ + Given a \code{"hexbin"} (hexagon bin) object, compute a discrete + kernel smoother that covers seven cells, namely a center cell and its + six neighbors. With two iterations the kernel effectively covers + 1+6+12=19 cells. +} +\usage{ +smooth.hexbin(bin, wts=c(48,4,1)) +} +\arguments{ + \item{bin}{object of class \code{"hexbin"}, typically resulting from + \code{\link{hexbin}()} or \code{\link{erode,hexbin-method}}.} + \item{wts}{numeric vector of length 3 for relative weights of the + center, the six neighbor cells, and twelve second neighbors.} +} +\value{ + an object of class \code{"smoothbin"}, extending class + \code{"hexbin"}, see \code{\link{hexbin}}. + The object includes the additional slot \code{wts}. +} +\references{see \code{\link{grid.hexagons}} and \code{\link{hexbin}}.} + +\details{ + This discrete kernel smoother uses the center cell, immediate + neighbors and second neighbors to smooth the counts. The counts for + each resulting cell is a linear combination of previous cell counts + and weights. The weights are + \tabular{ll}{ + 1 center cell, \tab weight = wts[1]\cr + 6 immediate neighbors\tab weight = wts[2]\cr + 12 second neighbors \tab weight =wts[3]\cr + } + If a cell, its immediate and second neighbors all have a value of + \code{max(cnt)}, the new maximum count would be + \code{max(cnt)*sum(wts)}. It is possible for the counts to overflow. + + The domain for cells with positive counts increases. The hexbin + slots \code{xbins}, \code{xbnds}, \code{ybnds}, and \code{dimen} all + reflect this increase. + Note that usually \code{dimen[2] = xbins+1}. + + The intent was to provide a fast, iterated, immediate neighbor smoother. + However, the current hexbin plotting routines only support shifting + even numbered rows to the right. Future work can + + (1) add a shift indicator to hexbin objects that indicates left or + right shifting.\cr + (2) generalize plot.hexbin() and hexagons()\cr + (3) provide an iterated kernel.\cr + + With \code{wts[3]=0}, the smoother only uses the immediate neighbors. + With a shift indicator the domain could increase by 2 rows (one bottom + and on top) and 2 columns (one left and one right). However the current + implementation increases the domain by 4 rows and 4 columns, thus + reducing plotting resolution. +} + +\seealso{ + \code{\link{hexbin}}, \code{\link{erode.hexbin}}, %MISSING \code{\link{hthin}}, + \code{\link{hcell2xy}},% \code{\link{hcell}}, + \code{\link{gplot.hexbin}}, \code{\link{hboxplot}}, + %\code{\link{hdiffplot}}, \code{\link{hmatplot}}, + \code{\link{grid.hexagons}}, \code{\link{grid.hexlegend}}. +} +\examples{ +x <- rnorm(10000) +y <- rnorm(10000) +bin <- hexbin(x,y) +# show the smooth counts in gray level +smbin <- smooth.hexbin(bin) +plot(smbin, main = "smooth.hexbin(.)") + +# Compare the smooth and the origin +smbin1 <- smbin +smbin1@count <- as.integer(ceiling(smbin@count/sum(smbin@wts))) +plot(smbin1) +smbin2 <- smooth.hexbin(bin,wts=c(1,0,0)) # expand the domain for comparability +plot(smbin2) +} +\keyword{misc} diff --git a/src/hbin.f b/src/hbin.f new file mode 100644 index 0000000..00737b3 --- /dev/null +++ b/src/hbin.f @@ -0,0 +1,88 @@ + subroutine hbin(x,y,cell,cnt,xcm,ycm, size, shape, + * rx,ry, bnd, n, cellid) + +C Copyright 1991 +C Version Date: September 16, 1994 +C Programmer: Dan Carr +C Indexing: Left to right, bottom to top +C bnd(1) rows, bnd(2) columns +C Output: cell ids for non empty cells, revised bnd(1) + +c optionally also return cellid(1:n) +c Copyright (2004) Nicholas Lewin-Koh and Martin Maechler + + implicit none + + integer n, nc, cell(*), cnt(*), bnd(2), cellid(*) +c cellid(*): length 1 or n + double precision x(n), y(n), xcm(*),ycm(*), rx(2),ry(2), size + double precision shape + integer i, i1, i2, iinc + integer j1, j2, jinc + integer L, lmax, lat + double precision c1, c2, con1, con2, dist1 + double precision sx, sy, xmin, ymin, xr, yr + logical keepID + + keepID = (cellid(1) .eq. 0) +C_______Constants for scaling the data_____________________________ + + xmin = rx(1) + ymin = ry(1) + xr = rx(2)-xmin + yr = ry(2)-ymin + c1 = size/xr + c2 = size*shape/(yr*sqrt(3.)) + + jinc= bnd(2) + lat=jinc+1 + iinc= 2*jinc + lmax=bnd(1)*bnd(2) + con1=.25 + con2=1.0/3.0 + +C_______Binning loop________________________________________ + + do i=1,n + sx = c1 * (x(i) - xmin) + sy = c2 * (y(i) - ymin) + j1 = sx+.5 + i1 = sy+.5 + dist1=(sx-j1)**2 + 3.*(sy-i1)**2 + + if(dist1 .lt. con1) then + L=i1*iinc + j1+1 + elseif(dist1 .gt. con2) then + L=int(sy)*iinc + int(sx)+lat + else + j2 = sx + i2 = sy + if(dist1 .le. (sx-j2 -.5)**2 + 3.*(sy-i2 -.5)**2) then + L=i1*iinc+ j1+1 + else + L=i2*iinc+ j2+lat + endif + endif + + cnt(L)=cnt(L)+1 + if (keepID) cellid(i)=L + xcm(L)=xcm(L)+ (x(i)-xcm(L))/cnt(L) + ycm(L)=ycm(L)+ (y(i)-ycm(L))/cnt(L) + enddo + +C_______Compression of output________________________________________ + + nc=0 + do L=1,lmax + if(cnt(L) .gt. 0) then + nc=nc+1 + cell(nc)=L + cnt(nc)=cnt(L) + xcm(nc)=xcm(L) + ycm(nc)=ycm(L) + endif + enddo + n=nc + bnd(1)=(cell(nc)-1)/bnd(2)+1 + return + end diff --git a/src/hcell.f b/src/hcell.f new file mode 100644 index 0000000..2d6c78b --- /dev/null +++ b/src/hcell.f @@ -0,0 +1,62 @@ + subroutine hcell(x,y,cell,n,size,shape,rx,ry,bnd) +C Copyright 1991 +C Version Date: September 16, 1994 +C Programmer: Dan Carr +C Indexing: Left to right, bottom to top +C bnd(1) rows, bnd(2) columns +C Output: cell ids for none empty cells, revised bnd(1) + +c implicit none + integer n, cell(1), bnd(2) + double precision x(1), y(1), rx(2), ry(2), size, shape + integer i, i1, i2, iinc + integer j1, j2, jinc + integer L, lat, celmax + double precision c1, c2, con1, con2, dist1 + double precision sx, sy, xmin, ymin, xr, yr + +C_______Constants for scaling the data_____________________________ + + xmin = rx(1) + ymin = ry(1) + xr = rx(2)-xmin + yr = ry(2)-ymin + c1 = size/xr + c2 = size*shape/(yr*sqrt(3.)) + + jinc= bnd(2) + lat=jinc+1 + iinc= 2*jinc + con1=.25 + con2=1./3. + celmax=0 + +C_______Binning loop________________________________________ + + do i=1,n + sx = c1 * (x(i) - xmin) + sy = c2 * (y(i) - ymin) + j1 = sx+.5 + i1 = sy+.5 + dist1=(sx-j1)**2 + 3.*(sy-i1)**2 + + if(dist1.lt.con1)then + L=i1*iinc+j1+1 + elseif(dist1.gt.con2)then + L=int(sy)*iinc + int(sx)+lat + else + j2 = sx + i2 = sy + if( dist1.le.(sx-j2-.5)**2 + 3. * (sy - i2 -.5)**2) then + L=i1*iinc+j1+1 + else + L=i2*iinc+j2+lat + endif + endif + + cell(i)=L + celmax = max(celmax,L) + enddo + bnd(1)=(celmax-1)/bnd(2)+1 + return + end diff --git a/src/herode.f b/src/herode.f new file mode 100644 index 0000000..4945513 --- /dev/null +++ b/src/herode.f @@ -0,0 +1,245 @@ +C File: herode.f +C Version date: Jan 4, 1994 +C Programmer: Daniel B. Carr +C +C The vector erode returns the gray-level erosion order for hexagon cells. +C The erosion cycle is: +C cycle = (erode-1)/6 + 1 +C Many cells may be eroded in the same cycle +C A tie break is the cell count deficit at erosion time: +C deficit=erode - 6*cycle +C The last eroded cell might be considered a bivariate median +C +C The algorithm: +C Repeat until no cells are left in the list. +C Process list +C Reduce the cell counts by the a multiple of exposed sides +C If a cell count is zero or less after an erosion cycle +C let order=order + 6 +C report erode = order + cell count (count is <= 0) +C remove the cell from consideration +C update exposed side counts for existing neighbor cells +C if exposed sides was zero, temporarily store id's +C else +C compress list +C endif +C Add temporarily stored id's to list +C End Repeat + + subroutine herode(cell,cnt,n,bdim, + * erode,ncnt,ncell,sides,neib,exist) + +C +C + implicit none + + integer cell(1), cnt(1) ! cell id and count + integer n, bdim(2) ! number of cells and 2-D array bounds + integer erode(1) ! erosion status + integer ncell(1),ncnt(1) ! extracted id's and expanded counts + integer sides(1) ! number of exposed sides + integer neib(6,*) ! pointers to the neighbors + logical exist(0:*) ! cell existence + + integer nrow, ncol, Lmax ! dimensions + integer inc1(6), inc2(6) ! increments to get neighbors + integer i, icell, j, k, L ! subscripts + integer nc, nnc, nb, ninc, r, c !more subscripts + integer loop, order, maxcnt + + +C_______Zero cell ordering numbers________________________________ + + order=0 + +C_______Load the increment arrays and constants + + nrow = bdim(1) + ncol = bdim(2) + Lmax = nrow * ncol + nnc = n + +C______Load increment arrays to neigbors______________ +C +C order=right, up left, down left, up right, left, down right + + inc1(1)= 1 + inc1(2)= ncol-1 + inc1(3)= -ncol-1 + inc1(4)= ncol + inc1(5)=-1 + inc1(6)= -ncol + + inc2(1)= 1 + inc2(2)= ncol + inc2(3)= -ncol + inc2(4)= ncol+1 + inc2(5)=-1 + inc2(6)= -ncol+1 + + +c_______load working arrays_______________________________________________ + + do i=0,Lmax + exist(i)=.false. + enddo + + maxcnt=0 + do i=1,n + icell=cell(i) + ncnt(icell)=cnt(i) + exist(icell)=.true. + maxcnt=max(maxcnt,cnt(i)) + enddo + +C_______Store pointers to cell neighbors_________________________ +C +C A pointer of 0 means the neigbor in out of bounds +C Also find the max count +C Speed: Can avoid adding 1's to r and c +C but this code is easier to follow + do i=1,n + L=cell(i) + k = L -1 + r=k/ncol+1 + c=mod(k,ncol)+1 + if(mod(r,2).eq.1)then + do j = 1,6 + neib(j,L) = L + inc1(j) + enddo + + if (c .eq. 1) then + neib(2,L) = 0 + neib(3,L) = 0 + neib(5,L) = 0 + else if (c .eq. ncol) then + neib(1,L) = 0 + endif + + if (r .eq. 1) then + neib(3,L) = 0 + neib(6,L) = 0 + else if(r.eq.nrow)then + neib(2,L) = 0 + neib(4,L) =0 + endif + + else + do j= 1,6 + neib(j,L) = L + inc2(j) + enddo + + if (c .eq. 1) then + neib(5,L) = 0 + else if (c .eq. ncol) then + neib(1,L) = 0 + neib(4,L) = 0 + neib(6,L) = 0 + endif + + if (r .eq. nrow) then + neib(2,L) = 0 + neib(4,L) = 0 + endif + + endif + enddo + + +C_______Count exposed sides for cells in the contour_________________ + + do i=1,n + icell=cell(i) + sides(icell)=0 + do j=1,6 + if(.not. exist( neib(j,icell) ) )then + sides(icell)=sides(icell)+ 1 + endif + enddo + enddo + +C________Grab surface cells___________________________________________ + + nc=0 + do i=1,n + if(sides(cell(i)).gt.0)then + nc=nc+1 + ncell(nc)=cell(i) + endif + enddo + n=nc !n is now the number of exposed, non-empty cells + +C_______The outer loop________________________________________________ +C +C temporary indices +C nc: index for cells remaining on the list +C ninc: index for newly exposed cells added to back of list + + do while(n.gt.0) + +C Subtract exposed-side counts from the surface cell counts +C until at least one cell is empty. + + loop=maxcnt + do i=1,n + icell=ncell(i) + loop=min( (ncnt(icell)-1)/sides(icell) , loop) + enddo + loop=loop+1 !all loop values are 1 too small + +C update the counts, rank and remove eroded cells + + nc=0 + order=order+6 + ninc=n + do i=1,n + icell=ncell(i) + ncnt(icell)=ncnt(icell)-sides(icell)*loop + if(ncnt(icell).le.0)then + +C Remove the empty cell and store it's order + exist(icell)=.false. + erode(icell)=order+ncnt(icell) + +C Update the neighbors of the empty cell + do j=1,6 + nb=neib(j,icell) + if(exist(nb))then + +C Store cells for addition to surface list + if(sides(nb).eq.0)then + ninc=ninc+1 + ncell(ninc)=nb + endif + +C Update sides for the neighbors + sides(nb)=sides(nb)+1 + endif + enddo + else + +C Save remaining cells + nc=nc+1 + ncell(nc)=ncell(i) + endif + enddo + +C Add new surface cells if any + + do i=n+1,ninc,1 + nc=nc+1 + ncell(nc)=ncell(i) + enddo + n=nc + enddo + +C_______compress result___________________________________________ + + + do i=1,nnc + erode(i)=erode(cell(i)) + enddo + n=nnc + + return + end diff --git a/src/hsm.f b/src/hsm.f new file mode 100644 index 0000000..b282cc0 --- /dev/null +++ b/src/hsm.f @@ -0,0 +1,114 @@ +C File: hsm.f +C Programmer: Daniel B. Carr +C Version Date: January 3, 1994 +C +C This program is an hexagon cell smoother. It smooths into +C neighboring cells and hence expands. + +C The kernal is a crude integer kernel. +C The boundary hexagons get weight 1, the center hexagon +C gets weight, wt, which by default is set to six. +C +C + + subroutine hsm(cell,cnt,n,nmax,sm,ncol,wt) + + implicit none + + integer n, nmax, ncol + integer cell(*), cnt(*), sm(*), wt(*) + integer ind, ind1(6), ind2(12),ind3(6), ind4(12), loc + integer row, cnt1, cnt2, wta, wtb, wtc + integer i, j + +C__________Constants___________________________________________ + + ind1(1)=-1 + ind1(2)=ncol-1 + ind1(3)=ncol + ind1(4)=+1 + ind1(5)=-ncol + ind1(6)=-ncol-1 + + ind2(1)=-2 + ind2(2)=ncol-2 + ind2(3)=2*ncol-1 + ind2(4)=2*ncol + ind2(5)=2*ncol+1 + ind2(6)=ncol+1 + ind2(7)=2 + ind2(8)=-ncol+1 + ind2(9)=-2*ncol+1 + ind2(10)=-2*ncol + ind2(11)=-2*ncol-1 + ind2(12)=-ncol-2 + + ind3(1)=-1 + ind3(2)=ncol + ind3(3)=ncol+1 + ind3(4)=+1 + ind3(5)=-ncol+1 + ind3(6)=-ncol + + ind4(1)=-2 + ind4(2)=ncol-1 + ind4(3)=2*ncol-1 + ind4(4)=2*ncol + ind4(5)=2*ncol+1 + ind4(6)=ncol+2 + ind4(7)=2 + ind4(8)=-ncol+2 + ind4(9)=-2*ncol+1 + ind4(10)=-2*ncol + ind4(11)=-2*ncol-1 + ind4(12)=-ncol-1 + + wta = wt(1) + wtb = wt(2) + wtc = wt(3) + +C_________Smoothing_____________________________________ + + do i=1,n + sm(cell(i))=wta*cnt(i) + enddo + + do i=1,n + loc=cell(i) + row=(loc-1)/ncol + 1 + cnt1=wtb*cnt(i) + cnt2=wtc*cnt(i) + + if(mod(row,2).eq.1)then + do j=1,6 + ind=loc+ind1(j) + sm(ind)=sm(ind)+cnt1 + enddo + do j=1,12 + ind=loc+ind2(j) + sm(ind)=sm(ind)+cnt2 + enddo + else + do j=1,6 + ind=loc+ind3(j) + sm(ind)=sm(ind)+cnt1 + enddo + do j=1,12 + ind=loc+ind4(j) + sm(ind)=sm(ind)+cnt2 + enddo + endif + enddo + + n=0 + do i=1,nmax + if(sm(i).gt.0)then + n=n+1 + cell(n)=i + cnt(n)=sm(i) + endif + enddo + return + end + + diff --git a/tests/hdiffplot.R b/tests/hdiffplot.R new file mode 100644 index 0000000..921d061 --- /dev/null +++ b/tests/hdiffplot.R @@ -0,0 +1,36 @@ +library(hexbin) + +if(R.version$major != "1" || as.numeric(R.version$minor) >= 7) + RNGversion("1.6") +set.seed(213) +x1 <- rnorm(10000) +y1 <- rnorm(10000) + +x2 <- rnorm(10000,mean = .3) +y2 <- rnorm(10000,mean = .3) + +rx <- range(x1,x2) +ry <- range(y1,y2) + +str(bin1 <- hexbin(x1,y1, xbnds = rx, ybnds = ry)) +str(bin2 <- hexbin(x2,y2, xbnds = rx, ybnds = ry)) + +str(erode(bin1)) + +str(smbin1 <- smooth.hexbin(bin1)) +(smbin2 <- smooth.hexbin(bin2)) + +str(erodebin1 <- erode.hexbin(smbin1)) +(erodebin2 <- erode.hexbin(smbin2)) + +if(FALSE)## does not work -- what funny stuff is hdiffplot() doing??? + par(mfrow = c(2,1)) + +if(exists("hdiffplot", mode="function")) { ## not yet in new hexbin +hdiffplot(bin1,bin2, main = "Original N(0,*) Random bins") + +hdiffplot(smbin1,smbin2, main = "smooth.hexbin() smoothed bins") + +plot.new() +hdiffplot(erodebin1,erodebin2, main = "erode.hexbin()d smoothed bins") +}# not yet diff --git a/tests/hdiffplot.Rout.save b/tests/hdiffplot.Rout.save new file mode 100644 index 0000000..7250a40 --- /dev/null +++ b/tests/hdiffplot.Rout.save @@ -0,0 +1,155 @@ + +R version 2.8.0 Under development (unstable) (2008-04-27 r45520) +Copyright (C) 2008 The R Foundation for Statistical Computing +ISBN 3-900051-07-0 + +R is free software and comes with ABSOLUTELY NO WARRANTY. +You are welcome to redistribute it under certain conditions. +Type 'license()' or 'licence()' for distribution details. + +R is a collaborative project with many contributors. +Type 'contributors()' for more information and +'citation()' on how to cite R or R packages in publications. + +Type 'demo()' for some demos, 'help()' for on-line help, or +'help.start()' for an HTML browser interface to help. +Type 'q()' to quit R. + +> library(hexbin) +Loading required package: grid +Loading required package: lattice +> +> if(R.version$major != "1" || as.numeric(R.version$minor) >= 7) ++ RNGversion("1.6") +Warning message: +In RNGkind("Marsaglia-Multicarry", "Buggy Kinderman-Ramage") : + Buggy version of Kinderman-Ramage generator used. +> set.seed(213) +> x1 <- rnorm(10000) +> y1 <- rnorm(10000) +> +> x2 <- rnorm(10000,mean = .3) +> y2 <- rnorm(10000,mean = .3) +> +> rx <- range(x1,x2) +> ry <- range(y1,y2) +> +> str(bin1 <- hexbin(x1,y1, xbnds = rx, ybnds = ry)) +Formal class 'hexbin' [package "hexbin"] with 16 slots + ..@ cell : int [1:535] 16 20 48 70 74 75 76 80 99 101 ... + ..@ count : int [1:535] 1 1 1 1 1 1 1 1 1 1 ... + ..@ xcm : num [1:535] 0.370 1.338 0.721 -1.846 -0.965 ... + ..@ ycm : num [1:535] -3.66 -3.71 -3.54 -3.20 -3.24 ... + ..@ xbins : num 30 + ..@ shape : num 1 + ..@ xbnds : num [1:2] -3.8 4.3 + ..@ ybnds : num [1:2] -3.71 4.17 + ..@ dimen : num [1:2] 36 31 + ..@ n : int 10000 + ..@ ncells: int 535 + ..@ call : language hexbin(x = x1, y = y1, xbnds = rx, ybnds = ry) + ..@ xlab : chr "x1" + ..@ ylab : chr "y1" + ..@ cID : NULL + ..@ cAtt : int(0) +> str(bin2 <- hexbin(x2,y2, xbnds = rx, ybnds = ry)) +Formal class 'hexbin' [package "hexbin"] with 16 slots + ..@ cell : int [1:545] 41 51 75 76 104 107 110 114 136 138 ... + ..@ count : int [1:545] 1 1 1 1 1 2 1 1 2 1 ... + ..@ xcm : num [1:545] -1.141 1.445 -0.493 -0.324 -0.995 ... + ..@ ycm : num [1:545] -3.42 -3.45 -3.24 -3.35 -2.90 ... + ..@ xbins : num 30 + ..@ shape : num 1 + ..@ xbnds : num [1:2] -3.8 4.3 + ..@ ybnds : num [1:2] -3.71 4.17 + ..@ dimen : num [1:2] 36 31 + ..@ n : int 10000 + ..@ ncells: int 545 + ..@ call : language hexbin(x = x2, y = y2, xbnds = rx, ybnds = ry) + ..@ xlab : chr "x2" + ..@ ylab : chr "y2" + ..@ cID : NULL + ..@ cAtt : int(0) +> +> str(erode(bin1)) +Formal class 'erodebin' [package "hexbin"] with 19 slots + ..@ eroded: logi [1:535] FALSE FALSE FALSE FALSE FALSE FALSE ... + ..@ cdfcut: num 0.5 + ..@ erode : int [1:71] 12 35 34 57 52 4 30 101 138 150 ... + ..@ cell : int [1:535] 16 20 48 70 74 75 76 80 99 101 ... + ..@ count : int [1:535] 1 1 1 1 1 1 1 1 1 1 ... + ..@ xcm : num [1:535] 0.370 1.338 0.721 -1.846 -0.965 ... + ..@ ycm : num [1:535] -3.66 -3.71 -3.54 -3.20 -3.24 ... + ..@ xbins : num 30 + ..@ shape : num 1 + ..@ xbnds : num [1:2] -3.8 4.3 + ..@ ybnds : num [1:2] -3.71 4.17 + ..@ dimen : num [1:2] 36 31 + ..@ n : int 10000 + ..@ ncells: int 535 + ..@ call : language hexbin(x = x1, y = y1, xbnds = rx, ybnds = ry) + ..@ xlab : chr "x1" + ..@ ylab : chr "y1" + ..@ cID : NULL + ..@ cAtt : int(0) +> +> str(smbin1 <- smooth.hexbin(bin1)) +Formal class 'smoothbin' [package "hexbin"] with 17 slots + ..@ wts : num [1:3] 48 4 1 + ..@ cell : int [1:906] 17 18 19 21 22 23 51 52 53 54 ... + ..@ count : int [1:906] 1 1 1 1 1 1 1 4 5 2 ... + ..@ xcm : num [1:535] 0.370 1.338 0.721 -1.846 -0.965 ... + ..@ ycm : num [1:535] -3.66 -3.71 -3.54 -3.20 -3.24 ... + ..@ xbins : num 34 + ..@ shape : num 1 + ..@ xbnds : num [1:2] -4.34 4.84 + ..@ ybnds : num [1:2] -4.23 4.70 + ..@ dimen : num [1:2] 40 35 + ..@ n : int 10000 + ..@ ncells: int 535 + ..@ call : language hexbin(x = x1, y = y1, xbnds = rx, ybnds = ry) + ..@ xlab : chr "x1" + ..@ ylab : chr "y1" + ..@ cID : NULL + ..@ cAtt : int(0) +> (smbin2 <- smooth.hexbin(bin2)) +'hexbin' object from call: hexbin(x = x2, y = y2, xbnds = rx, ybnds = ry) +n = 10000 points in nc = 545 hexagon cells in grid dimensions 40 by 35 +> +> str(erodebin1 <- erode.hexbin(smbin1)) +Formal class 'erodebin' [package "hexbin"] with 19 slots + ..@ eroded: logi [1:906] FALSE FALSE FALSE FALSE FALSE FALSE ... + ..@ cdfcut: num 0.5 + ..@ erode : int [1:73] 11 35 95 100 117 88 6 39 167 232 ... + ..@ cell : int [1:906] 17 18 19 21 22 23 51 52 53 54 ... + ..@ count : int [1:906] 1 1 1 1 1 1 1 4 5 2 ... + ..@ xcm : num [1:535] 0.370 1.338 0.721 -1.846 -0.965 ... + ..@ ycm : num [1:535] -3.66 -3.71 -3.54 -3.20 -3.24 ... + ..@ xbins : num 34 + ..@ shape : num 1 + ..@ xbnds : num [1:2] -4.34 4.84 + ..@ ybnds : num [1:2] -4.23 4.70 + ..@ dimen : num [1:2] 40 35 + ..@ n : int 10000 + ..@ ncells: int 535 + ..@ call : language hexbin(x = x1, y = y1, xbnds = rx, ybnds = ry) + ..@ xlab : chr "x1" + ..@ ylab : chr "y1" + ..@ cID : NULL + ..@ cAtt : int(0) +> (erodebin2 <- erode.hexbin(smbin2)) +'hexbin' object from call: hexbin(x = x2, y = y2, xbnds = rx, ybnds = ry) +n = 10000 points in nc = 545 hexagon cells in grid dimensions 40 by 35 +> +> if(FALSE)## does not work -- what funny stuff is hdiffplot() doing??? ++ par(mfrow = c(2,1)) +> +> if(exists("hdiffplot", mode="function")) { ## not yet in new hexbin ++ hdiffplot(bin1,bin2, main = "Original N(0,*) Random bins") ++ ++ hdiffplot(smbin1,smbin2, main = "smooth.hexbin() smoothed bins") ++ ++ plot.new() ++ hdiffplot(erodebin1,erodebin2, main = "erode.hexbin()d smoothed bins") ++ }# not yet +> diff --git a/tests/hray.R b/tests/hray.R new file mode 100644 index 0000000..13a9cce --- /dev/null +++ b/tests/hray.R @@ -0,0 +1,31 @@ +library(hexbin) + +set.seed(572) + +x <- rnorm(100) +y <- rnorm(100) +val <- rnorm(100) +inc <- abs(rnorm(100,sd = .3)) +loB <- val-inc +hiB <- val+inc + +if(exists("hray", mode="function")) { # 'real soon now' + +## no confidence bounds +plot(x,y,type = 'n') +hray(x,y,val) + +## confidence bounds +plot(x,y,type = 'n') +hray(x,y,val, lo = loB, hi = hiB) + +## clockwise orientation +plot(x,y,type = 'n') +hray(x,y,val, loB, hiB, clockwise = TRUE) + +## no tics and small filled dots +plot(x,y,type = 'n') +hray(x,y,val, loB, hiB, ticlength = FALSE, + dotside = 20, dotlength = .025, dotden = -1) + +} diff --git a/tests/large.R b/tests/large.R new file mode 100644 index 0000000..aa42e04 --- /dev/null +++ b/tests/large.R @@ -0,0 +1,39 @@ +library(hexbin) + +if(FALSE) { ## the following is still quite a bit from working/useful : + +## what should that do? set a palette? +rgb <- matrix(c( + 15,15,15, + + 0, 0, 0, + 1, 9,15, + 9,15, 9, + 15, 9, 9, + + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + + 9, 9, 9, + 0, 2, 7, + 0, 7, 1, + 8, 1, 1, + + 15, 2, 2, + 11, 1, 1, + 8, 1, 1, + 5, 1, 1, + 5, 1, 1, + 15,15,15), ncol = 3, byrow = TRUE) + +##ps.options(rasters=600,color=rgb/15,background=2) +##ps.options(color=rgb/15,background=2) +postscript("large.ps",width = 10,height = 7.5) + +plot.hexbin(ans.25mil, style = "nest", lcex = .9) + +}## FALSE, i.e. nothing done diff --git a/tests/viewp-ex.R b/tests/viewp-ex.R new file mode 100644 index 0000000..152e733 --- /dev/null +++ b/tests/viewp-ex.R @@ -0,0 +1,20 @@ +library(hexbin) + +## a variation on Nicholas' post to bioconductor & example(hexViewport) +set.seed(545) +x <- rnorm(2^15) +y <- 3*x - .2*x^2 + rnorm(2^15) +hbin <- hexbin(x,y) + +## +hp <- hexViewport(hbin, newpage = TRUE) +pushHexport(hp) +grid.rect() +grid.xaxis() +grid.yaxis() +grid.hexagons(hbin, style = "centroid") +hloess <- loess(y ~ x, data = hcell2xy(hbin), weights = hbin @ count) +xx <- seq(hbin@xbnds[1], hbin@xbnds[2], length = 500) +grid.lines(xx, predict(hloess, xx), + gp = gpar(col = 'red', lwd = 2), default.units = "native") +popViewport() diff --git a/was-R_zzz.R b/was-R_zzz.R new file mode 100755 index 0000000..a5d120c --- /dev/null +++ b/was-R_zzz.R @@ -0,0 +1,10 @@ +#Lib load function +.First.lib <- function(libname, pkgname, where) { + require(grid) + require(methods) + require(colorspace) + library.dynam("hexbin", pkgname, libname) + #where <- match(paste("package:", pkgname, sep=""), search()) + #.initClasses(where) + +}