Home > Back-end >  Joining 2 bar columns in barcharts with curved line
Joining 2 bar columns in barcharts with curved line

Time:10-03

I have below ggplot:

library(ggplot2)
data = rbind(data.frame('val' = c(10, 30, 15), 'name' = c('A', 'B', 'C'), group = 'gr1'), data.frame('val' = c(30, 40, 12), 'name' = c('A', 'B', 'C'), group = 'gr2'))
ggplot(data,                         # Draw barplot with grouping & stacking
       aes(x = group,
           y = val,
           fill = name))   
  geom_bar(stat = "identity",
           position = "stack", width = .1)

With this, I am getting below plot

enter image description here

However, I want to connect these bars with a curved area where the area would be equal to the value of the corresponding bar-component. A close example could be like,

enter image description here

Is there any way to achieve this with ggplot?

Any pointer will be very helpful.

CodePudding user response:

This is something like an alluvial plot. There are various extension packages that could help you create such a plot, but it is possible to do it in ggplot directly using a bit of data manipulation.

library(tidyverse)

alluvia <- data %>%
  group_by(name) %>%
  summarize(x = seq(1, 2, 0.01),
            val = pnorm(x, 1.5, 0.15) * diff(val)   first(val))

ggplot(data,                        
       aes(x = as.numeric(factor(group)),
           y = val,
           fill = name))  
    geom_bar(stat = "identity",
             position = "stack", width = .1)  
  geom_area(data = alluvia, aes(x = x), position = "stack", alpha = 0.5)  
  scale_x_continuous(breaks = 1:2, labels = levels(factor(data$group)),
                     name = "Group", expand = c(0.25, 0.25))  
  scale_fill_brewer(palette = "Set2")  
  theme_light(base_size = 20)

enter image description here

  • Related