【问题标题】:Mapping variables to hexagon size and color with hex_bin使用 hex_bin 将变量映射到六边形大小和颜色
【发布时间】:2014-10-13 10:02:31
【问题描述】:

所以,我不久前找到了this code 关于如何将变量映射到六边形大小的信息,并尝试对其进行修改,以便可以将其用于绘制篮球投篮图表。我知道还有一些其他的帖子,比如this one,但我过去读过的帖子都没有回答我的问题。第一个确实有帮助,但我遇到了一个小问题:

假设我有一个数据框,其中包含 4 个变量 x、y、值(投篮得分;在篮球运动中,它是 2 或 3,取决于您投篮距离篮筐多远)和结果( 1 表示投篮命中,0 表示投篮未命中),基于 250 次观察。 250 个带有 x 和 y 坐标、值和结果的镜头。

例子:

     x         y     value outcome
1 169.7650 -316.5726     3   0
2  75.0775 -182.3126     2   0
3  94.0150 -147.4050     2   1
4 109.1650 -138.0068     2   0
5  87.7025 -146.0624     2   1

# dput below:

structure(list(x = c(169.765, 75.0775, 94.015, 109.165, 87.7025), 
y = c(-316.5726, -182.3126, -147.405, -138.0068, -146.0624), 
value = c(3L, 2L, 2L, 2L, 2L), outcome = c(0L, 0L, 1L, 0L, 1L)), 
.Names = c("x", "y", "value", "outcome"), class = "data.frame", row.names = c(NA, -5L))

负坐标,因为 (0/0) 在左上角。使用上面链接的第一个线程中的代码,我能够对我的数据进行分箱,但我只是不知道如何对分箱数据进行操作。这是我到目前为止得到的:

从此代码:

# devtools::install_git("https://github.com/hadley/densityvis.git")

library(densityvis)

bin = hex_bin(df$x, df$y, var4=df$value, frequency.to.area=TRUE)
hexes = hex_coord_df(x=bin$x, y=bin$y, 
                     width=attr(bin,"width"), height=attr(bin,"height"),
                     size=bin$size)
hexes$rightness = rep(bin$col, each=6)

ggplot(hexes, aes(x=x, y=y)) + geom_polygon(aes(fill=rightness, group=id))

尺寸显示从给定区域拍摄了多少张照片。颜色给出了来自该区域的镜头的价值。我想要的是每张照片的点数,意思是:将每个箱子的点数相加,然后除以拍摄的照片数量,范围从 0(没有拍摄)到 3(所有拍摄都来自 3 点区域)并显示只有至少有两次拍摄的垃圾箱。

我知道有很多问题要问,我的问题是我自己做不到。但如果有人有时间,任何帮助将不胜感激。

编辑: 我上传了创建上述图像here 的csv 样本。 我不知道将 300 行代码发布到一个问题中是否很酷,这就是我链接geotheory 的代码here 的原因。我稍微修改的例子在上面的代码括号中,我只是跑了

df <- read.csv("sample_data.csv", header=TRUE)

事先。

【问题讨论】:

  • 如果你能为每个坐标制作一个小饼图不是很好吗?大小对应于拍摄的照片数量,馅饼的大小对应于每个位置 2/3 点的比例。
  • 这是一个有趣的想法,谢谢!尽管我认为这可能太多了,因为您必须单独研究每个箱子才能了解玩家 X 如何从该点 Y 射击,而按效率着色的六边形(每次射击的点数)可以让您更好地总体了解从那个球员感觉最舒服的位置投篮,不是吗?
  • @roman_luštrik 查看ggsubplot
  • @geotheory uff,那个包需要做很多工作。 :)
  • 它可能看起来很简单,但实际上我发现它非常简单,例如在地图上叠加图表。只需寻找一个最小的例子。

标签: r ggplot2 binning


【解决方案1】:

正如 hex_bin 代码所代表的那样,零值观察被过滤掉了。这可以通过从clean_xy(github 中的第 117 行)中删除 &amp; var4 &gt; 0 参数来更改。然后是:

df$pts = 0
for(i in 1:nrow(df)) if(df$outcome[i] == 1) df$pts[i] = df$value[i]
bin = hex_bin(df$x, df$y, var4=df$pts, frequency.to.area=TRUE)
hexes = hex_coord_df(x=bin$x, y=bin$y, width=attr(bin,"width"), height=attr(bin,"height"), size=bin$size)
hexes$points = rep(bin$col, each=6)
ggplot(hexes, aes(x=x, y=y)) + geom_polygon(aes(fill=points, group=id))

给你:

这就是你要找的吗?

【讨论】:

  • 是的,非常感谢! :) 你能告诉我当我想过滤掉所有只有一/二/三个观察值的箱子时我必须看哪里吗?
  • 数据被分箱到hex_bin 中的binned 对象中。您只需要在过滤掉这些行之后添加binned &lt;- binned[binned$freq &gt; 3,]。如果这会过滤掉定义球场范围的数据,您可能需要重新指定绘图坐标。
  • 它现在为我所做的只是thisbinned &lt;- binned[binned$freq &gt; 2,],我希望这些垃圾箱能保持原来的位置并保持它们的大小,只是减去较小的垃圾箱。但我会弄清楚的。再次感谢,非常感谢您的帮助!
  • 我认为这就是您要求它做的事情。尝试使用 coord_cartesianxlimylim 参数来指定原始绘图限制。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多