在ggplot2 stat_binhex中显示每个bin的最大频率点

时间:2016-09-30 06:28:38

标签: r ggplot2

我有一个数据集,其中一个坐标可以重复几次。 我想创建一个hexbinplot,显示在该bin中重复坐标的最大次数。我正在使用R而我更愿意使用ggplot,因此图表与同一报告中的其他图表一致。

最小工作示例(分档显示的数量不是最大值):

library(ggplot2)
library(data.table)
set.seed(41)
dat<-data.table(x=sample(seq(-10,10,1),1000,replace=TRUE),
           y=sample(seq(-10,10,1),1000,replace=TRUE))
dat[,.N,by=c("x","y")][,max(N)]
# No bin should be over 9

p1 <- ggplot(dat,aes(x=x,y=y))+stat_binhex(bins=10)
p1

我认为这种方法应该与这个问题有关: calculating percentages for bins in ggplot2 stat_binhex但我不确定如何使其适应我的情况。 此外,我担心这个问题ggplot2: ..count.. not working with stat_bin_hex anymore,因为它可以使我的目标比我最初的想法更难。

是否可以使垃圾箱显示重复点的最大次数?

1 个答案:

答案 0 :(得分:1)

我认为,在更多地使用数据之后,我现在明白了。图中的每个箱表示多个点,例如(9,9);(9,10)(10,9);(10,10)都在图中的单个箱中。我必须提醒一下,这是预期的行为。我不清楚为什么你不想这样做。相反,您似乎想要显示其中一个点的值(例如9,9)。

我不认为您可以通过致电stat_hexbingeom_tile直接执行此操作,因为这些功能正在尝试忠实地代表所有数据。事实上,他们并不一定期待像你一样的离散坐标 - 它们在连续数据上同样有效。

出于您的目的,如果您想要更好的控制,您可能希望使用dplyr并自己计算值,例如。 (使用magrittrcountedData <- dat %$% table(x,y) %>% as.data.frame() ggplot(countedData , aes(x = x , y = y , fill = Freq)) + geom_tile() ):

stat_summary_hex

enter image description here

并且您可以从那里稍微播放一下表示,但它至少会更忠实地显示每个单独的坐标。

或者,您可以过滤原始数据,使其仅包含 在bin中的最大值。这将要求您匹配分箱,但至少可以选择。

为了完整起见,以下是如何调整@ {Nagra(OP)linked toz解决方案。请注意,还有一些额外的步骤,所以我不认为这是相当重复的。具体来说,上面的表格步骤需要生成可用作摘要的ggplot(countedData , aes(x = as.numeric(as.character(x)) , y = as.numeric(as.character(y)) , z = Freq)) + stat_summary_hex(fun = max, bins = 10 , col = "white") 的内容,然后您需要将x和y从因子转换回原始比例。

geom_tile

enter image description here

值得注意的是,我仍然认为@main.route('/post/<int:id>') def post(id): post = Post.query.get_or_404(id) form = CommentForm() if form.validate_on_submit(): comment = Comment(body = form.body.data, post = post, author = current_user._get_current_object()) db.session.add(comment) flash('Your comment has been published.') return redirect(url_for('.post',id = post.id, page = -1)) page = request.args.get('page',1,type=int) if page == -1: page = (post.comments.count()-1)//current_app.config['FLASKY_COMMENTS_PER_PAGE']+1 pagination = post.comments.order_by(Comment.timestamp.asc()).paginate( page,per_page = current_app.config['FLASKY_COMMENTS_PER_PAGE'], error_out = False) comments = pagination.items return render_template('post.html',posts=[post],form = form,comments=comments,pagination = pagination) 可能更有用,即使它不是那么华丽。