2017-10-19 62 views
1

我有一个geom_bar绘图,标签上显示了每个条形图的值。在ggplot上添加条间百分比变化

这里是产生积代码:

# libraries 
library(shiny) 
library(tidyverse) 

# funnel bar blot 
    output$funnel_plot <- renderPlot({ 
    ggplot(exampledf, aes(x = reorder(Funnel, -Sessions), y = Sessions)) + 
     geom_bar(stat = "identity", fill = "#008080", alpha = 0.6) + 
     stat_summary(aes(label = scales::comma(..y..)), fun.y = 'sum', geom = 'text', col = 'white', vjust = 1.5) + 
     xlab("Step") + 
     ylab("Events") + 
     scale_y_continuous(labels = function(l) {l = l/1000; paste0(l, "K")}) 
    }) 

这里是一个数据帧喂进去。

exampledf <- structure(list(Channel = c("Facebook", "Youtube", "SEM", "Organic", 
"Direct", "Email", "Facebook", "Youtube", "SEM", "Organic", "Direct", 
"Email", "Facebook", "Youtube", "SEM", "Organic", "Direct", "Email", 
"Facebook", "Youtube", "SEM", "Organic", "Direct", "Email"), 
    Promo = c("None", "None", "None", "None", "None", "None", 
    "Partner Offer", "Partner Offer", "Partner Offer", "Partner Offer", 
    "Partner Offer", "Partner Offer", "Print Code", "Print Code", 
    "Print Code", "Print Code", "Print Code", "Print Code", "Affiliate Promo", 
    "Affiliate Promo", "Affiliate Promo", "Affiliate Promo", 
    "Affiliate Promo", "Affiliate Promo"), Sessions = c(26126, 
    16885, 32229, 2446, 16353, 79202, 7688, 83475, 48834, 53475, 
    71238, 78728, 76710, 125571, 125719, 17142, 103206, 181082, 
    27071, 42571, 716, 139871, 21676, 59560), AddToCart = c(7228, 
    4436, 8344, 575, 4275, 23681, 1982, 18489, 14433, 14995, 
    20769, 20119, 18471, 35566, 33423, 5187, 28138, 48186, 7140, 
    11602, 190, 35795, 5193, 17064), Registrations = c(2780, 
    1706, 3209, 221, 1644, 9108, 762, 7111, 5551, 5767, 7988, 
    7738, 7104, 13679, 12855, 1995, 10822, 18533, 2746, 4462, 
    73, 13767, 1997, 6563), ShippingDetails = c(1069, 656, 1234, 
    85, 632, 3503, 293, 2735, 2135, 2218, 3072, 2976, 2732, 5261, 
    4944, 767, 4162, 7128, 1056, 1716, 28, 5295, 768, 2524), 
    Checkout = c(668, 410, 771, 53, 395, 2189, 183, 1709, 1334, 
    1386, 1920, 1860, 1707, 3288, 3090, 479, 2601, 4455, 660, 
    1072, 17, 3309, 480, 1577), Transactions = c(556, 341, 642, 
    44, 329, 1824, 152, 1424, 1111, 1155, 1600, 1550, 1422, 2740, 
    2575, 399, 2167, 3712, 550, 893, 14, 2757, 400, 1314)), class = "data.frame", row.names = c(NA, 
-24L), .Names = c("Channel", "Promo", "Sessions", "AddToCart", 
"Registrations", "ShippingDetails", "Checkout", "Transactions" 
)) 

这里的情节外观的屏幕截图: enter image description here

我想在添加显示变化的百分比各条之间的新线(新统计汇总吧?)。对于前两个小节,会话和增加到购物车,价值已经从1.4M变为385k =大约72%的下降。所以,我想在“酒吧”之间以某种方式显示“72%”。

有没有一个简单的方法来做到这一点?

我可以创建一个表格并在可视化下显示它,但我想看看它是如何将百分比下降添加到视觉本身。

我该如何增加每个条形阅读从左到右的百分比下降?

+0

也许相关替代:https://stackoverflow.com/questions/35854964/plot-a-simple-conversion-funnel-in-ggplot – zx8754

回答

4

你可以试试:

as.tbl(df) %>% 
    gather(key, value, -Channel, -Promo) %>% 
    group_by(key) %>% 
    summarise(Sum=sum(value)) %>% 
    arrange(-Sum) %>% 
    mutate(End=lag(Sum), 
     xpos=1:n()-0.5, 
     Diff=End-Sum, 
     Percent=paste(round(Diff/End*100,1),"%")) %>% 
    ggplot(aes(x = reorder(key, -Sum), y = Sum)) + 
    geom_col(alpha = 0.6) + 
    stat_summary(aes(label = scales::comma(..y..)), fun.y = 'sum', 
       geom = 'text', col = 'white', vjust = 1.5) + 
    geom_segment(aes(x=xpos, y = End, xend=xpos, yend=Sum)) + 
    geom_text(aes(x=xpos,y = End-Diff/2, label=Percent),hjust=-0.2) 

enter image description here

+0

尼斯,如果段加入每个酒吧管理的中点将欣喜若狂:) – OdeToMyFiddle

+0

不知道你的意思,试着将x和xend分别改为'... = reorder(key,-Sum)'。 – Jimbou

+0

这个方案是翔实的,比excel版本更好[excel条形图](https://www.codeproject.com/articles/3371/cool-graph-object-to-plot-column-and-line-graphs -i) – OdeToMyFiddle