【问题标题】:How to replicate a scatterplot with a hexbin plot in R?如何在R中复制带有hexbin图的散点图?
【发布时间】:2016-03-08 16:03:05
【问题描述】:

我相信我已经接近正确地使用十六进制图复制我的散点图了。

我当前的散点图:

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

散点图的样子:

我的十六进制图:

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,它没有正确显示“制造”或“错过”

我已经圈出了 hexbin 图中的主要问题区域。 深蓝色的区域实际上应该是深红色。散点图中绿色和深绿色的区域在六边形图中应该是红色和深红色。我尝试在 hexbin 图中更改 alpha,但无法将深蓝色更改为深红色。

任何帮助将不胜感激。我是使用 ggplot 的新手,所以如果需要任何进一步的信息,请告诉我。

【问题讨论】:

  • 您的问题不包含reproducible example。因此,很难理解您的问题并给您适当的答案。请提供您的数据(例如,使用dput())或使用 R 中的示例数据集之一。此外,将重现您的问题所需的最少代码添加到您的帖子中。
  • This post 似乎相关。

标签: r plot ggplot2


【解决方案1】:

如果没有可重现的示例,我无法确定,但我认为正在发生的情况是红色和蓝色六边形在重叠的命中和未命中的区域被绘制在彼此之上。您在这些区域看到的较暗颜色是混色的结果。解决方案是为六边形使用较小的 bin 大小。但是,如果在同一位置有命中和未命中,您仍然会有一些重叠的六边形。

这是一个假数据的例子:

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

下面的前两个图将绘图点与绘制六边形箱进行了比较。请注意,左下象限有很多重叠点。结果,有重叠的六边形。我们可以通过增加 bin 的数量来减少重叠六边形的数量,就像在底部图中所做的那样。

你喜欢六边形箱而不是点有什么原因吗? hexbins 只是计算球场每个区域的投篮命中数和投篮命中数。使 bin 足够小以最小化重叠基本上可以让您回到散点图(即 bin 的大小与点标记的大小差不多)。在这种情况下,您可以将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")

【讨论】:

  • 感谢您的回答。我认为更改 bin 大小可以解决我的问题,但无论我将大小更改为什么都没有改变。我尝试将大小更改为 1 一直到 500,但什么也没有。我想我必须上传数据。
  • 在您的代码中,尝试将geom_hex(aes(alpha= .3, fill = class, bins = 25))+ 更改为:geom_hex(aes(fill = class), alpha=0.3, bins = 25) +。只有您映射到美学的变量应该在aes 内。其他值和参数超出aes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多