The function aheatmap plots high-quality heatmaps,
  with a detailed legend and unlimited annotation tracks
  for both columns and rows. The annotations are coloured
  differently according to their type (factor or numeric
  covariate). Although it uses grid graphics, the generated
  plot is compatible with base layouts such as the ones
  defined with 'mfrow' or layout,
  enabling the easy drawing of multiple heatmaps on a
  single a plot -- at last!.
aheatmap(x, color = "-RdYlBu2:100", breaks = NA, border_color = NA, cellwidth = NA, 
  cellheight = NA, scale = "none", Rowv = TRUE, Colv = TRUE, revC = identical(Colv, 
          "Rowv") || is_NA(Rowv) || (is.integer(Rowv) && length(Rowv) > 1) || is(Rowv, 
          "silhouette"), distfun = "euclidean", hclustfun = "complete", reorderfun = function(d, 
          w) reorder(d, w), treeheight = 50, legend = TRUE, annCol = NA, annRow = NA, 
      annColors = NA, annLegend = TRUE, labRow = NULL, labCol = NULL, subsetRow = NULL, 
      subsetCol = NULL, fontsize = 10, cexRow = min(0.2 + 1/log10(nr), 1.2), cexCol = min(0.2 + 
          1/log10(nc), 1.2), filename = NA, width = NA, height = NA, main = NULL, sub = NULL, 
      info = NULL, verbose = getOption("verbose"), ...)
    
    ExpressionSet
  objects can also be passed, in which case the expression
  values are plotted (exprs(x)).rev(sequential_hcl(2, h = x, l =
  c(50, 95))). Other values are concatenated with the grey
  colour '#F1F1F1'. x and is one element longer than
  color vector. Used for mapping values to colors. Useful,
  if needed to map certain values to certain colors. If
  value is NA then the breaks are calculated automatically.
  If breaks is a single value, then the colour
  palette is centered on this value."row": center and standardize each row separately
  to row Z-scores "column": center and
  standardize each column separately to column Z-scores
  "r1": scale each row to sum up to one "c1": scale each column to sum up to one "none": no scaling TRUE or NULL (to be
  consistent with heatmap): compute a
  dendrogram from hierarchical clustering using the
  distance and clustering methods distfun and
  hclustfun.
  NA: disable any ordering. In this case, and
  if not otherwise specified with argument
  revC=FALSE, the heatmap shows the input matrix
  with the rows in their original order, with the first row
  on top to the last row at the bottom. Note that this
  differ from the behaviour or heatmap, but
  seemed to be a more sensible choice when vizualizing a
  matrix without reordering.
  nrow(x)), that specifies the row
  order. As in the case Rowv=NA, the ordered matrix
  is shown first row on top, last row at the bottom.
  distfun, hclustfun
  and reorderfun when clustering the rows (see the
  respective argument descriptions for a list of accepted
  values). If Rowv has no names, then the first
  element is used for distfun, the second (if
  present) is used for hclustfun, and the third (if
  present) is used for reorderfun.
  d by
  reorderfun(d, Rowv).
  FALSE: the dendrogram is computed
  using methods distfun, hclustfun, and
  reorderfun but is not shown.
  treeheight. Rowv
  (modulo the expected length for vector specifications),
  and allow specifying the
  distance/clustering/ordering/display parameters to be
  used for the columns only. Colv may also be
  set to "Rowv", in which case the dendrogram or
  ordering specifications applied to the rows are also
  applied to the columns. Note that this is allowed only
  for square input matrices, and that the row ordering is
  in this case by default reversed (revC=TRUE) to
  obtain the diagonal in the standard way (from top-left to
  bottom-right). See argument Rowv for other
  possible values.Rowv should be reversed. This is
  mainly used to get the rows displayed from top to bottom,
  which is not the case by default. Its default value is
  computed at runtime, to suit common situations where
  natural ordering is a more sensible choice: no or fix
  ordering of the rows (Rowv=NA or an integer vector
  of indexes -- of length > 1), and when a symmetric
  ordering is requested -- so that the diagonal is shown as
  expected. An argument in favor of the "odd" default
  display (bottom to top) is that the row dendrogram is
  plotted from bottom to top, and reversing its reorder may
  take a not too long but non negligeable time.Rowv
  or Colv is a numeric weight vector, or provides or
  computes a dendrogram. It must take 2 parameters: a
  dendrogram, and a weight vector.labRow. x. Rowv is a dendrogram or hclust object,
  it is first converted into an ordering vector, and cannot
  be displayed -- and a warning is thrown.subsetRow. See details above.TRUE.ExpressionSet
  object, in which case the phenotypic data is used
  (pData(eset)). Character or integer vectors are
  converted and displayed as factors. Unnamed tracks are
  internally renamed into Xi, with i being
  incremented for each unamed track, across both column and
  row annotation tracks. For each track, if no
  corresponding colour is specified in argument
  annColors, a palette or a ramp is automatically
  computed and named after the track's name.annCol apply.TRUE.labRow for a list of the possible
  values.fontsize.fontsize.info=TRUE,
  information about the clustering methods is displayed at
  the bottom of the plot.TRUE then verbose messages are
  displayed and the borders of some viewports are
  highlighted. It is entended for debugging purposes.grid.text, see
  gpar.The development of this function started as a fork of the
  function pheatmap from the pheatmap package,
  and provides several enhancements such as: 
heatmap; Please read the associated vignette for more information and sample code.
## See the demo 'aheatmap' for more examples:
## Not run: 
##D demo('aheatmap')
## End(Not run)
# Generate random data
n <- 50; p <- 20
x <- abs(rmatrix(n, p, rnorm, mean=4, sd=1))
x[1:10, seq(1, 10, 2)] <- x[1:10, seq(1, 10, 2)] + 3
x[11:20, seq(2, 10, 2)] <- x[11:20, seq(2, 10, 2)] + 2
rownames(x) <- paste("ROW", 1:n)
colnames(x) <- paste("COL", 1:p)
## Default heatmap
aheatmap(x)
 
## Distance methods
aheatmap(x, Rowv = "correlation")
 
aheatmap(x, Rowv = "man") # partially matched to 'manhattan'
 
aheatmap(x, Rowv = "man", Colv="binary")
 
# Generate column annotations
annotation = data.frame(Var1 = factor(1:p %% 2 == 0, labels = c("Class1", "Class2")), Var2 = 1:10)
aheatmap(x, annCol = annotation)
 
pheatmap: Raivo Kolde
  Enhancement into aheatmap: Renaud Gaujoux