Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R plot type "b" with text instead of points - Slope graph with ggplot2

Tags:

r

ggplot2

is there a way in ggplot2 to get the plot type "b"? See example:

x <- c(1:5)
y <- x 
plot(x,y,type="b")

Ideally, I want to replace the points by their values to have something similar to this famous example:

alt text

EDIT: Here some sample data (I want to plot each "cat" in a facet with plot type "b"):

df <- data.frame(x=rep(1:5,9),y=c(0.02,0.04,0.07,0.09,0.11,0.13,0.16,0.18,0.2,0.22,0.24,0.27,0.29,0.31,0.33,0.36,0.38,0.4,0.42,0.44,0.47,0.49,0.51,0.53,0.56,0.58,0.6,0.62,0.64,0.67,0.69,0.71,0.73,0.76,0.78,0.8,0.82,0.84,0.87,0.89,0.91,0.93,0.96,0.98,1),cat=rep(paste("a",1:9,sep=""),each=5))
like image 847
teucer Avatar asked Sep 28 '10 08:09

teucer


3 Answers

Set up the axes by drawing the plot without any content.

plot(x, y, type = "n")

Then use text to make your data points.

text(x, y, labels = y)

You can add line segments with lines.

lines(x, y, col = "grey80")

EDIT: Totally failed to clock the mention of ggplot in the question. Try this.

dfr <- data.frame(x = 1:5, y = 1:5)
p <- ggplot(dfr, aes(x, y)) + 
  geom_text(aes(x, y, label = y)) + 
  geom_line(col = "grey80")
p

ANOTHER EDIT: Given your new dataset and request, this is what you need.

ggplot(df, aes(x, y)) + geom_point() + geom_line() + facet_wrap(~cat)

YET ANOTHER EDIT: We're starting to approach a real question. As in 'how do you make the lines not quite reach the points'.

The short answer is that that isn't a standard way to do this in ggplot2. The proper way to do this would be to use geom_segment and interpolate between your data points. This is quite a lot of effort however, so I suggest an easier fudge: draw big white circles around your points. The downside to this is that it makes the gridlines look silly, so you'll have to get rid of those.

ggplot(df, aes(x, y)) + 
   facet_wrap(~cat) +
   geom_line() + 
   geom_point(size = 5, colour = "white") + 
   geom_point() + 
   opts(panel.background = theme_blank())
like image 75
Richie Cotton Avatar answered Nov 12 '22 05:11

Richie Cotton


There's an experimental grob in gridExtra to implement this in Grid graphics,

 library(gridExtra)
 grid.newpage() ; grid.barbed(pch=5)

enter image description here

like image 21
baptiste Avatar answered Nov 12 '22 07:11

baptiste


This is now easy with ggh4x::geom_pointpath. Set shape = NA and add a geom_text layer.

library(ggh4x)
#> Loading required package: ggplot2

df <- data.frame(x = rep(1:5, each = 5), 
                 y = c(outer(seq(0, .8, .2), seq(0.02, 0.1, 0.02), `+`)),
                 cat = rep(paste0("a", 1:5)))

ggplot(df, aes(x, y)) +
  geom_text(aes(label = cat)) +
  geom_pointpath(aes(group = cat, shape = NA))

Created on 2021-11-13 by the reprex package (v2.0.1)

like image 38
tjebo Avatar answered Nov 12 '22 07:11

tjebo