2016-05-31 6 views
0

Я пытаюсь создать диаграмму выстрела из баскетбола, и я пришел, чтобы насладиться видом графика решетчатой ​​диаграммы, но мне кажется, что я не могу совмещать (или, поместив поверх) его с помощью ggplot дизайн суда. Есть какой-либо способ сделать это? Или мне нужно в конечном итоге использовать суд в качестве растрового изображения в фоновом режиме (который уже дает мне возможность для угадывания и проверки координат изображения)?R: Возможно ли комбинировать графический график xy с ggplot?

Вот пример для кадра dat данных

 location_x location_y points 
1   5.5  22.1  2 
2   6.0  24.1  2 
3   6.1  39.4  2 
4  25.3  38.7  0 
5   8.0  24.4  2 
6   8.8  12.7  0 
7   9.0  6.0  0 
8  10.6  31.6  0 
9   4.2  47.5  0 
10  4.3  8.9  2 

EDIT: Ниже мой код, благодаря помощи поста: Using both color and size attributes in Hexagon Binning (ggplot2). Линия geom_path - это то, что используется для привлечения суда. Ошибка, что я в настоящее время получаю:

Error: Don't know how to add o to a plot

dat = mod_shots[mod_shots$player_id == 398068, ] 

lattice_plot = xyplot(location_x~location_y, data = dat, panel = function(x,y,...) 
{ 
    hbin = hexbin(dat$location_y, dat$location_x, xbins=40, IDs=TRUE) 
    mtrans = hexTapply(hbin, dat$points, sum, na.rm=TRUE) 
    cols = rev(heat.colors(7)) 
    grid.hexagons(hbin, style='lattice', 
       minarea=0.1,maxarea=3, 
       border="NA", 
       pen=cols[mtrans+1]) 
}) 

ggplot() + geom_path(data = court_points, 
      aes(x = x, y = y, z = NULL, group = desc, linetype = dash), 
      color = "#000004") + lattice_plot 
+4

Небольшой, воспроизводимый пример делает этот вопрос гораздо лучше. – Gregor

+0

@Gregor отредактировал – Agrosel

+2

Лучше, все еще не воспроизводим. У нас нет данных 'mod_shots', поэтому у нас нет' dat' ... sharing 'dput (dat)' или (если это слишком велико) 'dput (капли (head (dat, 10))) 'сделает ваши данные доступными для копирования/вставки. – Gregor

ответ

1

Вот сомнительная стратегия: место решетки панели в качестве аннотаций слоя внутри ggplot. Я сделал прозрачный слой решетки для иллюстрации (режим смешивания наживки).

enter image description here

library(grid) 
library(lattice) 
library(ggplot2) 

ghost_grob <- function(m, ...){ 
    grob(m=m, cl="ghost") 
} 

preDrawDetails.ghost <- function(x){ 
    pushViewport(viewport(xscale = c(0, 1 + ncol(x$m)), yscale = 
          c(0, 1 + nrow(x$m)))) 
} 
postDrawDetails.ghost <- function(x){ 
    upViewport(1) 
} 

drawDetails.ghost <- function(x, recording){ 
    panel.levelplot(col(x$m), row(x$m), x$m, alpha.regions = 0.5, 
        subscripts=TRUE, at = do.breaks(range(x$m), 30)) 
} 

grid.newpage() 
gpanel <- ghost_grob(volcano) 
# gpanel <- rectGrob() 
# grid.draw(gpanel) 

ggplot(faithfuld, aes(waiting, eruptions)) + 
    theme_minimal() + 
    scale_x_continuous(expand=c(0,0)) + 
    scale_y_continuous(expand=c(0,0)) + 
    geom_raster(aes(fill = density), interpolate = TRUE) + 
    scale_fill_gradient(low = "white", high="black") + 
    annotation_custom(gpanel, xmin = -Inf, xmax=Inf, ymin=-Inf, ymax=Inf) 

Добавление слоя шестиугольников требует некоторого понимания сеточных функций, предоставляемых hexbin. Я не знаю, как их использовать, поэтому я просто применил пример из ?hexpolygon для иллюстрации. Очевидно, масштабы и соотношение сторон здесь бессмысленны.

ghost_grob <- function(x=runif(20, -2, 2), y=x + rnorm(20), ...){ 
    grob(x=x, y=y, cl="ghost") 
} 

preDrawDetails.ghost <- function(x){ 
    addBit <- function(bnds, f = 0.05) bnds + c(-f, f) * diff(bnds) 
    sc <- addBit(rxy <- range(x$x, x$y)) 
    pushViewport(plotViewport(.1+c(4,4,2,1), xscale = sc, yscale = sc)) 
} 
postDrawDetails.ghost <- function(x){ 
    upViewport(1) 
} 

drawDetails.ghost <- function(x, recording){ 
    require(hexbin) 
    hexpolygon(x$x,x$y, hexcoords(dx = 0.1, sep=NULL), border = "blue", fill=NA) 
} 


grid.newpage() 
gpanel <- ghost_grob() 
# gpanel <- rectGrob() 
# grid.draw(gpanel) 

ggplot(faithfuld, aes(waiting, eruptions)) + 
    theme_bw() + 
    scale_x_continuous(expand=c(0,0)) + 
    scale_y_continuous(expand=c(0,0)) + 
    geom_raster(aes(fill = density), interpolate = TRUE) + 
    scale_fill_gradient(low = "white", high="black") + 
    annotation_custom(gpanel, xmin = -Inf, xmax=Inf, ymin=-Inf, ymax=Inf) 

enter image description here

+0

Я все еще получаю сообщение об ошибке при запуске кода, но вместо объекта 'volcano' заменяется' lattice_plot'. Он говорит: «Ошибка в valid.viewport (х, у, ширина, высота, всего, Г.П., клип, XScale, yscale,: недействителен„XScale“в окне просмотра» Но я не совсем уверен, что это что я должен был делать честно. @baptiste – Agrosel

Смежные вопросы