Hi

Here are some alternatives that involve messing about with the grobs and viewports after the plot has been drawn. The percentage optimality of these solutions is up for debate ...

###############################################################################
# Edit the y-axis line after drawing
library("ggplot2"); library("grid")
g <- ggplot()+
  geom_point(aes(x=c(20, 29, 32), y=c(0, 0.4, 1)))+
  scale_y_continuous(breaks=c(0, 0.25, 0.5, 0.75, 1))+
  labs(x="Label for x axis")+
  labs(y="Label for y axis") +
  annotate("text", x = 25 , y=1.2, label="Text 1")+
annotate("text", x = 22 , y=1.0, label="How to stop the y-axis line here !")+
  geom_segment(aes(x=25, xend=25, y=0, yend=1.1), linetype=2)+
  # This part is just to make it more nice
  theme(panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(0.5, 1, 0.5, 0.5), "cm"),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        axis.title.x=element_text(size=18),
        axis.title.y=element_text(size=18),
        axis.ticks.length=unit(0.3,"cm"),
        panel.border = element_blank(),
        axis.line.x = element_line(),
        axis.line.y = element_line())
g
# Force creation of all grobs
grid.force()
# List all grobs
grid.ls()
# Get y-axis line y-locations
grid.get("axis.line.y..polyline", grep=TRUE)$y
# Edit y-axis line y-locations (trial-and-error to get 0.81)
grid.edit("axis.line.y..polyline", grep=TRUE, y=unit(c(0, 0.81), "npc"))

###############################################################################
# Insert marker to work off and edit the y-axis line after drawing
library("ggplot2"); library("grid")
g <- ggplot()+
  geom_point(aes(x=c(20, 29, 32), y=c(0, 0.4, 1)))+
  scale_y_continuous(breaks=c(0, 0.25, 0.5, 0.75, 1))+
  labs(x="Label for x axis")+
  labs(y="Label for y axis") +
  annotate("text", x = 25 , y=1.2, label="Text 1")+
annotate("text", x = 22 , y=1.0, label="How to stop the y-axis line here !")+
  geom_segment(aes(x=25, xend=25, y=0, yend=1.1), linetype=2)+
  # This part is just to make it more nice
  theme(panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(0.5, 1, 0.5, 0.5), "cm"),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        axis.title.x=element_text(size=18),
        axis.title.y=element_text(size=18),
        axis.ticks.length=unit(0.3,"cm"),
        panel.border = element_blank(),
        axis.line.x = element_line(),
        axis.line.y = element_line()) +
    # marker
    geom_point(aes(x=20, y=1), col="red")
g
# Force creation of all grobs
grid.force()
# List all grobs
grid.ls()
# Navigate to panel viewport
downViewport("panel.6-4-6-4")
# Get marker
marker <- grid.get("geom_point", grep=TRUE, global=TRUE)[[2]]
# Edit y-axis line y-locations (based on marker)
grid.edit("axis.line.y..polyline", grep=TRUE,
y=convertY(unit(0:1, c("npc", "groby"), list(NULL, marker)), "npc"))
# grid.edit("axis.line.y..polyline", grep=TRUE,
#           y=unit(c(0, convertY(grobY(marker, 0), "npc", valueOnly=TRUE)),
#                  "npc"))
# Remove marker
grid.remove(marker$name)

###############################################################################
# Just draw the plot, with margin above, vertical dash line clipped
library("ggplot2"); library("grid")
g <- ggplot()+
  geom_point(aes(x=c(20, 29, 32), y=c(0, 0.4, 1)))+
  scale_y_continuous(breaks=c(0, 0.25, 0.5, 0.75, 1),
                     limits=c(-.05, 1), expand=c(0, 0),
                     oob=function(x, range) x)+
  labs(x="Label for x axis")+
  labs(y="Label for y axis") +
  annotate("text", x = 25 , y=1.2, label="Text 1")+
annotate("text", x = 22 , y=1.0, label="How to stop the y-axis line here !")+
  geom_segment(aes(x=25, xend=25, y=0, yend=1.1), linetype=2)+
  # This part is just to make it more nice
  theme(panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(3, 1, 0.5, 0.5), "cm"),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        axis.title.x=element_text(size=18),
        axis.title.y=element_text(size=18),
        axis.ticks.length=unit(0.3,"cm"),
        panel.border = element_blank(),
        axis.line.x = element_line(),
        axis.line.y = element_line())
g
# Force creation of all grobs
grid.force()
# List all grobs
grid.ls()
# Navigate to panel viewport
downViewport("panel.6-4-6-4")
# Get the line segment and label
seg <- grid.get("segments", grep=TRUE)
lab <- grid.get("text", grep=TRUE)
# Push new viewport with clipping off
pushViewport(viewport(clip="off"))
# Draw line segment and text
grid.draw(seg)
grid.draw(lab)
# Clean up
upViewport()

Paul

On 25/10/16 17:33, Marc Girondot wrote:
After many tries, here is a solution using grob.
I post here in case it could help someone.
Note that this solution is not 100% optimal as it uses a trick (limits =
c(-0.05, 1.02)) to show fully the points.

Marc

library("ggplot2"); require("gtable"); require("grid")

p <- ggplot()+
  geom_point(aes(x=c(20, 29, 32), y=c(0, 0.4, 1)))+
  scale_y_continuous(breaks=c(0, 0.25, 0.5, 0.75, 1),
                     expand = c(0, 0), limits = c(-0.05, 1.02))+
  xlim(20, 32) +
  labs(x="Label for x axis")+
  labs(y="Label for y axis") +
  geom_segment(aes(x=25, xend=25, y=0, yend=1), linetype=2)+
  # This part is just to make it more nice
  theme(panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(0.5, 1, 0.5, 0.5), "cm"),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        axis.title.x=element_text(size=18),
        axis.title.y=element_text(size=18),
        axis.ticks.length=unit(0.3,"cm"),
        panel.border = element_blank(),
        axis.line.x = element_line(),
        axis.line.y = element_line())


# I prepare the legend to be shown at the top
plegend <- ggplot() +
  geom_blank() +
  geom_segment(aes(x=25, xend=25, y=0, yend=0.4), linetype=2) +
  annotate("text", x = 25 , y=0.5, label="Text 1")+
  scale_y_continuous(expand=c(0,0), limits = c(0,1)) +
  scale_x_continuous(limits = c(20, 32)) +
  theme_minimal() + theme(line=element_blank(),
                          text=element_blank(),
                          panel.background=element_blank())

# extract the panel only
gl <- gtable_filter(ggplotGrob(plegend), "panel")

# And draw both
g <- ggplotGrob(p)
g <- gtable_add_rows(x = g, heights = unit(2, "cm"), pos = 0)
g <- gtable_add_grob(g, gl, t = 2, l=4, b=1, r=4)
grid.newpage()
grid.draw(g)



Le 24/10/2016 à 13:08, Marc Girondot via R-help a écrit :
Hello everybody,

Using ggplot2 package, is there a way to force to stop the y-axis line
at a specified point ? (not using ylim because I want that some text
written using annotate() at the top of the graph is still shown).

Bellow is a simple example to show what I would like do:

Thanks a lot

Marc





library("ggplot2")

g <- ggplot()+
  geom_point(aes(x=c(20, 29, 32), y=c(0, 0.4, 1)))+
  scale_y_continuous(breaks=c(0, 0.25, 0.5, 0.75, 1))+
  labs(x="Label for x axis")+
  labs(y="Label for y axis") +
  annotate("text", x = 25 , y=1.2, label="Text 1")+
  annotate("text", x = 22 , y=1.0, label="How to stop the y-axis line
here !")+
  geom_segment(aes(x=25, xend=25, y=0, yend=1.1), linetype=2)+
  # This part is just to make it more nice
  theme(panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(0.5, 1, 0.5, 0.5), "cm"),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        axis.title.x=element_text(size=18),
        axis.title.y=element_text(size=18),
        axis.ticks.length=unit(0.3,"cm"),
        panel.border = element_blank(),
        axis.line.x = element_line(),
        axis.line.y = element_line())
g

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.




--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
p...@stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to