我有一个数据集,其中一个坐标可以重复几次。 我想创建一个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,因为它可以使我的目标比我最初的想法更难。
是否可以使垃圾箱显示重复点的最大次数?
答案 0 :(得分:1)
我认为,在更多地使用数据之后,我现在明白了。图中的每个箱表示多个点,例如(9,9);(9,10)(10,9);(10,10)都在图中的单个箱中。我必须提醒一下,这是预期的行为。我不清楚为什么你不想这样做。相反,您似乎想要显示其中一个点的值(例如9,9)。
我不认为您可以通过致电stat_hexbin
或geom_tile
直接执行此操作,因为这些功能正在尝试忠实地代表所有数据。事实上,他们并不一定期待像你一样的离散坐标 - 它们在连续数据上同样有效。
出于您的目的,如果您想要更好的控制,您可能希望使用dplyr
并自己计算值,例如。 (使用magrittr
和countedData <-
dat %$%
table(x,y) %>%
as.data.frame()
ggplot(countedData
, aes(x = x
, y = y
, fill = Freq)) +
geom_tile()
):
stat_summary_hex
并且您可以从那里稍微播放一下表示,但它至少会更忠实地显示每个单独的坐标。
或者,您可以过滤原始数据,使其仅包含 在bin中的最大值。这将要求您匹配分箱,但至少可以选择。
为了完整起见,以下是如何调整@ {Nagra(OP)linked to的z
解决方案。请注意,还有一些额外的步骤,所以我不认为这是相当重复的。具体来说,上面的表格步骤需要生成可用作摘要的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
值得注意的是,我仍然认为@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)
可能更有用,即使它不是那么华丽。