直方图填充不代表某些分类中所有当前因子水平

时间:2019-05-31 00:19:54

标签: r ggplot2 histogram fill

我正在使用直方图来可视化商店中提供的饮料的各种价格的分布,并应用填充来表示每种价格水平内处于特定状态的商店的比例。填充中未显示某些级别,即使我非常确定它们已出现在数据中,也根本不存在某些垃圾箱。使我认为存在此问题的原因是,我在每个仓位上显示了另一个变量的平均值,并且给定了该标签的值,所以我最终无法实现的填充。

设置应该非常简单;我用x = price设置了geom_histogram,分配了填充(cpm.bins),并修改了x轴比例。如前所述,我添加了geom_text以显示每个bin的平均每千次展示费用。我注意到事情不对劲,并弄乱了数据框。

这是我正在使用的数据帧的一小部分,但我相信足以证明问题所在。

library(lemon)
library(ggplot2)

df1 <- data.table::fread(
  "id   size price         cpm.bin int.ave.cpm p.int
    420  12ounce  2.39            Good       32.50   2.4
    629  12ounce  2.78 Underperforming       18.00   2.8
    940  12ounce  2.49  Non-purchasing       22.00   2.5
    1653 12ounce  2.45            Good       22.00   2.5
    1660 12ounce  2.45            Good       22.00   2.5
    2561 20ounce  2.59 Underperforming       13.65   2.6
    2578 20ounce  2.39 Underperforming       26.02   2.4
    2580 20ounce  2.39 Underperforming       26.02   2.4
    2581 20ounce  2.39            Good       26.02   2.4
    2582 20ounce  2.39            Good       26.02   2.4
    2583 20ounce  2.39            Good       26.02   2.4
    2584 20ounce  2.39            Good       26.02   2.4
    2587 20ounce  2.49  Non-purchasing       20.05   2.5
    2589 20ounce  2.99 Underperforming       18.13   3.0
    2599 20ounce  2.49  Non-purchasing       20.05   2.5
    2600 20ounce  2.49 Underperforming       20.05   2.5
    2606 20ounce  2.59  Non-purchasing       13.65   2.6
    2607 20ounce  2.39            Good       26.02   2.4
    2609 20ounce  2.39 Underperforming       26.02   2.4
    2629 20ounce  2.49  Non-purchasing       20.05   2.5
  "
)

df2 <- data.table::fread(
  "id size price         cpm.bin int.ave.cpm p.int
  629  12ounce  2.78 Underperforming       18.00   2.8
  940  12ounce  2.49  Non-purchasing       22.00   2.5
  1653 12ounce  2.45            Good       22.00   2.5
  1660 12ounce  2.45            Good       22.00   2.5
  2561 20ounce  2.59 Underperforming       13.65   2.6
  2587 20ounce  2.49  Non-purchasing       20.05   2.5
  2589 20ounce  2.99 Underperforming       18.13   3.0
  2599 20ounce  2.49  Non-purchasing       20.05   2.5
  2600 20ounce  2.49 Underperforming       20.05   2.5
  2606 20ounce  2.59  Non-purchasing       13.65   2.6
  2629 20ounce  2.49  Non-purchasing       20.05   2.5
  2634 20ounce  2.59  Non-purchasing       13.65   2.6
  2658 20ounce  2.49 Underperforming       20.05   2.5
  2665 20ounce  2.59  Non-purchasing       13.65   2.6
  2671 20ounce  2.69  Non-purchasing       21.18   2.7
  2673 20ounce  2.69            Good       21.18   2.7
  2674 20ounce  2.69            Good       21.18   2.7
  2675 20ounce  2.69 Underperforming       21.18   2.7
  2676 20ounce  2.69            Good       21.18   2.7
  2677 20ounce  2.69            Good       21.18   2.7"
)

在将这些数据帧用于以下ggplot时,“ 12盎司”图中的$ 2.50容器有不同的填充。

ggplot(df1, aes(x = price)) +
  geom_histogram(aes(fill = cpm.bin), binwidth = 0.1, position = position_fill(), stat = "bin") +
  facet_rep_wrap(~size, nrow = 3, repeat.tick.labels = TRUE, scales = "free") +
  scale_x_continuous(breaks = seq(0, 10, by = 0.1), labels = scales::dollar) +
  geom_text(aes(x = p.int, y = 0.5, label=int.ave.cpm), size=4)

enter image description here

这些子集的唯一区别是p.int的最小可能值。对于df1,最小值为2.4,对于df2,最小值为2.5。

对于“ 12盎司”部分中的$ 2.50 bin,无论p的最小值是多少,填充应为2/3“好”(蓝色)和1/3“非购买”(红色)。整数是。这是怎么回事,以及如何解决此问题,以便在使用整个数据框时,我的图可以准确并按比例显示值?

谢谢。

1 个答案:

答案 0 :(得分:0)

为此,我将使用geom_bar()而不是geom_histogram()。我已经修改了代码以显示如何进行绘制。您仍然可以使用lemon包进行所有整洁的标记等。

# plot_1 <-
ggplot(df1) +
  geom_bar(aes(x = round(price, 1), fill = cpm.bin), width = 0.09) +
  facet_grid(~size) + 
  scale_fill_manual(values = c("dodgerblue2", "coral1", "mediumseagreen")) +
  xlim(2.3, 3.1) + ylim(0, 10) +
  #theme(legend.position = "none") +
  labs(title = "df1")

# plot_2 <-
ggplot(df2) +
  geom_bar(aes(x = round(price, 1), fill = cpm.bin), width = 0.09) +
  facet_grid(~size) +
  scale_fill_manual(values = c("dodgerblue2", "coral1", "mediumseagreen")) +
  xlim(2.3, 3.1) + ylim(0, 10) +
  labs(title = "df2")

# gridExtra::grid.arrange(plot_1, plot_2, nrow = 2)

enter image description here