简体   繁体   中英

How to plot multiple lines with horizontal error bars from a dataframes using ggplot2 [in R]?

I am using this :

http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/

tutorial to plot multiple line graphs by grouping the data from a data frame. Data looks like this:

> all
     y         x       err lab
1   -41.93 5.7696373 0.9120865  he
2   -41.68 5.6345447 0.9100468  he
3   -41.43 5.4954702 0.9068282  he
4   -41.18 5.3588358 0.9054044  he
...
471  15.72 4.3701857 0.5170079  te
472  15.97 4.5128508 0.5262806  te
473  16.22 4.6592179 0.5320847  te
474  16.47 4.8052565 0.5397946  te
475  16.72 4.9518592 0.5465613  te
476  16.97 5.1057900 0.5504546  te
477  17.22 5.2503157 0.5602737  te
478  17.47 5.4000783 0.5711784  te
479  17.72 5.5506885 0.5830945  te
480  17.97 5.7085180 0.6109026  te

And i am using following line to plot the graph:

ggplot(all, aes(x,y, colour=lab, group=lab)) + geom_errorbarh(aes(xmin=x-err, xmax=x+err)) + geom_line() + geom_point()

What I got is as follows:

在此输入图像描述

I just want to fix remove the vertical lines. They should look lien two separate lines (each colour) and with their own horizontal error bars.

What should I correct in ggplot function? Thanks a lot!

Data

all <- structure(list(y = c(-41.93, -41.68, -41.43, -41.18, 15.72, 15.97, 
16.22, 16.47, 16.72, 16.97, 17.22, 17.47, 17.72, 17.97), x = c(5.7696373, 
5.6345447, 5.4954702, 5.3588358, 4.3701857, 4.5128508, 4.6592179, 
4.8052565, 4.9518592, 5.10579, 5.2503157, 5.4000783, 5.5506885, 
5.708518), err = c(0.9120865, 0.9100468, 0.9068282, 0.9054044, 
0.5170079, 0.5262806, 0.5320847, 0.5397946, 0.5465613, 0.5504546, 
0.5602737, 0.5711784, 0.5830945, 0.6109026), lab = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("he", 
"te"), class = "factor")), .Names = c("y", "x", "err", "lab"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "471", "472", "473", "474", "475", "476", "477", 
"478", "479", "480"))

The problem is with the use of geom_line() for a dataset where the same x in each group may map to multiple y values. geom_line tries to connect data points continuously from lowest to highest x which is why you get the (almost) vertical lines in your graph. Use geom_path instead. For an example, compare

df <- data.frame(
  y = -5:5,
  x = (-5:5)^2
) 

# geom_line
ggplot(df) + 
  aes(x, y) + 
  geom_line()


# geom_path
ggplot(df) + 
  aes(x, y) + 
  geom_path()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM