2016-03-08 2 views
2

Я считаю, что я близок к правильному дублированию моего диаграммы рассеяния с графиком гексбина.Как реплицировать диаграмму рассеяния с помощью графика гексбина в R?

Мой текущий рассеивания:

ggplot(shotchart[shotchart$player_id==X,], aes(as.numeric(V1), as.numeric(V2))) + 
annotation_custom(court, -3, 100, -102, 3) + 
geom_point(aes(colour = class, alpha = 0.8), size = 3) + 
scale_color_manual(values = c("#008000", "#FF6347")) + 
guides(alpha = FALSE, size = FALSE) + 
xlim(-1, 102) + 
ylim(102, -3) + 
coord_fixed() 

Что рассеивания выглядит следующим образом: enter image description here

Мой hexbin участок:

ggplot(shotchart[shotchart$player_id==X,], aes(x=as.numeric(V1), y=as.numeric(V2))) + 
annotation_custom(court, -3, 100, -102, 3) + 
geom_hex(aes(alpha= .3, fill = class, bins = 25))+ 
guides(alpha = FALSE, size = FALSE) + 
xlim(-1, 102) + 
ylim(102, -3) + 
coord_fixed() 

Что hexbin сюжет выглядит следующим образом:

![enter image description here

Я считаю, что оба сюжета говорят одно и то же. Из сюжетов я хочу видеть, где были сделаны «выстрелы», и если выстрел был «сделан» или «пропущен». Диаграмма рассеивания прекрасно отображает это. Но для гексбона он неправильно отображает «сделан» или «пропущен»

Я обвел основные проблемные области на графике гексбина. Области, которые являются темно-синими, на самом деле должны быть темно-красного. диаграмма рассеяния, которая зеленая и темно-зеленая, должна быть красной и темно-красной на графике гексбина. Я попытался изменить alpha на графике гексбина, но я не смог изменить темно-синий на темно-красный.

Любая помощь будет Я новичок в использовании ggplot, поэтому, пожалуйста, дайте мне знать, нужна ли какая-либо дополнительная информация.

+0

Ваш вопрос не содержит [воспроизводимый пример] (http://stackoverflow.com/q/5963269/4303162).Поэтому трудно понять вашу проблему и дать вам соответствующий ответ. Пожалуйста, сделайте свои данные доступными (например, с помощью 'dput()') или используйте один из примеров наборов данных в R. Также добавьте минимальный код, необходимый для воспроизведения вашей проблемы на ваш пост. – Stibu

+0

[Это сообщение] (http://toddwschneider.com/posts/ballr-interactive-nba-shot-charts-with-r-and-shiny/) представляется актуальным. – Henrik

ответ

2

Без воспроизводимого примера я не могу быть уверенным, но я подумайте, что происходит, это то, что красные и синие шестиугольники строятся друг над другом в регионах, где есть перекрывающиеся сделанные и пропущенные выстрелы. Более темный цвет, который вы видите в этих регионах, является результатом смешивания цветов. Решение состоит в том, чтобы использовать меньшие размеры бункера для шестиугольников. Однако, если в одном и том же месте сделаны и пропущенные снимки, у вас все еще будут некоторые перекрывающиеся шестиугольники.

Вот пример с фальшивыми данными:

set.seed(494) 
dat = data.frame(x = c(runif(1000,0,0.5),runif(100,0.5,1)), y=c(runif(1000,0,0.5),runif(100,0.5,1)), 
       group=c("Made","Missed")) 

ggplot(dat, aes(x,y,colour=group)) + 
    geom_point(alpha=0.5) 

ggplot(dat, aes(x,y,fill=group)) + 
    geom_hex(alpha=0.5, bins=30) + ggtitle("bins=30") 

ggplot(dat, aes(x,y,fill=group)) + 
    geom_hex(alpha=0.5, bins=80) + ggtitle("bins=80") 

Первые два участка ниже сравнить точки замышляют заговор шестиугольные бункеров. Обратите внимание, что в нижнем левом квадранте много точек перекрытия. В результате имеются перекрывающиеся шестиугольники. Мы можем уменьшить количество перекрывающихся шестиугольников, увеличив количество ящиков, как это делается на нижнем графике.

enter image description here

enter image description here

Есть причина, вы предпочитаете шестиугольные бункеры вместо точек? Гекбины просто подсчитывают количество сделанных и пропущенных выстрелов в каждом районе суда. Создание бункеров, достаточно малых, чтобы свести к минимуму перекрытие, по существу возвращает вас к диаграмме рассеяния (т. Е. Ячейки имеют размер маркера точки). Вы могли бы просто использовать geom_point с гексагональными маркерами точки в этом случае. С другой стороны, вы действительно хотите узнать долю выстрелов в разных областях суда? Нечто подобное, например:

library(scales) 

dat$made.flg = ifelse(dat$group=="Made", 1, 0) 

ggplot(dat, aes(x, y, z=made.flg)) + 
    stat_summary_hex(fun=mean, bins=30) + 
    scale_fill_gradient(low="blue", high="red", labels=percent_format(), name="Pecent Made") 

enter image description here

+0

Благодарим вас за ответ. Я думал, что изменение размера корзины решит мою проблему, но независимо от того, что я изменю, размер ничего не изменится. Я попытался изменить размер до 1 до 500 и ничего. Я думаю, что мне придется загрузить данные. – Dre

+0

В вашем коде попробуйте изменить 'geom_hex (aes (alpha = .3, fill = class, bins = 25)) +' к этому: 'geom_hex (aes (fill = class), alpha = 0.3, bins = 25) + '. Только переменные, которые вы сопоставляете с эстетикой, должны быть внутри 'aes'. Другие значения и параметры выходят за пределы 'aes'. – eipi10

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