Je souhaite diviser l'axe Y en deux parties et introduire des ruptures dans l'axe Y à l'aide de ggplot2. Les coordonnées de l'axe Y : [0,500,1000,1500,break,12000,17000,22000,27000,32000]

INPUT DATAFRAME

    least_dist frequency           category
          250        444  Without Inhibitor
          500        489  Without Inhibitor
           1k        697  Without Inhibitor
           2k        305  Without Inhibitor
          >2k      15742  Without Inhibitor
          250        284     With Inhibitor
          500        313     With Inhibitor
           1k        501     With Inhibitor
           2k        337     With Inhibitor
          >2k      32727     With Inhibitor
#My Code
df = read.csv('peaks_least_distant.table',sep="\t",header = T)

p<-ggplot(df,aes(x=least_dist, y=frequency,fill = category))+
  geom_bar(stat="identity",position=position_dodge())+
  scale_fill_brewer(palette="Paired")+
  theme_minimal()
p+scale_y_continuous(breaks=c[500:1500,'Break',12000:32000])
0
Himanshu Singh 7 oct. 2019 à 15:03

1 réponse

Meilleure réponse

Il est délibérément très difficile d'obtenir quelque chose qui ressemble à des axes interrompus, car ils sont si facilement utilisés pour déformer les données. Cela dit, voici comment vous pouvez avoir une solution de contournement pour obtenir quelque chose qui ressemble à des pauses sur l'axe des y.

cutoff <- 1500

# Copy part of data above break
df2 <- df[df$frequency > cutoff,]

# Assign panels
df$panel  <- factor("lower", levels = c("upper", "lower"))
df2$panel <- factor("upper", levels = levels(df$panel))

# Cut off y-values in lower panel
df$frequency <- pmin(df$frequency, cutoff)

# Plot
ggplot(df,aes(x=least_dist, y=frequency,fill = category))+
  # Friendly reminder that 'geom_col' is the more convenient 'geom_bar(stat = "identity")'
  geom_col(position=position_dodge())+
  # Parameterise the upper part as rectangles
  geom_rect(aes(xmin = as.numeric(least_dist) - 0.45, xmax = as.numeric(least_dist) + 0.45,
                ymin = 12000, ymax = frequency), 
            data = df2,
            position = position_dodge()) +
  scale_fill_brewer(palette="Paired")+
  # Use facets to resemble an axis interruption
  facet_grid(panel ~ ., scales = "free_y") +
  theme_minimal() +
  # Hide away evidence of facetting
  theme(strip.text = element_blank())

enter image description here

Maintenant, voici ce que je pense que vous devriez réellement faire au lieu d'essayer d'avoir des pauses d'axe :

ggplot(df,aes(x=least_dist, y=frequency,fill = category))+
  geom_col(position=position_dodge())+
  scale_fill_brewer(palette="Paired")+
  # A simple and elegant log transformation
  scale_y_log10() +
  theme_minimal()

enter image description here

1
teunbrand 7 oct. 2019 à 21:21