Подтвердить что ты не робот

Использование атрибутов цвета и размера в Hexagon Binning (ggplot2)

Я надеюсь построить несколько диаграмм, чтобы отобразить тенденции/эффективность некоторых игроков и команд НБА. Я хотел бы отформатировать шестиугольники следующим образом: размер будет представлять количество снимков, а цвет будет представлять относительную эффективность (pts/try) из этого местоположения. Вот отличный пример того, что я ищу, созданный Kirk Goldsberry:

Ray Allen, by Kirk Goldsberry

Я смог использовать hexbins и hexTapply для достижения чего-то близкого к желаемому результату, но формы - круги. Вот мой код (который включает примеры данных):

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  = [email protected], 
          yCoord  = [email protected], FGA = [email protected], 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")

Еще один способ подумать об этом - это раскрасить шестиугольники в plot(h, style="lattice") с помощью pts/try - но я не уверен, как это сделать.

Есть ли способ получить этот граф с шестиугольниками, а не с кругами?

4b9b3361

Ответ 1

Сначала спасибо за этот вопрос и за то, что разделили этот сюжет с большим воображением!

Вот попытка с использованием пакета lattice. В основном я реализую вам идею: окрашивание шестиугольников в сюжет (h, style = "решетка" ) с помощью pts/try ". Использование решетки также мотивируется тем, что вы можете использовать функции grid в рамках функций решетчатой ​​панели (например, для рисования наземных деталей)

Я генерирую некоторые данные

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

здесь сюжет:

    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

EDIT Использование OP real данные. Я получаю этот сюжет. Вам нужно сыграть с minarea и `` maxarea argument to define overlapping regions. I add also an image as abckground using grid.raster`. У меня нет навыков сюжета, поэтому я выбираю один из них, но вы можете использовать эту технику, чтобы добавить землю. Я уверен, что вы можете сделать лучший образ.

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