【问题标题】:Can I use geom_text or similar to add group by sum rather than amending original data frame?我可以使用 geom_text 或类似方法按总和添加组而不是修改原始数据框吗?
【发布时间】:2017-06-22 06:19:50
【问题描述】:

这是一个条形图:

ggplot(filtered_funnel, aes(x = reorder(Funnel, -Sessions), y = Sessions)) +
      geom_bar(stat = "identity", fill = "#008080", alpha = 0.6) +
      xlab("Step") +
      ylab("Events") +
      scale_y_continuous(labels = function(l) {l = l / 1000; paste0(l, "K")}) +
      geom_text(aes(label = Sessions, group = Channel), color = "white")

看起来像这样(注意白色的文本标签):

这是因为数据 df filtered_funnel 实际上是由字段“Channel”分割出来的。我需要酒吧基于例如的分组总和。会话而不是每个单独的频道会话。

这里是源数据的一瞥:

> glimpse(filtered_funnel)
Observations: 108
Variables: 4
$ Channel  <chr> "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", ...
$ Promo    <chr> "apples", "apples", "apples", "banannas", "banannas", "banannas", "carrots", "carrots", "carrots", "none", "none", "none...
$ Funnel   <chr> "Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetai...
$ Sessions <dbl> 3993, 6332, 2224, 1237, 1962, 689, 2234, 3543, 1244, 42378, 4672, 28120, 87187, 7408, 2602, 611, 969, 340, 4462, 7280, 2...


filtered_funnel
Source: local data frame [108 x 4]
Groups: Channel, Promo [?]

   Channel    Promo          Funnel Sessions
     <chr>    <chr>           <chr>    <dbl>
1   Direct   apples        Checkout     3993
2   Direct   apples ShippingDetails     6332
3   Direct   apples    Transactions     2224
4   Direct banannas        Checkout     1237
5   Direct banannas ShippingDetails     1962
6   Direct banannas    Transactions      689
7   Direct  carrots        Checkout     2234
8   Direct  carrots ShippingDetails     3543
9   Direct  carrots    Transactions     1244
10  Direct     none       AddToCart    42378
# ... with 98 more rows

看起来 ggplot 正在添加每个组件的单个值而不是总和,例如仅用于图像中的第一个栏(会话步骤)

> filtered_funnel %>% filter(Funnel == "Sessions")
Source: local data frame [6 x 4]
Groups: Channel, Promo [6]

   Channel Promo   Funnel Sessions
     <chr> <chr>    <chr>    <dbl>
1   Direct  none Sessions    87187
2    Email  none Sessions   110035
3 Facebook  none Sessions    79734
4  Organic  none Sessions    80768
5      SEM  none Sessions    94610
6  Youtube  none Sessions    66681

我可以在图像和表格中看到值 110035。我真正想要 ggplot 做的是添加会话的总和。

由于这是在 Shiny 应用程序中完成的,因此我试图避免干预源数据,因为我使用过滤器框输入来过滤数据框。此外,我看到其他 SO 答案似乎表明我想做什么是可能的,我只是无法让它工作,例如

如何让 ggplot 添加每个条的总和?我可以使用 ggplot 分组和求和而不是更改我在 aes 中输入 ggplot 的源数据吗?

---- 数据输入--- 发表评论后,这是数据(无论如何都是随机生成的,因此没有 NDA 问题)

> dput(filtered_funnel)
structure(list(Channel = c("Direct", "Direct", "Direct", "Direct", 
"Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", 
"Direct", "Direct", "Direct", "Direct", "Direct", "Direct", "Direct", 
"Email", "Email", "Email", "Email", "Email", "Email", "Email", 
"Email", "Email", "Email", "Email", "Email", "Email", "Email", 
"Email", "Email", "Email", "Email", "Facebook", "Facebook", "Facebook", 
"Facebook", "Facebook", "Facebook", "Facebook", "Facebook", "Facebook", 
"Facebook", "Facebook", "Facebook", "Facebook", "Facebook", "Facebook", 
"Facebook", "Facebook", "Facebook", "Organic", "Organic", "Organic", 
"Organic", "Organic", "Organic", "Organic", "Organic", "Organic", 
"Organic", "Organic", "Organic", "Organic", "Organic", "Organic", 
"Organic", "Organic", "Organic", "SEM", "SEM", "SEM", "SEM", 
"SEM", "SEM", "SEM", "SEM", "SEM", "SEM", "SEM", "SEM", "SEM", 
"SEM", "SEM", "SEM", "SEM", "SEM", "Youtube", "Youtube", "Youtube", 
"Youtube", "Youtube", "Youtube", "Youtube", "Youtube", "Youtube", 
"Youtube", "Youtube", "Youtube", "Youtube", "Youtube", "Youtube", 
"Youtube", "Youtube", "Youtube"), Promo = c("apples", "apples", 
"apples", "banannas", "banannas", "banannas", "carrots", "carrots", 
"carrots", "none", "none", "none", "none", "none", "none", "pears", 
"pears", "pears", "apples", "apples", "apples", "banannas", "banannas", 
"banannas", "carrots", "carrots", "carrots", "none", "none", 
"none", "none", "none", "none", "pears", "pears", "pears", "apples", 
"apples", "apples", "banannas", "banannas", "banannas", "carrots", 
"carrots", "carrots", "none", "none", "none", "none", "none", 
"none", "pears", "pears", "pears", "apples", "apples", "apples", 
"banannas", "banannas", "banannas", "carrots", "carrots", "carrots", 
"none", "none", "none", "none", "none", "none", "pears", "pears", 
"pears", "apples", "apples", "apples", "banannas", "banannas", 
"banannas", "carrots", "carrots", "carrots", "none", "none", 
"none", "none", "none", "none", "pears", "pears", "pears", "apples", 
"apples", "apples", "banannas", "banannas", "banannas", "carrots", 
"carrots", "carrots", "none", "none", "none", "none", "none", 
"none", "pears", "pears", "pears"), Funnel = c("Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "Checkout", "ShippingDetails", 
"Transactions", "Checkout", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions", "AddToCart", "Checkout", 
"Registrations", "Sessions", "ShippingDetails", "Transactions", 
"Checkout", "ShippingDetails", "Transactions"), Sessions = c(3993, 
6332, 2224, 1237, 1962, 689, 2234, 3543, 1244, 42378, 4672, 28120, 
87187, 7408, 2602, 611, 969, 340, 4462, 7280, 2304, 549, 896, 
283, 2094, 3417, 1081, 42251, 5666, 29094, 110035, 9244, 2926, 
256, 418, 132, 129, 191, 85, 3078, 4557, 2039, 120, 178, 79, 
13977, 90, 9727, 79734, 134, 59, 1142, 1691, 756, 3125, 4655, 
1985, 1724, 2568, 1095, 3109, 4631, 1975, 34756, 2864, 23453, 
80768, 4266, 1819, 249, 371, 158, 1839, 2661, 1223, 1543, 2232, 
1026, 2007, 2904, 1335, 24090, 1792, 15272, 94610, 2593, 1192, 
479, 693, 318, 800, 1245, 522, 1734, 2698, 1132, 930, 1447, 607, 
22349, 1436, 14478, 66681, 2235, 937, 1579, 2457, 1031)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -108L), drop = TRUE, .Names = c("Channel", "Promo", 
"Funnel", "Sessions"), indices = list(0:2, 3:5, 6:8, 9:14, 15:17, 
    18:20, 21:23, 24:26, 27:32, 33:35, 36:38, 39:41, 42:44, 45:50, 
    51:53, 54:56, 57:59, 60:62, 63:68, 69:71, 72:74, 75:77, 78:80, 
    81:86, 87:89, 90:92, 93:95, 96:98, 99:104, 105:107), group_sizes = c(3L, 
3L, 3L, 6L, 3L, 3L, 3L, 3L, 6L, 3L, 3L, 3L, 3L, 6L, 3L, 3L, 3L, 
3L, 6L, 3L, 3L, 3L, 3L, 6L, 3L, 3L, 3L, 3L, 6L, 3L), biggest_group_size = 6L, labels = structure(list(
    Channel = c("Direct", "Direct", "Direct", "Direct", "Direct", 
    "Email", "Email", "Email", "Email", "Email", "Facebook", 
    "Facebook", "Facebook", "Facebook", "Facebook", "Organic", 
    "Organic", "Organic", "Organic", "Organic", "SEM", "SEM", 
    "SEM", "SEM", "SEM", "Youtube", "Youtube", "Youtube", "Youtube", 
    "Youtube"), Promo = c("apples", "banannas", "carrots", "none", 
    "pears", "apples", "banannas", "carrots", "none", "pears", 
    "apples", "banannas", "carrots", "none", "pears", "apples", 
    "banannas", "carrots", "none", "pears", "apples", "banannas", 
    "carrots", "none", "pears", "apples", "banannas", "carrots", 
    "none", "pears")), class = "data.frame", row.names = c(NA, 
-30L), drop = TRUE, .Names = c("Channel", 
"Promo")))

【问题讨论】:

  • 使用dput(filtered_funnel)分享您的数据
  • 您好现在添加了这个,感谢您的帮助

标签: r ggplot2


【解决方案1】:

您可以使用 stat_summary 计算总和,并将其用于 y 位置和标签:

ggplot(filtered_funnel, aes(x = reorder(Funnel, -Sessions), y = Sessions)) +
  geom_bar(stat = "identity", fill = "#008080", alpha = 0.6) +
  stat_summary(
    aes(label = stat(y)), fun.y = 'sum', geom = 'text', col = 'white', vjust = 1.5
  ) +
  scale_y_continuous(labels = function(l) {l = l / 1000; paste0(l, "K")})  +
  xlab("Step") + ylab("Events")

【讨论】:

  • 非常感谢(再次)!这很棒。我可以问一些后续吗?什么是..y..?你为什么选择(你怎么知道选择)stat_summary() 而不是geom_text()
  • ..y.. 是计算的统计量。每个统计数据(identity 除外)都会在绘图之前计算一些值,您可以通过用.. 包围的名称访问这些值。您可以通过statsgeoms定义层,通常没关系,您也可以使用geom_text(aes(label = ..y..), fun.y = 'sum', stat = 'summary', col = 'white', vjust = 1.5)
  • 谢谢,这真的很有帮助。 “..y.. 是计算的统计量”。计算出来的统计数据是什么? fun.y = "sum"?我还能在标签上添加什么(甚至是一些荒谬的东西),让它真正点击? (希望您不介意后续跟进,我真的很重视您在有机会时提供的帮助)
  • stat_summary 为每个x 汇总y。所以它计算一个新的y。您可以使用..y.. 访问这个新的y。如果您使用..x..,您会得到数字 1 到 6。对于其他统计数据,您可以访问其他计算值。例如,如果您查看docs page 中的stat_bin,则有一个“计算变量”部分,其中包含多个选项,例如ndensity。当使用stat_bin 作为stat(直接或在geom 中)时,您可以使用..ndensity.. 访问此变量。
  • "stat_summary 为每个 x 总结 y"。点击。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2021-10-24
  • 2011-02-08
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多