Domanda Utilizzo degli attributi di colore e dimensione in Hexagon Binning (ggplot2)


Spero di costruire alcuni grafici per mostrare le tendenze di tiro / efficacia di alcuni giocatori e squadre NBA. Mi piacerebbe formattare gli esagoni come segue: la dimensione rappresenterà il numero di colpi e il colore rappresenterà l'efficienza relativa (punti / tentativo) da quella posizione. Ecco un grande esempio di quello che sto cercando, creato da Kirk Goldsberry:

Ray Allen, by Kirk Goldsberry

Sono stato in grado di usare hexbins e hexTapply per ottenere qualcosa vicino al risultato desiderato, ma le forme sono cerchi. Ecco il mio codice (che include dati di esempio):

library(hexbin); library(ggplot2)
df <- read.table(text="xCoord yCoord   pts
11.4     14.9     2
2.6       1.1      0
4.8       4.1      2
-14.4    8.2      2
4.2       0.3      0
0.4       0.0     2
-23.2   -1.1      3", header=TRUE)
h <- hexbin (x=df$xCoord, y = df$yCoord, IDs = TRUE, xbins=50)
pts.binned <- hexTapply (h, df$pts, FUN=mean)

df.binned <- data.frame (xCoord  = h@xcm, 
          yCoord  = h@ycm, FGA = h@count, pts = pts.binned)

chart.player <- ggplot (df.binned, aes (x =xCoord , 
                  y =yCoord , col = pts, size = FGA)) + coord_fixed() + 
geom_point()  + scale_colour_gradient("Points/Attempt", low = "green", high="red")

Un altro modo per pensarci sarebbe colorare gli esagoni in plot(h, style="lattice") da pts / tentativo - ma non sono sicuro di come farlo, neanche.

C'è un modo per ottenere questo grafico con esagoni anziché cerchi?


18
2018-02-12 18:54


origine


risposte:


Innanzitutto grazie per questa domanda e per aver condiviso questa trama con grande immaginazione!

Ecco un tentativo di utilizzo lattice pacchetto. Principalmente mi occupo di ideare: colorare gli esagoni nella trama (h, style = "reticolo") di pts / attempt ". L'uso del reticolo è anche motivato dal fatto che è possibile utilizzare grid funzioni all'interno delle funzioni del pannello reticolo (per disegnare i dettagli del terreno per esempio)

Genero alcuni dati

dat <- data.frame(
  xCoord = round(runif(1000,-30,30),2),
  yCoord = round(runif(1000,-2,30),2),
  pts = sample(c(0,2,3),100,rep=T))
#dat$pts[dat$xCoord <0 & dat$yCoord] <- 3

qui la trama:

    xyplot(yCoord~xCoord,data =dat , panel = function(x,y,...)
   {
     hbin<-hexbin(dat$xCoord,dat$yCoord,xbins=50,IDs=TRUE)
     mtrans<-hexTapply(hbin,dat$pts,sum,na.rm=TRUE)
     cols <- rainbow( 4,alpha=0.5)
     grid.hexagons(hbin, style='lattice',
                   ,minarea=0.5,maxarea=5,colorcut=c(0,.6,1),
                   border=NA,
                   pen=cols[mtrans+1])
     ## Now you can get fun to draw the ground here
     ## something like...
     ## grid.circle(gp=gpar(fill=NA))
   })

enter image description here

MODIFICARE Usando OP reale dati. Ho questa trama. Devi giocare con minarea e `` maxareaargument to define overlapping regions. I add also an image as abckground usinggrid.raster`. Non ho capacità di trama, quindi ne scelgo uno da lui netto, ma puoi usare questa tecnica per aggiungere un terreno. Sono sicuro che puoi fare un'immagine migliore.

library(lattice)
library(hexbin)
library(png)
xyplot(locationY~locationX,data =dat , panel = function(x,y,...)
{
    ## imgae bakground
    m <- readPNG('basket.png')
    rimg <- as.raster(m)
    grid.raster(rimg, x=0, y=61.5, just="top", width=50,
              default.units = "native")
    panel.fill(col=rgb(1,1,1,alpha=0.8))

    hbin<-hexbin(dat$locationX,dat$locationY,xbins=50,IDs=TRUE)
    mtrans<-hexTapply(hbin,dat$Points,sum,na.rm=TRUE)
    cols <- rainbow(4)
    grid.hexagons(hbin, style='lattice',
                  ,minarea=0.1,maxarea=50,colorcut=c(0,.6,1),
                  border=NA,
                  pen=cols[mtrans+1])
})

enter image description here


9
2018-02-13 04:46