2015-05-31 18 views
11

Questo è il mio obiettivo: Tracciare la frequenza di in base a x nell'asse z.Come eseguire l'istogramma 3D in R

Questi sono miei problemi: Ho una matrice due colonne (x e y) e la necessità di suddividere x in classi (p.ex. 0,2 ou 0,5) e calcolare la frequenza di y per ciascuna classe di x. La trama deve apparire come un grafico x-y nel piano "terra" e la frequenza nell'asse z. Potrebbe essere come una superficie o un istogramma 3D. Ho provato a farlo usando la funzione hist3D del pacchetto plot3D ma non so cosa sto facendo male.

Questo è un esempio di quello che sto cercando di fare:

https://www.safaribooksonline.com/library/view/r-data-visualization/9781783989508/ch06s05.html

Grazie !!

+4

I colori in questo esempio si riflettono in altezza e sono ridondanti. Potresti fare una heatmap 2d + a colori e dare le stesse informazioni, senza oscurare una parte dei dati dietro le barre alte. – thelatemail

+0

@thelatemail, grazie per il suggerimento. Proverò la heatmap. –

risposta

17

Utilizzando alcuni dati simulati, questo dovrebbe ottenere quello che vuoi. La chiave è che devi creare i bin bivariati, utilizzando la funzione cut(). Poi trattando i fattori raggruppate come i livelli poter poi contare le combinazioni di ogni livello di fattore utilizzando la funzione table() come di seguito:

library(plot3D) 

## Simulate data: 
set.seed(2002) 
x <- rnorm(1000) 
y <- rnorm(1000) 

## Create cuts: 
x_c <- cut(x, 20) 
y_c <- cut(y, 20) 

## Calculate joint counts at cut levels: 
z <- table(x_c, y_c) 

## Plot as a 3D histogram: 
hist3D(z=z, border="black") 

## Plot as a 2D heatmap: 
image2D(z=z, border="black") 

3D2D

+0

Grazie, amico. Ho usato il tuo codice nei dati di maggio e funziona abbastanza bene, ma come ha detto @thelatemail, forse una heatmap è l'opzione migliore. –

+1

In questo caso sarei certamente d'accordo. :) Ho modificato la mia risposta per documentare che come opzione: –

+0

@Forrens R. Stevens, in questo modo sembra molto meglio! Analizzando i nuovi grafici sto pensando a qualcosa di un po 'diverso, forse puoi aiutarmi anche con questo: Voglio fare un altro grafico usando "istogrammi indipendenti" per ogni classe 'x' tracciata insieme. Giusto per chiarire: il somatory di ogni colonna nell'esempio dovrebbe essere 1. In questo caso, non ci saranno valori super alti nella scala, ma una heatmap più liscia che varia da 0 a 1. –