torta - histograma en r ggplot
Usar atributos de color y tamaño en Hexagon Binning(ggplot2) (1)
Estoy esperando construir algunos cuadros para mostrar las tendencias de tiro / efectividad de algunos jugadores y equipos de la NBA. Me gustaría formatear los hexágonos de la siguiente manera: el tamaño representará el número de disparos y el color representará la eficiencia relativa (pts / intento) desde esa ubicación. Aquí hay un gran ejemplo de lo que estoy buscando, creado por Kirk Goldsberry:
He podido usar hexbins
y hexTapply
para lograr algo parecido al resultado deseado, pero las formas son círculos. Aquí está mi código (que incluye datos de muestra):
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")
Otra forma de pensarlo sería colorear los hexágonos en plot(h, style="lattice")
por puntos / intento, pero tampoco estoy seguro de cómo hacer eso.
¿Hay alguna manera de obtener este gráfico con hexágonos en lugar de círculos?
¡Primero gracias por esta pregunta y por compartir esta trama con gran imaginación!
Aquí un intento de usar el paquete de lattice
. Principalmente implemento su idea de: colorear los hexágonos en la trama (h, estilo = "celosía") por pts / intento ". El uso de celosía también está motivado por el hecho de que puede usar funciones de grid
dentro de las funciones del panel de celosía (para dibujar los detalles del terreno, por ejemplo)
Genero algunos datos
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
aquí 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))
})
EDITAR usando OP datos reales. Obtengo esta trama Necesita jugar con minarea
y el argument to define overlapping regions. I add also an image as abckground using
`` maxarea argument to define overlapping regions. I add also an image as abckground using
argument to define overlapping regions. I add also an image as abckground using
grid.raster`. No tengo habilidades de trama, así que elijo una de la red, pero puedes usar esta técnica para agregar un terreno. Estoy seguro de que puedes hacer una mejor imagen.
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])
})