2013-02-12 7 views
18

Mam nadzieję, że skonstruuję kilka wykresów, aby wyświetlić tendencje strzeleckie/skuteczność niektórych graczy i drużyn NBA. Chciałbym sformatować sześciokąty w następujący sposób: rozmiar będzie reprezentował liczbę strzałów, a kolor będzie reprezentował względną wydajność (pts/próbę) z tej lokalizacji. Here is a great example czego szukam, stworzony przez Kirk Goldsberry:Używanie atrybutów koloru i rozmiaru w Hexagon Binning (ggplot2)

Ray Allen, by Kirk Goldsberry

byłem w stanie wykorzystać hexbins i hexTapply osiągnąć coś podobnego do pożądanego wyniku, ale kształty są kręgi. Tu jest mój kodu (który zawiera przykładowe dane):

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") 

Innym sposobem, aby myśleć o tym, że będzie do barwienia sześciokątów w plot(h, style="lattice") przez pkt/próbę - ale nie jestem pewien jak to zrobić, albo .

Czy istnieje sposób na uzyskanie tego wykresu za pomocą sześciokątów zamiast okręgów?

+0

Tylko jestem ciekaw. jakie jest znaczenie ujemnych współrzędnych? Punkt jest liczony w koszyku, nawet gdy strzelasz poza ziemią? – agstudy

+0

Myślę, że lokalizacja koszyka to c (0,0). –

+0

To poprawne DWin. Współrzędne są w stopach i odnoszą się do koszyka przy 0,0. Tak więc strzał (-23,2, -1.1) byłby lewym 3 ruchem, który znajduje się 23.2 stóp na lewo od obręczy i prawie jedną stopę za środkiem obręczy. Zwróć uwagę, że obręcz znajduje się 5,2 stopy od linii podstawowej, więc ten strzał nadal znajduje się w polu gry. Dzięki za zmiany DWin – Wynnerbago

Odpowiedz

9

Najpierw dziękuję za to pytanie i za podzielenie się tą fabułą z wielką wyobraźnią! To jest próba użycia pakietu lattice Głównie implementuję Twój pomysł: kolorowanie sześciokątów w działce (h, styl = "krata") przez pts/próbę. "Wykorzystanie sieci jest również uzasadnione faktem, że możesz używać funkcji grid w funkcjach panelu sieciowego (do rysować szczegóły naziemne na przykład)

wygenerować pewne dane

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 

tutaj fabuła:

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

EDYCJA Używanie OP real data. Dostaję tę fabułę. Musisz grać z minarea i `` maxarea argument to define overlapping regions. I add also an image as abckground using grid.raster`. Nie mam umiejętności fabularnych, więc wybieram jedną z sieci, ale możesz użyć tej techniki, aby dodać grunt. Jestem pewien, że możesz zrobić lepszy obraz.

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

+0

Dzięki agstudy! Wypróbuję to dzisiaj i dam ci znać, jak to działa. – Wynnerbago

+0

Użyłem 'geom_path' do narysowania" linii sądowych ". Na przykład użyłem następującego kodu do narysowania zakrzywionej części linii 3-punktowej: 'arcX2 <-seq (długość = 5000, od = -22, do = 22) arcY2 <-sqrt (23.75^2-arcX2^2) arc2data <- data.frame (x = arcX2, y = arcY2) arctwo <-geom_path (dane = arc2data, aes (arcX2, arcY2), kolor = "szary", size = 1) 'Czy mogę użyć funkcje 'grid' działają podobnie? – Wynnerbago

+0

@Wynnerbago czy spróbowałeś przynajmniej tego na prawdziwych danych? dla twojego drugiego komentarza masz działkę ggplot2 i chciałbyś ją przekonwertować na działkę kratownic? is'ntit? – agstudy