¿Cómo puedo crear un histograma 3D con R?

Por ejemplo, tengo dos variables a ser tenidas en cuenta para la cantidad de veces caen en un definen dos dimensiones de reciclaje. Así que tengo dos variables en el eje X e y, mientras que el eje Z es el recuento de las dos variables.

Esta pregunta podría encajar mejor en CrossValidated. He marcado para el moderador de la atención.
Tengo que admitir que no entiendo el cierre. En mi humilde opinión, esta pregunta puede ser fácilmente resuelto relacionado con el software (que entiendo es el tema aquí): por ejemplo, tener una mirada en el paquete de hexbin o ggplot del stat_bin2d / stat_binhex. Usted obtener 2 de las coordenadas espaciales, que es toda la pantalla o el papel que puede hacer más de un 3º, código de color de la dimensión. Lo que se dice, más bien puede ser vale la pena el cierre de duplicados de stackoverflow.com/questions/2405575/… (donde, sin embargo, el 3 dimensiones se discutieron puramente espacial).
Por cierto: me gustaría llamar a dos variables X e y, y su cuenta en Z en lugar de un histograma 2d.
Sí, la pregunta ha sido reabierto (ver revisiones). Si se trata de un duplicado, a continuación, debemos cerrar como tal. Si la otra pregunta es que faltan detalles, siéntase libre de añadir una respuesta allí.
¿Usted ha considerado un «mapa de calor» en su lugar? El pheatmap paquete se puede hacer bastante bien.

OriginalEl autor emanuele | 2011-10-07

3 Comentarios

  1. 7

    echar un vistazo al paquete de hexbin para calcular y mostrar, o, por ejemplo, ggplot del stat_bin2d /stat_binhex para mostrar. Usted obtener 2 de las coordenadas espaciales, que es toda la pantalla o el papel que puede hacer más de un 3º, código de color de la dimensión.

    Nota que ¿Cómo funciona una parcela 3D histograma apilado en R? es un duplicado de esta pregunta (pero la 3ª dimensión se discutió espacialmente).

    Solo curiosidad: Fue reabierto el hilo o conseguí que mal?

    OriginalEl autor cbeleites

  2. 1

    La rgl paquete tiene una función hist3d (y no en el doc, pero que se le puede llamar y también ver el código).

    Aunque este hist3d es, para mí, mostrando un 2-dimensional de los histogramas (entrada = x,y) en 3 dimensiones.

    Si eso es lo que quieres aquí está el código (de rgl):

    > hist3d
    function(x,y=NULL,nclass="auto",alpha=1,col="#ff0000",scale=10)
      {
      save <- par3d(skipRedraw=TRUE)
      on.exit(par3d(save))
      xy <- xy.coords(x,y)
      x <- xy$x
      y <- xy$y
      n<-length(x)
      if (nclass == "auto") { nclass<-ceiling(sqrt(nclass.Sturges(x))) }
      breaks.x <- seq(min(x),max(x),length=(nclass+1))
      breaks.y <- seq(min(y),max(y),length=(nclass+1))
      z<-matrix(0,(nclass),(nclass))
      for (i in 1:nclass) 
        {
        for (j in 1:nclass) 
          {
          z[i, j] <- (1/n)*sum(x < breaks.x[i+1] & y < breaks.y[j+1] & 
                                x >= breaks.x[i] & y >= breaks.y[j])
          binplot.3d(c(breaks.x[i],breaks.x[i+1]),c(breaks.y[j],breaks.y[j+1]),
                     scale*z[i,j],alpha=alpha,topcol=col)
          }
        }
    }

    He construido mi propio hist3d a devolver en 3 dimensiones histograma (por ejemplo, para utilizar en Rojo, Verde y Azul):

    my_hist3d <- function(x,y=NULL,z=NULL, nclass="auto",alpha=1,col="#ff0000",scale=10)
      {
    
      xyz <- xyz.coords(x,y,z)
      x <- xyz$x
      y <- xyz$y
      z <- xyz$z
    
      n<-length(x)
    
      if (nclass == "auto") { nclass<-ceiling(sqrt(nclass.Sturges(x))) }
    
      breaks.x <- seq(min(x),max(x),length=(nclass+1))
      breaks.y <- seq(min(y),max(y),length=(nclass+1))
      breaks.z <- seq(min(z),max(z),length=(nclass+1))
    
    
      h = array(1:(nclass^3), dim=c(nclass,nclass,nclass))
    
      for (i in 1:nclass) 
        {
        for (j in 1:nclass) 
          {
            for (k in 1:nclass) 
              {
                  h[i,j,k] <- (1/n)*sum(x < breaks.x[i+1] & y < breaks.y[j+1] & x >= breaks.x[i] & y >= breaks.y[j] & z < breaks.z[k+1] & z >= breaks.z[k])
              }
          }
        }
    
      return(h)
    }

    La variable devuelve (h) es una matriz tridimensional de tamaño nclass^3 (nclass es el número de contenedores en cada dimensión).

    OriginalEl autor tucson

  3. 1

    Puede utilizar la siguiente función que se basa en tucson función para trazar un histograma en 3d.

    my_hist3d <- function(x, y, freq=FALSE, nclass="auto") {
    n<-length(x)
    if (nclass == "auto") { nclass<-ceiling(sqrt(nclass.Sturges(x))) }
    breaks.x <- seq(min(x),max(x),length=(nclass+1))
    breaks.y <- seq(min(y),max(y),length=(nclass+1))
    h <- NULL
    for (i in 1:nclass) 
    for (j in 1:nclass) 
    h <- c(h, sum(x <= breaks.x[j+1] & x >= breaks.x[j] & y <= breaks.y[i+1] & y >= breaks.y[i] ) )
    if (freq) h <- h / n
    xx <- as.factor(round(mean(breaks.x[1:2])+(0:(nclass-1))*diff(breaks.x[1:2]), 1))
    yy <- as.factor(round(mean(breaks.y[1:2])+(0:(nclass-1))*diff(breaks.y[1:2]), 1))
    res <- cbind(expand.grid(xx,yy), h)
    colnames(res) <- c(deparse(substitute(x)),deparse(substitute(y)),'Frequency')
    formu <- as.formula(paste("Frequency ~ ", paste(colnames(res)[1:2], collapse= "+")))
    cloud(formu, res, panel.3d.cloud=panel.3dbars, col.facet='lightblue', 
    xbase=1, ybase=1, scales=list(arrows=FALSE, col=1), 
    par.settings = list(axis.line = list(col = "transparent")))
    }
    library(latticeExtra)
    height <- rbeta(2000, 2, 5)
    weight <- rgamma(2000, 10)
    my_hist3d(height, weight, nclass=10)

    OriginalEl autor fhernanb

Dejar respuesta

Please enter your comment!
Please enter your name here