Home > database >  How to fix y scale to include different magnitude orders to a barplot
How to fix y scale to include different magnitude orders to a barplot

Time:07-01

I have several troubles plotting my data frame with ggplot2.

I haven't problems with the plotting itself. I have exactly the same distribution that I want. However, the plot shows only one part of the magnitude orders. The dataframe shows data at -07, -08, and -09. I tried the chart below to use gaps, breaks, and some transformations but with bad results. Below you can find an example of what I want to plot. I only work with R, so I will appreciate if you can share only R codes.

enter image description here

Here is the example code:

##plot data
ggplot(data, aes(x = reorder(Treatment, -mean), y = mean)) 
  geom_bar(aes(x = reorder(Treatment, -mean), y= mean), stat="identity", fill="black" , alpha=0.5) 
  geom_errorbar(aes(x = reorder(Treatment, -mean), ymin=mean-se, ymax=mean se), width=0.4, colour="black", alpha=0.9, size=1.3) 
  theme(
    line = element_line(colour = "black", size = 1, linetype = 1, lineend = "butt"), 
    rect = element_rect(fill = "white", colour = "black", size = 1, linetype = 1), 
    aspect.ratio = 1,
    plot.background = element_rect(fill = "white"),
    plot.margin = margin(1, 1, 1, 1, "cm"),
    axis.text = element_text(size = rel(2.5), colour = "#000000", margin = 1), 
    strip.text = element_text(size = rel(0.8)), 
    axis.line = element_blank(), 
    axis.text.x = element_text(vjust = 0.2), 
    axis.text.y = element_text(hjust = 1), 
    axis.ticks = element_line(colour = "#000000", size = 1.2), 
    axis.title.x = element_text(size = 30, vjust=0.5), 
    axis.title.y = element_text(size = 30, angle = 90), 
    axis.ticks.length = unit(0.15, "cm"), 
    legend.background = element_rect(colour = NA), 
    legend.spacing = unit(0.15, "cm"), 
    legend.key = element_rect(fill = "grey95", colour = "white"), 
    legend.key.size = unit(1.2, "lines"), 
    legend.key.height = NULL, 
    legend.key.width = NULL, 
    legend.text = element_text(size = rel(2.0)), 
    legend.text.align = NULL, 
    legend.title = element_text(size = rel(2.0), face = "bold", hjust = 0), 
    legend.title.align = NULL, 
    legend.position = c(.80, .88), 
    legend.direction = NULL, 
    legend.justification = "center", 
    legend.box = NULL, 
    panel.background = element_rect(fill = "#ffffff", colour = "#000000",
                                    size = 2, linetype = "solid"), 
    
    panel.border = element_rect(colour = "black", fill=NA, size=2),
  ) 
  ylab(expression(Lp[r]~(m~s^-1~Mpa^-1)))   xlab(expression(Treatment))

CodePudding user response:

library(ggbreak)

df <- data.frame(treatment = factor(1:4),
                 y = c(100000, 1000, 100, 10),
                 se = c(10000, 100, 10, 1))

ggplot(df, aes(x=treatment, y=y))  
  geom_col()  
  geom_errorbar(aes(ymin=y-se, ymax=y se), width=.4)  
  scale_y_cut(breaks=c(25, 150, 1600))

enter image description here

CodePudding user response:

thanks a lot for your code. It works. However, I have a problem with the second column of the plot. The error bar showed incomplete. There is a way to fix this? I need that the plot be exactly as below. Here is the example code and the result. Thanks.

ggplot(data, aes(x = reorder (Treatment, -mean), y=mean, fill = Grapevine))   geom_col(aes(x=reorder(Treatment, -mean), y=mean), stat = 'identity', position = 'dodge')   geom_errorbar(aes(x=reorder(Treatment, -mean), ymin = mean - se, ymax = mean   se), width = 0.1, position = position_dodge(0.9))  scale_y_cut(breaks=c(2.0E-09,2.0E-08, 1.0E-07))  scale_y_continuous(breaks = c(0, 6.0e-09, 6.0e-08, 6.0e-07))  theme(
line = element_line(colour = "black", size = 1, linetype = 1, lineend = "butt"), 
rect = element_rect(fill = "white", colour = "black", size = 1, linetype = 1), 
aspect.ratio = 0.6,
plot.background = element_rect(fill = "white"),
plot.margin = margin(1, 1, 1, 1, "cm"),

axis.text = element_text(size = rel(2.5), colour = "#000000", margin = 1), 
strip.text = element_text(size = rel(0.8)), 
axis.line = element_blank(), 
axis.text.x = element_text(vjust = 0.2, angle=90), 
axis.text.y = element_text(hjust = 1), 
axis.ticks = element_line(colour = "#000000", size = 1.2), 
axis.title.x = element_text(size = 30, vjust=0.5), 
axis.title.y = element_text(size = 30, angle = 90), 
axis.ticks.length = unit(0.1, "cm"), 


legend.background = element_rect(colour = NA), 
legend.margin = unit(0.15, "cm"), 
legend.key = element_rect(fill = "grey95", colour = "white"), 
legend.key.size = unit(1.2, "lines"), 
legend.key.height = NULL, 
legend.key.width = NULL, 
legend.text = element_text(size = rel(2.0)), 
legend.text.align = NULL, 
legend.title = element_text(size = rel(2.0), face = "bold", hjust = 0), 
legend.title.align = NULL, 
legend.position = "right", 
legend.direction = NULL, 
legend.justification = "right", 
legend.box = NULL, 


panel.background = element_rect(fill = "#ffffff", colour = "#000000",
                                size = 2, linetype = "solid"), 

panel.border = element_rect(colour = "black", fill=NA, size=2),)  ylab(expression(Lp[r]~(m~s^-1~Mpa^-1)))   xlab(expression(Treatment))

bar chart example

  • Related