R/graficasEspeciales.R

#' Graficas de columnas por categorias
#' 
#' @param data El data frame para hacer la grafica, con el formato de tres o mas columnas de la forma y,z,w,...
#' @param etiquetasCategorias Indica la posición en las que se desea poner las etiquetas para las categorias.
#' Por defecto la posición es hacia Arriba, lo que se denota con la letra "A", cuando las etiquetas se desean en la parte
#' derecha de la grafica se debe indicar con la letra "D"
#' @param escala Indica la escala en la cual debe estar el eje y de la grafica. Por defecto se encuentra en normal. Las opciones
#' son "miles", "millones" o "milesmillones".
#' @param ruta Nombre de la ruta en la que se desea guardar la salida del archivo tex para su compilacion
#' @param etiquetas Posición de las etiquetas. Por defecto se ponen verticales, para pasar a horizontales de escribir "h"
#' @param preambulo Etiqueta boolean que indica si se desea que la gráfica tenga preámbulo o no. Por defecto se tiene Falso. 
#' @return No regresa ningun valor

graficaColCategorias <- function(data, etiquetasCategorias = "A", escala = "normal", ruta, etiquetas = "v", ancho = 0.8, preambulo = F, ejeX = "h", procesar = T){
  ##ALGUNAS VARIABLES UTILES
  lonEtiqueta1 <- 0
  lonEtiqueta2 <- 0
  lonEtiqueta3 <- 0
  apoyoX <- 0
  separacion <- 0
  caso <- 0
  altoRect <- 0
  
  
  tikzDevice::tikz(ruta, standAlone = preambulo, bg = "transparent",bareBones = !preambulo, width = pkg.env$ancho, height= pkg.env$alto, sanitize= F)
  
  if(procesar == F){
    print("CAMBIOS")
    dataLista <-data
    categoria <- dataLista$x
  }else{
    x <- rep(data$x,length(data)-1)
    y <- NULL
    for(i in 2:length(data)){
      y <- c(y,as.matrix(data)[,i])
    }
    categoria <- gl(length(data)-1, length(data$x), labels = names(data)[c(2:ncol(data))])
    print(categoria)
    dataLista <- data.frame(x,y,categoria)
    dataLista <- fact2Num(dataLista)
    dataLista$x <- factor(dataLista$x, levels = data$x)
    levels(dataLista$x) <- gsub("\\\\n", "\n", levels(dataLista$x))
    print(length(levels(dataLista$categoria)))
  }
  
  if(toupper(escala) == "MILES"){
    dataLista$y <- dataLista$y/1000
  }else if(toupper(escala) == "MILLONES"){
    dataLista$y <- dataLista$y/1000000
  }else if(toupper(escala) == "MILESMILLONES"){
    dataLista$y <- dataLista$y/1000000000
  }

  print(dataLista)
  

  col <-   rampaColAgrupadas(dataLista)
  colores <- col[[1]]
  coloresBorde <- col[[2]]
  print(colores)
  ggplot2::theme_set(pkg.env$temaColumnas)
  grafica <- ggplot2::ggplot(dataLista, ggplot2::aes(x = x, y = y, fill = categoria))+
    ggplot2::geom_bar(stat = 'identity', position =  ggplot2::position_dodge(width = 0.9), width=ancho, colour = rep(coloresBorde, length(data$x))  )+
    ggplot2::labs(x=NULL, y=NULL)+
    ggplot2::scale_y_continuous(breaks=NULL, expand = c(0,0))+
    ggplot2::geom_abline(intercept = 0, slope = 0)+
    #ggplot2::scale_x_discrete(breaks =  unique(dataLista$x), labels = dataLista$x)+
    ggplot2::theme(
      plot.background = ggplot2::element_rect(fill = NULL),
      panel.background = ggplot2::element_rect(fill = NULL),
      plot.margin = grid::unit(c(0,0,0,0),"mm")
    )+
    ggplot2::scale_fill_manual(values=colores)+
    #ggplot2::scale_colour_manual(values = colores)+
    ggplot2::guides(fill = F)
  
  
  ## Rotando el eje X si fuera necesario
  if ( toupper(ejeX) == "V"){
    grafica <- grafica + ggplot2::theme(axis.text.x = ggplot2::element_text(family = "Open Sans Condensed Light",angle = 90, vjust =0.5 , hjust= 1))
  }
  
  ##Clasificando el caso.
  print("El numero de categorías es: ")
  print(levels(dataLista$categoria) )
  if( length(levels(dataLista$categoria))  == 2 ){
    lonEtiqueta1 <- mm2inch(pt2mm(tikzDevice::getLatexStrWidth(names(data)[2], cex = 0.9)))
    lonEtiqueta2 <- mm2inch(pt2mm(tikzDevice::getLatexStrWidth(names(data)[3], cex = 0.9)))
    apoyoX <- 0
    separacion <- 0
    caso <- 0
    print(paste("La longitud de la etiqueta 1 en in es: ", lonEtiqueta1, sep = " "))
    print(paste("La longitud de la etiqueta 2 en in es: ", lonEtiqueta2, sep = " "))
    print( paste("La longitud 1 es: ", lonEtiqueta1 + mm2inch(3 - 0.5 * pkg.env$longCuadrado) + mm2inch(pkg.env$longCuadrado), sep = " ")  )
    print( paste("La longitud 2 es:", lonEtiqueta2 + mm2inch(3 - 0.5 * pkg.env$longCuadrado) + mm2inch(pkg.env$longCuadrado), sep = " ") )
    if( lonEtiqueta1 + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + mm2inch(pkg.env$longCuadrado) < 0.5 * pkg.env$ancho - pkg.env$tol && 
          lonEtiqueta2 + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + mm2inch(pkg.env$longCuadrado)  < 0.5 * pkg.env$ancho - pkg.env$tol  )
    {
      print("CASO 1")
      altoRect <- max(calcularAlto(names(data)[2], largo = inc2mm( pkg.env$ancho ) ), calcularAlto(names(data)[3], largo = inc2mm(pkg.env$ancho) ) )
      print(altoRect)
      caso <- 1
    }else if( 1.10 * (  lonEtiqueta1  + 2 * mm2inch(3 - 0.5 * pkg.env$longCuadrado) + 2 * mm2inch(pkg.env$longCuadrado) + lonEtiqueta2 ) <  pkg.env$ancho - 2 * pkg.env$tol){
      print("CASO 2")
      altoRect <- max(calcularAlto(names(data)[2], largo = inc2mm( pkg.env$ancho)/0.9 ), calcularAlto(names(data)[3], largo  = inc2mm(pkg.env$ancho)/0.9 ) )
      print(altoRect)
      caso <- 2
    }else {
      print(paste("No se cumple ninguna de las anteriores: ",  1.10 * (  lonEtiqueta1  + 2 * mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + 2 * mm2inch(pkg.env$longCuadrado) + lonEtiqueta2 ) , sep = " " ))
      print("CASO 3")
      altoRect <- max(calcularAlto(names(data)[2], largo = 0.5 * pkg.env$ancho - pkg.env$tol - mm2inch(3 - 0.5 * pkg.env$longCuadrado) - mm2inch( pkg.env$longCuadrado ) ), calcularAlto(names(data)[3], largo = 0.5 * pkg.env$ancho - pkg.env$tol - mm2inch(3 - 0.5 * pkg.env$longCuadrado) - mm2inch( pkg.env$longCuadrado ) ) )
      print(altoRect)
      caso <- 3  
    }
  }else{
    lonEtiqueta1 <- mm2inch(pt2mm(tikzDevice::getLatexStrWidth(names(data)[2], cex = 0.9)))
    lonEtiqueta2 <- mm2inch(pt2mm(tikzDevice::getLatexStrWidth(names(data)[3], cex = 0.9)))
    lonEtiqueta3 <- mm2inch(pt2mm(tikzDevice::getLatexStrWidth(names(data)[4], cex = 0.9)))
    
    altoRect <- max(calcularAlto(names(data)[2], largo = inc2mm( pkg.env$ancho/3) ), calcularAlto(names(data)[3], largo = inc2mm(pkg.env$ancho/3) ), calcularAlto(names(data)[4], largo = inc2mm(pkg.env$ancho/3) )  )
    print(altoRect)
  } 
  
  print( is.factor( dataLista$y) )
  if(sonEnteros(dataLista) == 1)
  {
    print("Si son enteros")
    pkg.env$botarCeros <- T
  }
  else
  {
    print("No son enteros")
    pkg.env$botarCeros <- F
  }
  print(pkg.env$botarCeros)
  
  if ( toupper(etiquetas) == "V" ){
    max <-ggplot2::ggplot_build(grafica)$panel$ranges[[1]]$y.range[2]
    longitud <- tikzDevice::getLatexStrWidth( formatC(max,format = "f",big.mark = ",", digits = 1, drop0trailing = pkg.env$botarCeros), cex = pkg.env$fEscala )
    longitud <- pt2mm(longitud + altoRect) + 1.2 + 2 ## Se contempla la distancia de las barras a las etiquetas y de las etiquetas a la leyenda
    print(c(" La longitud en mm es: ", longitud))
    grafica <- grafica + ggplot2::theme(
      plot.margin = grid::unit(c(longitud,0,2,0),"mm")
    )+
      ggplot2::geom_text(ggplot2::aes(familly = "Open Sans Condensed Light",label=formatC(y,format = "f",big.mark = ",", digits = 1, drop0trailing = pkg.env$botarCeros)), position=ggplot2::position_dodge(width=0.9),size=3.2, angle = 90, hjust=-0.2, vjust = 0.5)
  }else if( toupper(etiquetas) == "H"){
    max <-ggplot2::ggplot_build(grafica)$panel$ranges[[1]]$y.range[2]
    longitud <- calcularAlto(15.2)
    longitud <- pt2mm(longitud + altoRect) + 1.2 + 2 ## Se contempla la distancia de las barras a las etiquetas y de las etiquetas a la leyenda
    print(c(" La longitud en mm es: ", longitud))
    grafica <- grafica + ggplot2::theme(
      plot.margin = grid::unit(c(longitud,0,2,0),"mm")
    )+
      ggplot2::geom_text(ggplot2::aes(familly = "Open Sans Condensed Light",label=formatC(y,format = "f",big.mark = ",", digits = 1,drop0trailing = pkg.env$botarCeros)), position=ggplot2::position_dodge(width=0.9),size=3.2, hjust=0.5, vjust = -0.5)
    
  }
  
  
  
  
  
  temp<- ggplot2::ggplot_gtable(ggplot2::ggplot_build(grafica))
  temp$layout$clip[temp$layout$name=="panel"] <- "off"
  grid::grid.draw(temp)
  if(etiquetasCategorias == "D"){
    if(length(data$y) == 2){
      tikzDevice::tikzCoord(2*pkg.env$ancho/3,altoRect, name= "rect", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(0,mm2inch(2.5+ 4), name = "desY", units= "inches")
      tikzDevice::tikzCoord(mm2inch(2.5),mm2inch(0+ 4), name = "desX", units = "inches")
      tikzDevice::tikzCoord(mm2inch(2.5),-mm2inch(0+ 4), name = "mdesX", units = "inches")
      tikzDevice::tikzAnnotate("\\definecolor[named]{ct1}{rgb}{0.0,0.0,0.0}")
      tikzDevice::tikzAnnotate("\\coordinate (t1) at ($(rect) + 0.5*(desX) + 0.5*(desY)$);")
      tikzDevice::tikzAnnotate("\\coordinate (t2) at ($(rect)+0.5*(mdesX)-0.5*(desY)$);")
      tikzDevice::tikzAnnotate(c("\\draw [color=ct1] ($(rect)+(desY)$) rectangle ($(rect)+(desX)$);"))
      tikzDevice::tikzAnnotate(c("\\node [text width=",
                                 mm2pt(20), 
                                 ",right= 0.3cm of t1,scale = 0.9]{", as.character(data$x[[1]]),"};"))
      tikzDevice::tikzAnnotate(c("\\path [fill=blue] ($(rect)-(desY)$) rectangle ($(rect)+(mdesX)$);"))
      tikzDevice::tikzAnnotate(c("\\node [text width=",
                                 mm2pt(20), 
                                 ",right= 0.3cm of t2,scale = 0.9]{",as.character(data$x[[2]]),"};"))  
    }else{
      tikzDevice::tikzCoord(2*pkg.env$ancho/3, pkg.env$alto/2, name= "rect", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(0,mm2inch(1.25 + 0), name = "desY", units= "inches")
      tikzDevice::tikzCoord(mm2inch(2.5),mm2inch(0-1.25), name = "desX", units = "inches")
      tikzDevice::tikzCoord(mm2inch(2.5),-mm2inch(0+ 4), name = "mdesX", units = "inches")
      tikzDevice::tikzCoord(mm2inch(1.25),0, name="tdesX", units = "inches")
      tikzDevice::tikzCoord(0,mm2inch(6+1.25), name ="tdesY", units = "inches")
      tikzDevice::tikzCoord(0,mm2inch(6), name = "espacio", units = "inches")
      tikzDevice::tikzCoord(0, mm2inch(2.5), name = "lonY", units = "inches")
      tikzDevice::tikzCoord(mm2inch(2.5),0, name = "lonX", units = "inches")
      tikzDevice::tikzAnnotate("\\definecolor[named]{ct1}{HTML}{000000}")
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct2}{HTML}{",substr(colores[2],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct3}{HTML}{",substr(colores[3],2,7),"}"))
      tikzDevice::tikzAnnotate("\\coordinate (t2) at ($(rect) +0.5*(lonX)$);")
      tikzDevice::tikzAnnotate("\\coordinate (t1) at ($(rect)+ 0.5*(lonX) + (lonY) + (espacio) $);")
      tikzDevice::tikzAnnotate("\\coordinate (t3) at ($(rect) + 0.5*(lonX) - (lonY) - (espacio)$);")
      tikzDevice::tikzAnnotate(c("\\draw [color=ct1] ($(rect)+1.5*(lonY) + (espacio)$) rectangle ($(rect)+(lonX)+ 0.5*(lonY) + (espacio)$);"))
      tikzDevice::tikzAnnotate(c("\\node [text width=",
                                 mm2pt(20), 
                                 ",right= 0.3cm of t1,scale = 0.9]{",as.character( (names(data))[2] ),"};"))
      tikzDevice::tikzAnnotate(c("\\path [fill=ct2] ($(rect)+0.5*(lonY)$) rectangle ($(rect)+(lonX)-0.5*(lonY)$);"))
      tikzDevice::tikzAnnotate(c("\\node [text width=",
                                 mm2pt(20), 
                                 ",right= 0.3cm of t2,scale = 0.9]{", as.character( (names(data))[3] ),"};"))
      tikzDevice::tikzAnnotate(c("\\path [fill=ct3] ($(rect)-1.5*(lonY) - (espacio)$) rectangle ($(rect)+(lonX)- 0.5*(lonY) - (espacio)$);"))
      tikzDevice::tikzAnnotate(c("\\node [text width=",
                                 mm2pt(20), 
                                 ",right= 0.3cm of t3,scale = 0.9]{",as.character( (names(data))[4] ),"};"))
      
    }
  }else{
    if(length(levels(dataLista$categoria))  == 2){
      
      
      
      ## Caluculando las posiciones de las etiquetas para que quede centrado
      cadenaEtiqueta1 <- ""
      cadenaEtiqueta2 <- ""
      if( caso == 1  )
      {
        print("CASO 1")
        print(paste("El punto medio para la primera etiqueta es: ", 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ), sep = " "))
        apoyoX  <- 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ) -  0.5 * ( lonEtiqueta1  + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + mm2inch(pkg.env$longCuadrado ) )
        finEtiqueta1 <- 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ) +  0.5 * (  lonEtiqueta1  + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + mm2inch(pkg.env$longCuadrado) )
        print(paste("El fin de la etiqueta 1 es:" , finEtiqueta1, sep = " "))
        separacion <-  ( mm2inch(pkg.env$longCuadrado) + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + lonEtiqueta1 )  + ( 0.5 * pkg.env$ancho - finEtiqueta1 )  + 0.5 * ( 0.5 * pkg.env$ancho - pkg.env$tol - (  lonEtiqueta2  + mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + mm2inch(pkg.env$longCuadrado) )  )  
        cadenaEtiqueta1 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,midway,right,scale = 0.9]{", as.character( names(data)[2] ),"};", sep = "")
        cadenaEtiqueta2 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,midway,right,scale = 0.9]{", as.character( names(data)[3] ),"};", sep = "")
      }else if( caso == 2 ){
        print("CASO 2")
        apoyoX <- ( 0.5 * pkg.env$ancho  + pkg.env$tol ) - 0.5 * 1.10 * ( lonEtiqueta1 + 2 * mm2inch(3 - 0.5 * pkg.env$longCuadrado ) + 2 * mm2inch(pkg.env$longCuadrado) + lonEtiqueta2 )
        separacion <-  mm2inch(pkg.env$longCuadrado) + mm2inch( 3 - 0.5 * pkg.env$longCuadrado )  + lonEtiqueta1   + 0.10 * ( lonEtiqueta1 + 2 * mm2inch( 3 - 0.5 * pkg.env$longCuadrado ) + 2 * mm2inch(pkg.env$longCuadrado) + lonEtiqueta2 ) 
        cadenaEtiqueta1 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,midway,right,scale = 0.9, draw]{", as.character( names(data)[2] ),"};", sep = "")
        cadenaEtiqueta2 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,midway,right,scale = 0.9]{", as.character( names(data)[3] ),"};", sep = "")
      }else {
        print("CASO 3")
        print(paste("El punto medio para la primera etiqueta es: ", 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ), sep = " "))
        apoyoX  <- 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ) -  0.5 * ( lonEtiqueta1  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )
        finEtiqueta1 <- 0.5 * ( 0.5 * pkg.env$ancho + pkg.env$tol ) +  0.5 * (  lonEtiqueta1  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )
        print(paste("El fin de la etiqueta 1 es:" , finEtiqueta1, sep = " "))
        separacion <- finEtiqueta1  + 0.5 * ( 0.5 * pkg.env$ancho - pkg.env$tol - (  lonEtiqueta2  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )  )
      }
      
      
      print(paste("El valor de apoyo es:" , apoyoX, sep = " "))
      print(paste("La separción es:" , separacion, sep = " "))
      print(paste("La tolerancia es:" , pkg.env$tol, sep = " "))
      print(paste("La distancia de un cuadro a otro es:" ,separacion + lonEtiqueta1, sep = " "))
      tikzDevice::tikzCoord(apoyoX, pkg.env$alto-mm2inch(pt2mm(altoRect)), name= "apoyo", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(mm2inch(pkg.env$longCuadrado),mm2inch(pt2mm(altoRect)), name = "longitudFicticia", units= "inches")
      tikzDevice::tikzCoord(mm2inch(pkg.env$longCuadrado),mm2inch(pkg.env$longCuadrado), name = "longitud", units= "inches")
      tikzDevice::tikzCoord(separacion,mm2inch(0), name = "desX", units = "inches")
      tikzDevice::tikzCoord(mm2inch(0), 0.5* mm2inch(pt2mm(altoRect)) - 0.5*mm2inch(pkg.env$longCuadrado), name = "desY", units = "inches")
      #tikzDevice::tikzCoord(mm2inch(10),0, name = "mdesX", units = "inches")
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct1}{HTML}{",substr(colores[1],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct2}{HTML}{",substr(colores[2],2,7),"}"))      
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ctb1}{HTML}{",substr(coloresBorde[1],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ctb2}{HTML}{",substr(coloresBorde[2],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\path [fill=none] (apoyo) rectangle ($(apoyo)+(longitudFicticia)$)"))
      tikzDevice::tikzAnnotate(cadenaEtiqueta1)
      tikzDevice::tikzAnnotate(c("\\draw [color = ctb1,fill=ct1] ( $(apoyo)  + (desY) $) rectangle ($(apoyo)+ (desY) +(longitud)$);"))
      tikzDevice::tikzAnnotate(c("\\path [fill=none] ($(apoyo)+(desX)$) rectangle ($(apoyo)+(desX)+(longitudFicticia)$)"))
      tikzDevice::tikzAnnotate(cadenaEtiqueta2)  
      tikzDevice::tikzAnnotate(c("\\draw [color = ctb2 ,fill=ct2] ( $(apoyo)  + (desY) + (desX) $) rectangle ($(apoyo)+ (desY)+ (desX) +(longitud)$);"))
    }else{
      ##Definiendo los nodos necesarios:
      
      print(paste('La mitad de la etiqueta 1 vale: ' , 0.5 * ( lonEtiqueta1  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )))
      apoyoX1  <-  pkg.env$tol + 1/6 * ( pkg.env$ancho - 2 * pkg.env$tol)  -  0.5 * ( lonEtiqueta1  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )
      apoyoX2 <- pkg.env$tol + 1/2 * ( pkg.env$ancho - 2 * pkg.env$tol ) - 0.5 * ( lonEtiqueta2  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )
      apoyoX3 <- pkg.env$tol + 5/6 * ( pkg.env$ancho - 2 * pkg.env$tol ) - 0.5 * ( lonEtiqueta3  + mm2inch(3) + mm2inch(pkg.env$longCuadrado) )
      print(paste("El valor de apoyo es :" , apoyoX, sep = " "))
        
      ##Formateando el texto a mostrar
      cadenaEtiqueta1 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,text width=", pkg.env$ancho/3,"in,midway,right,scale = 0.9]{", as.character( names(data)[2] ),"};", sep = "")
      cadenaEtiqueta2 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,text width=", pkg.env$ancho/3, "in,midway,right,scale = 0.9]{", as.character( names(data)[3] ),"};", sep = "")
      cadenaEtiqueta3 <- paste("node [xshift=0.3cm,inner sep=0pt, outer sep=0pt,text width=", pkg.env$ancho/3, "in,midway,right,scale = 0.9]{", as.character( names(data)[4] ),"};", sep = "")
      
      
      
      ##Escribiendo en el fichero TEX
      print(paste('El valor en Y de apoyoX es: ',mm2inch(pt2mm(altoRect)), sep = ' '))
      tikzDevice::tikzCoord(apoyoX1, pkg.env$alto-mm2inch(pt2mm(altoRect)), name= "apoyo1", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(apoyoX2, pkg.env$alto-mm2inch(pt2mm(altoRect)), name= "apoyo2", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(apoyoX3, pkg.env$alto-mm2inch(pt2mm(altoRect)), name= "apoyo3", units = "inches") ## ESTA ES LA QUE FUNCIONA 
      tikzDevice::tikzCoord(mm2inch(pkg.env$longCuadrado),mm2inch(pt2mm(altoRect)), name = "longitudFicticia", units= "inches")
      tikzDevice::tikzCoord(mm2inch(pkg.env$longCuadrado),mm2inch(pkg.env$longCuadrado), name = "longitud", units= "inches")
      tikzDevice::tikzCoord(mm2inch(0), 0.5* mm2inch(pt2mm(altoRect)) - 0.5*mm2inch(pkg.env$longCuadrado), name = "desY", units = "inches")
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct1}{HTML}{",substr(colores[1],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct2}{HTML}{",substr(colores[2],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ct3}{HTML}{",substr(colores[3],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ctb1}{HTML}{",substr(coloresBorde[1],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ctb2}{HTML}{",substr(coloresBorde[2],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\definecolor[named]{ctb3}{HTML}{",substr(coloresBorde[3],2,7),"}"))
      tikzDevice::tikzAnnotate(c("\\path [fill=none] (apoyo1) rectangle ($(apoyo1)+(longitudFicticia)$)"))
      tikzDevice::tikzAnnotate(cadenaEtiqueta1)
      tikzDevice::tikzAnnotate(c("\\draw [color= ctb1, fill=ct1] ( $(apoyo1)  + (desY) $) rectangle ($(apoyo1)+ (desY) +(longitud)$);"))
      tikzDevice::tikzAnnotate(c("\\path [fill=none] (apoyo2) rectangle ($(apoyo2)+(longitudFicticia)$)"))
      tikzDevice::tikzAnnotate(cadenaEtiqueta2)
      tikzDevice::tikzAnnotate(c("\\draw [color = ctb2, fill=ct2] ( $(apoyo2)  + (desY) $) rectangle ($(apoyo2)+ (desY) +(longitud)$);"))
      tikzDevice::tikzAnnotate(c("\\path [fill=none] (apoyo3) rectangle ($(apoyo3)+(longitudFicticia)$)"))
      tikzDevice::tikzAnnotate(cadenaEtiqueta3)
      tikzDevice::tikzAnnotate(c("\\path [color = ctb3, fill=ct3] ( $(apoyo3)  + (desY) $) rectangle ($(apoyo3)+ (desY) +(longitud)$);"))
      
    }
  }
  grDevices::dev.off()
  return(dataLista)
}




#'Función para gráficar con facets.
#'@param Data Frame con el que se desea trabajar
#'@param escala Indica la escala en la cual debe estar el eje y de la grafica. Por defecto se encuentra en normal. Las opciones
#' son "miles", "millones" o "milesmillones".
#'
graficaBarFacets <-function(data, ruta, escala = 'normal', etiquetas = 'H', preambulo = F){
  x <- rep(data$x,length(data)-1)
  y <- NULL
  for(i in 2:length(data)){
    y <- c(y,as.matrix(data)[,i])
  }
  categoria <- gl(length(data)-1, length(data$x), labels = names(data)[c(2:ncol(data))])
  print(categoria)
  dataLista <- data.frame(x,y,categoria)
  dataLista <- fact2Num(dataLista)
  dataLista$x <- factor(dataLista$x, levels = data$x)
  levels(dataLista$x) <- gsub("\\\\n", "\n", levels(dataLista$x))
  print(length(levels(dataLista$categoria)))
  print(dataLista)
  if(toupper(escala) == "MILES"){
    dataLista$y <- dataLista$y/1000
  }else if(toupper(escala) == "MILLONES"){
    dataLista$y <- dataLista$y/1000000
  }else if(toupper(escala) == "MILESMILLONES"){
    dataLista$y <- dataLista$y/1000000000
  }
  print(rgb(1,0,0))
  print(pkg.env$color1)
  print(pkg.env$colorRelleno)
  ggplot2::theme_set(pkg.env$temaFacets)
  grafica <- ggplot2::ggplot(dataLista, ggplot2::aes(x = x, y = y))+
    ggplot2::geom_bar(colour = pkg.env$color1  , fill = pkg.env$colorRelleno ,  stat = 'identity', position =  ggplot2::position_dodge(width = 0.9), width=0.5 )+
    ggplot2::geom_abline(intercept = 0, slope = 0, size = 0.1)+
    ggplot2::labs(x=NULL, y=NULL)
    print(grafica)
    etiquetasHorizontales(grafica)
    grafica <- grafica + ggplot2::facet_grid(. ~ categoria)
    
  ##Poniendo las etiquetas
    grafica <- etiquetasFacets(grafica)
  
  ##etiquetas para el eje X
    margenes <- NULL
    if (toupper(etiquetas) == 'V'){
      grafica <- grafica + ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 90, vjust =0.5 , hjust= 1))
    }
    grafica <- grafica + ggplot2::theme(plot.margin = grid::unit(c(4,0,2,-7), "mm"))
    
  ## Exportando el tex
  tikzDevice::tikz(ruta, standAlone = preambulo, bg = "transparent",bareBones = !preambulo, width = pkg.env$ancho, height= pkg.env$alto, sanitize= F)
  temp<- ggplot2::ggplot_gtable(ggplot2::ggplot_build(grafica))
  temp$layout$clip[temp$layout$name=="panel"] <- "off"
  temp$layout$clip <- "off"
  grid::grid.draw(temp)
    
  ##Escribiendo la linea de divison
    
  tikzDevice::tikzCoord(pkg.env$ancho / 2 , pkg.env$alto , name= 'punto1', units = 'inches')
  tikzDevice::tikzCoord(pkg.env$ancho / 2, 0, name = 'punto2', units = 'inches' )
  tikzDevice::tikzAnnotate(c("\\definecolor[named]{linea}{HTML}{",substr(pkg.env$grisBase,2,7),"}"))
  tikzDevice::tikzAnnotate('\\draw[color = linea] (punto1) -- (punto2); ')
  grDevices::dev.off()
  
}
hugoallan9/funcionesINE documentation built on May 17, 2019, 9:12 p.m.