R-graph-gallery icon indicating copy to clipboard operation
R-graph-gallery copied to clipboard

Error in stacked circular boxplot

Open swati70 opened this issue 3 years ago • 0 comments

Hello there,

i am trying to prepare a stacked barplot for my data.

i followed the command given on r -Gallery but it throwed me some error.

Error in check_aesthetics(): ! Aesthetics must be either length 1 or the same as the data (2): hjust Backtrace:

  1. ggplot2::ggsave(p, file = "output.png", width = 10, height = 10)
  2. ggplot2:::grid.draw.ggplot(plot)
  3. ggplot2:::print.ggplot(x)
  4. ggplot2:::ggplot_build.ggplot(x)
  5. ggplot2 by_layer(function(l, d) l$compute_geom_2(d))
  6. ggplot2 f(l = layers[[i]], d = data[[i]])
  7. l$compute_geom_2(d)
  8. ggplot2 f(..., self = self)
  9. self$geom$use_defaults(data, self$aes_params, modifiers)
  10. ggplot2 f(..., self = self)
  11. ggplot2:::check_aesthetics(params[aes_params], nrow(data)) Run rlang::last_trace() to see the full context.

rlang::last_trace() <error/rlang_error> Error in check_aesthetics(): ! Aesthetics must be either length 1 or the same as the data (2): hjust Backtrace: x

  1. -ggplot2::ggsave(p, file = "output.png", width = 10, height = 10)
  2. +-grid::grid.draw(plot)
  3. -ggplot2:::grid.draw.ggplot(plot)
  4. +-base::print(x)
    
  5. \-ggplot2:::print.ggplot(x)
    
  6.   +-ggplot2::ggplot_build(x)
    
  7.   \-ggplot2:::ggplot_build.ggplot(x)
    
  8.     \-ggplot2 by_layer(function(l, d) l$compute_geom_2(d))
    
  9.       \-ggplot2 f(l = layers[[i]], d = data[[i]])
    
  10.         \-l$compute_geom_2(d)
    
  11.           \-ggplot2 f(..., self = self)
    
  12.             \-self$geom$use_defaults(data, self$aes_params, modifiers)
    
  13.               \-ggplot2 f(..., self = self)
    
  14.                 \-ggplot2:::check_aesthetics(params[aes_params], nrow(data))
    
  15.                   \-rlang::abort(...)
    

abiotic_low.txt This is my data file and given below is the code i used. library(tidyverse) library(viridis) data = read.delim(file = "abiotic_low.txt", header = T) data <- data.frame( individual=paste( "Locus_ID", seq(1,28), sep=""), group=c( rep('High', 17), rep('Low', 11)) , value1=sample( seq(10,100), 28, replace=T), value2=sample( seq(10,100), 28, replace=T), value3=sample( seq(10,100), 28, replace=T) )

data <- data %>% gather(key = "observation", value="value", -c(1,2)) empty_bar <- 2 nObsType <- nlevels(as.factor(data$observation)) to_add <- data.frame( matrix(NA, empty_bar*nlevels(data$group)nObsType, ncol(data)) ) colnames(to_add) <- colnames(data) to_add$group <- rep(levels(data$group), each=empty_barnObsType ) data <- rbind(data, to_add) data <- data %>% arrange(group, individual) data$id <- rep( seq(1, nrow(data)/nObsType) , each=nObsType)

Get the name and the y position of each label

label_data <- data %>% group_by(id, individual) %>% summarize(tot=sum(value)) number_of_bar <- nrow(label_data) angle <- 90 - 360 * (label_data$id-0.5) /number_of_bar # I substract 0.5 because the letter must have the angle of the center of the bars. Not extreme right(1) or extreme left (0) label_data$hjust <- ifelse( angle < -90, 1, 0) label_data$angle <- ifelse(angle < -90, angle+180, angle)

prepare a data frame for base lines

base_data <- data %>% group_by(group) %>% summarize(start=min(id), end=max(id) - empty_bar) %>% rowwise() %>% mutate(title=mean(c(start, end)))

prepare a data frame for grid (scales)

grid_data <- base_data grid_data$end <- grid_data$end[ c( nrow(grid_data), 1:nrow(grid_data)-1)] + 1 grid_data$start <- grid_data$start - 1 grid_data <- grid_data[-1,]

Make the plot

p <- ggplot(data)

Add the stacked bar

geom_bar(aes(x=as.factor(id), y=value, fill=observation), stat="identity", alpha=0.5) + scale_fill_viridis(discrete=TRUE) +

Add a val=100/75/50/25 lines. I do it at the beginning to make sur barplots are OVER it.

geom_segment(data=grid_data, aes(x = end, y = 0, xend = start, yend = 0), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) + geom_segment(data=grid_data, aes(x = end, y = 50, xend = start, yend = 50), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) + geom_segment(data=grid_data, aes(x = end, y = 100, xend = start, yend = 100), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) + geom_segment(data=grid_data, aes(x = end, y = 150, xend = start, yend = 150), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) + geom_segment(data=grid_data, aes(x = end, y = 200, xend = start, yend = 200), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +

Add text showing the value of each 100/75/50/25 lines

ggplot2::annotate("text", x = rep(max(data$id),5), y = c(0, 50, 100, 150, 200), label = c("0", "50", "100", "150", "200") , color="grey", size=6 , angle=0, fontface="bold", hjust=1) +

ylim(-150,max(label_data$tot, na.rm=T)) + theme_minimal() + theme( legend.position = "none", axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), plot.margin = unit(rep(-1,4), "cm") ) + coord_polar() +

Add labels on top of each bar

geom_text(data=label_data, aes(x=id, y=tot+10, label=individual, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=5, angle= label_data$angle, inherit.aes = FALSE ) +

Add base line information

geom_segment(data=base_data, aes(x = start, y = -5, xend = end, yend = -5), colour = "black", alpha=0.8, size=0.6 , inherit.aes = FALSE ) + geom_text(data=base_data, aes(x = title, y = -18, label=group), hjust=c(1,1,0,0), colour = "black", alpha=0.8, size=4, fontface="bold", inherit.aes = FALSE)

Save at png

ggsave(p, file="output.png", width=10, height=10)

Kindly help

swati70 avatar Feb 10 '22 08:02 swati70