Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7919065
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 3, 20262026-06-03T15:43:58+00:00 2026-06-03T15:43:58+00:00

I created this plot with ggplot2 : The outside lines need to correspond to

  • 0

I created this plot with ggplot2:

enter image description here

The outside lines need to correspond to the Y scale, (i.e the Y position of the lines for Text1 should be 100 and 85). The only way I can do it by drawing a blank plot to the right of the figure with the same scale as the barchart and then using annotate function to draw the lines. Another approach is to simply “manually” draw the lines with grid.lines, however the coordinates of grid.lines will not correspond to the Y scale of the plot.

Is it possible to somehow draw these lines using a different approach? I assume it would have to be done with grid.lines. How could I pass Y coordindates of the barchart to grid.lines?

Below is the minimal code used to create this figure:

library (ggplot2)
test= data.frame(
  group=c(rep(1,6), rep(2,6)),
  subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2),
  category=c( rep(1:3, 4)),
  count=c( 10,80,10,5,90,5,  10,80,10,5,90,5   )
  )

qplot(subgroup, 
      count, 
      data=test, 
      geom="bar", 
      stat="identity",
      fill =category,  
      facets =  .~ group,  width=0.9)+
      opts(legend.position="none",
           plot.margin = unit(c(0,9,2,0), "lines"))

enter image description here

How can I draw the lines to the right of the bars?

I recently asked a question about drawing text outside of plot area in ggplot2 and the solution was to use gt$layout and grid.draw.

Displaying text below the plot generated by ggplot2

Could the similar approach be used here? It is my understanding that annotation_custom is for text only and won’t work with other graphical elements.
Thanks

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-03T15:44:00+00:00Added an answer on June 3, 2026 at 3:44 pm

    Update

    The original solution used annotation_custom, but a problem with annotation_custom is that it draws the annotation in all panels. However, with a simple modification, annotation_custom can be made to draw in one panel only (taken from Baptiste’s answer here)

    annotation_custom2 <- 
    function (grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, data) 
    {
      layer(data = data, stat = StatIdentity, position = PositionIdentity, 
            geom = ggplot2:::GeomCustomAnn,
            inherit.aes = TRUE, params = list(grob = grob, 
                                              xmin = xmin, xmax = xmax, 
                                              ymin = ymin, ymax = ymax))
    }
    
    library(ggplot2)
    library(grid)
    
     #Some data
    test = data.frame(
      group=c(rep(1,6), rep(2,6)),
      subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2),
      category=c( rep(1:3, 4)),
      count=c( 10,80,10,5,90,5,  10,80,10,5,90,5   )
      )
    
    # base plot
    p <- ggplot(test) +
       geom_bar(aes(subgroup, count, fill = category), stat = "identity") +
       facet_grid(. ~ group) +
      theme(legend.position = "none",  
            plot.margin = unit(c(1,5,1,1), "lines"))
    
    # Create the text Grobs
    Text1 = textGrob("Text 1")
    Text2 = textGrob("Text 2")
    Text4 = textGrob("Text 4")
    
    ## Add the annotations
    # Which panel to attach the annotations
    data = data.frame(group=2)
    
    # Text 1
    p1 = p + annotation_custom2(Text1,  xmin = 3., xmax = 3., ymin = 85, ymax = 100, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 100, ymax = 100, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 85, ymax = 85, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 85, ymax = 100, data = data)
    
    # Text 2
    p1 = p1 + annotation_custom2(Text2,  xmin = 3, xmax = 3, ymin = 20, ymax = 80, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 80, ymax = 80, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 20, ymax = 20, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 20, ymax = 80, data = data)
    
    # Text 4
    p1 = p1 + annotation_custom2(Text4,  xmin = 3, xmax = 3, ymin = 0, ymax = 15, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 15, ymax = 15, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 0, ymax = 0, data = data) +
        annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 0, ymax = 15, data = data)
    
    
    # Code to override clipping
    gt <- ggplotGrob(p1)
    gt$layout[grepl("panel", gt$layout$name), ]$clip <- "off"
    
    # Draw the plot
    grid.newpage()
    grid.draw(gt)
    

    Original Solution

    I think almost any Grob created using grid() can be used in annotation_custom().
    There might be neater ways to do this, but here’s a way using grid, annotation_custom and @baptiste’s code from here to override the clipping (as in the earlier post).

    library (ggplot2)
    library(grid)
    
    test= data.frame(
      group=c(rep(1,6), rep(2,6)),
      subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2),
      category=c( rep(1:3, 4)),
      count=c( 10,80,10,5,90,5,  10,80,10,5,90,5   )
      )
    
    ## EDIT:  Updated qplot() command
    p <- qplot(subgroup, count, 
      data = test, geom = "bar",  stat = "identity",
      fill = category,  
      facets = .~ group,  width = 0.9)+
      theme(legend.position="none",  plot.margin = unit(c(0,9,2,0), "lines"))
    
    
    
    # Create the text Grobs
    Text1 = textGrob("Text 1")
    Text2 = textGrob("Text 2")
    Text4 = textGrob("Text 4")
    
    # Draw the plot
    # Text 1
    p1 = p + annotation_custom(grob = Text1,  xmin = 3., xmax = 3., ymin = 85, ymax = 100) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 100, ymax = 100) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 85, ymax = 85) +
        annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 85, ymax = 100)
    
    # Text 2
    p1 = p1 + annotation_custom(grob = Text2,  xmin = 3, xmax = 3, ymin = 20, ymax = 80) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 80, ymax = 80) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 20, ymax = 20) +
        annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 20, ymax = 80)
    
    # Text 4
    p1 = p1 + annotation_custom(grob = Text4,  xmin = 3, xmax = 3, ymin = 0, ymax = 15) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 15, ymax = 15) +
        annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 0, ymax = 0) +
        annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 0, ymax = 15)
    
    p1
    
    # Code to override clipping
    gt <- ggplot_gtable(ggplot_build(p1))
    gt$layout$clip[gt$layout$name=="panel"] <- "off"
    grid.draw(gt)
    

    enter image description here

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I created this regular expression to validate names: ^[a-zA-Z0-9\s\-\,]+.\*?$ Is there a way add
I have a bar plot, which could be created with this code: hplot =
I've got a nice facet_wrap density plot that I have created with ggplot2 .
Below is a plot which should contain lines of different types (solid and dashed)
I created a simple heatmap graph with ggplot2 but I need to force the
I created this program: #include <iostream> #include <fstream> using namespace std; int main ()
I created this layout of successive text input fields, 1- Enter data into empty
I created this regex to match all words that start with @ in my
I created this example The remove function doesn't work, and I can't figure out
I've created this basic 3D Demo using OpenGL/SDL. I handled the keyboard callback so

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.