2014-12-15 14 views
6

Desidero costruire un grafico, essenzialmente identico a quello che posso produrre usando il layer ggplot 'stat_bin2d', tuttavia invece dei conteggi che vengono mappati su una variabile, voglio che i conteggi associati al bin siano visualizzati come etichetta per ogni cestinoCome utilizzare stat_bin2d() per calcolare le etichette dei conteggi in ggplot2?

ho ottenuto il seguente soluzione al problema 1D equivalente da another thread

data <- data.frame(x = rnorm(1000), y = rnorm(1000)) 

ggplot(data, aes(x = x)) + 
    stat_bin() + 
    stat_bin(geom="text", aes(label=..count..), vjust=-1.5) 

I conteggi per ogni bin sono chiaramente etichettati. Tuttavia, passando dal caso 1D al 2D, questo funziona,

ggplot(data, aes(x = x, y = y)) + 
    stat_bin2d() 

Ma questo restituisce un errore.

ggplot(data, aes(x = x, y = y)) + 
    stat_bin2d() + 
    stat_bin2d(geom="text", aes(label=..count..)) 

Error: geom_text requires the following missing aesthetics: x, y 
+3

Prendetevi il tempo per creare un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a -great-r-reproducible-example) con input di esempio in modo che sia chiaro come sono i tuoi dati. Mostra i tuoi tentativi finora. Descrivi esattamente dove ti stai bloccando. – MrFlick

+1

Appologie, ho postato per sbaglio quando non volevo. Ho aggiornato! – user4009949

+0

L'ultimo commento che ho trovato su questo argomento è venuto da [Hadley nel 2010] (https://groups.google.com/forum/#!topic/ggplot2/6lx_mYJVf3w) in cui dice che non si può usare 'stat_bin2d', dovrai fare il riepilogo tu stesso. – MrFlick

risposta

3

Ho accidentalmente risposto alla tua domanda scrivendo una mia domanda. Ho capito che stat_bin2d funzionerà quando si converte la variabile che si sta binning a partire dal numero di testo, in modo:

library(ggplot2) 
data <- data.frame(x = rnorm(1000), y = rnorm(1000)) 
x_t<-as.character(round(data$x,.1)) 
y_t<-as.character(round(data$y,.1)) 
x_x<-as.character(seq(-3,3),1) 
y_y<-as.character(seq(-3,3),1) 
data<-cbind(data,x_t,y_t) 



ggplot(data, aes(x = x_t, y = y_t)) + 
    geom_bin2d() + 
    stat_bin2d(geom="text", aes(label=..count..))+ 
    scale_x_discrete(limits =x_x) + 
    scale_y_discrete(limits=y_y) 

Così ci si va. Sfortunatamente devi impostare le larghezze di banda al di fuori di ggplot(), quindi non è una soluzione ideale. Non so perché funzioni quando converti le variabili in testo, ma è così.

+1

Non è necessario eseguire questa conversione di caratteri. Forse questa è stata una soluzione appropriata quando questa risposta è stata originariamente pubblicata, ma non è necessaria nelle versioni più recenti di 'ggplot'. Vedi la mia risposta. – Andrie

+0

Grande! Sono contento che abbiano funzionato. Binning al di fuori di ggplot() non era la fine del mondo, ma è molto più conveniente farlo all'interno di ggplot(). – SeldomSeenSlim

5

Nelle versioni più recenti di ggplot questo è perfettamente possibile e funziona senza errori.

Assicurati di utilizzare gli stessi argomenti sia per chiamare stat_bin2d(). Ad esempio, impostare binwidth = 1 su entrambe le linee:

library(ggplot2) 
data <- data.frame(x = rnorm(1000), y = rnorm(1000)) 

ggplot(data, aes(x = x, y = y)) + 
    geom_bin2d(binwidth = 1) + 
    stat_bin2d(geom = "text", aes(label = ..count..), binwidth = 1) + 
    scale_fill_gradient(low = "white", high = "red") + 
    xlim(-4, 4) + 
    ylim(-4, 4) + 
    coord_equal() 

enter image description here

Problemi correlati