【问题标题】:want to calculate percent of "True" for each bin in a histogram ggplot2想要计算直方图中每个 bin 的“真”百分比 ggplot2
【发布时间】:2020-05-26 17:24:36
【问题描述】:

我有一个包含商业投标信息的数据框。我想创建一个直方图,显示为每个 bin 预订的投标百分比。 x 轴应该是价格,y 轴应该是在该箱内预订的投标的百分比。

我的代码过滤数据两年,然后使用 ggplot 2 库创建直方图。在本例中,“booked”是一个逻辑变量,“price”是一个连续数字。这是我的代码:

exp_data %>% filter(yr>=2019 & yr<=2020) %>% 
ggplot(aes(price)) +
geom_histogram(aes(y=mean(booked)),binwidth=500)

当我运行代码时,我收到以下错误:

错误:stat_bin() 不得与 y 美学一起使用。

我也试过了

exp_data %>% filter(yr>=2019 & yr<=2020) %>% 
  ggplot(aes(price)) +
  geom_histogram(aes(y=((..booked==TRUE..)/(..count..))),binwidth=500)

该代码产生此错误: FUN(X[[i]], ...) 中的错误:找不到对象“..booked”

我猜我只是不知道请求我想要得到的数学函数的正确方法。有人可以帮我学习如何做到这一点吗?

这是一个示例数据框: ''' exp_data <- data.frame(price=abs(rnorm(100))*10000, booked=sample(c(TRUE,FALSE),size=100,replace = TRUE))

使用这段代码,我可以绘制真假计数并堆叠/躲避它们,但我真正想知道的是真假的百分比。

exp_data %>% ggplot(aes(price)) + geom_histogram(aes(fill=booked),position="dodge")

plot of dodged counts

【问题讨论】:

  • 一小部分数据样本可以让您更轻松地解决问题。
  • 在文档中,我看到“stat_bin() 仅适用于连续 x 数据。如果您的 x 数据是离散的,您可能想要使用 stat_count()。”这可能是您问题的一部分。另请注意,它似乎期望与 x 美学相关联,而不是 y。看看那里的例子。
  • 嗨 Viper,欢迎来到 Stack Overflow。正如 Pedro 所建议的,如果您使用dput(exp_data) 提供至少一个数据样本,或者如果您的数据非常大dput(exp_data[1:10,]),那么提供帮助会容易得多。您可以编辑您的问题并粘贴输出。您可以用三个反引号 (```) 将其括起来以获得更好的格式。请参阅How to make a reproducible example 了解更多信息。

标签: r ggplot2


【解决方案1】:

在 OP 更新帖子并提供示例数据后进行编辑。

如前所述,您应该开始创建要绘制的数据,并且不要在绘图调用中实现过多的统计信息。 %/% 将每个价格除以 500 并向下舍入到最接近的整数。 下面我从垃圾箱生成标签,例如bin 1 将转换为“0-500$”;您必须指定级别,否则桶将根据其第一个字符排序,然后是第二个字符。因此,您最终会在 200 之前得到 1000。最后,您必须确保旋转标签。最重要的是,下面的图表是自定义的条形图,而不是直方图。直方图计算存储桶中相对于 x 轴的观察数量,而您显示的是每个存储桶的汇总统计数据。

exp_data <- data.frame(price=abs(rnorm(100))*10000, 
                       booked=sample(c(TRUE,FALSE),size=100,replace = TRUE))


library(tidyverse)
perc_booked <- exp_data %>% 
  mutate(bin = price %/% 500) %>% 
  group_by(bin) %>% 
  summarise(percent = mean(booked) * 100)   

perc_booked %>% 
  mutate(label = factor(paste0((bin - 1) * 500, "-", bin * 500, "$"), levels = paste0((bin - 1) * 500, "-", bin * 500, "$"))) %>% 
  ggplot(aes(x = label, y = percent)) +
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text("angle" = 90)) + 
  xlab("") +
  ylab("Percent Booked")

【讨论】:

  • 这不完全是我想要做的。在商业术语中,我试图为每增加 500 美元的价格增量创建一个中标率(转换率)的直方图
  • 改变我的答案。您当然可以选择您喜欢的任何 x 轴标签。除非您移动标签,否则它们将出现在 介于 刻度线之间,即您不会将刻度线标记为 0、500 等,而是标记它们之间的范围。
猜你喜欢
  • 2020-09-21
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多