这是我拥有的数据框的一部分:
Y X
1 0.2342 0.49530177
2 0.5628 0.61576918
3 0.3249 0.73623660
4 0.5234 0.85670401
5 1.2354 0.97717143
6 2.3423 0.09763884
我还有另一个数据框:
start end name
1 0.0123 0.123 A1
2 0.5352 0.714 A2
3 0.6239 0.789 B4
4 0.6985 0.818 D2
5 0.1264 0.216 V4
6 0.1932 0.217 H4
所以我正确地绘制了第一个数据框。但我想要做的是在第一个数据图的x轴上标记第二个数据框的名称。
例如(使geom_box或geom_error条形成0.0123到0.123并为第二个数据框的所有部分写A1等),因此箱线图或误差线应该是水平的(与x轴平行) )
如何做到这一点??
谢谢。答案 0 :(得分:0)
如果我理解正确,你在第二个数据框中的数据就是第一个数据框中的观测误差(或类似的东西)。如果是这种情况,我建议首先合并两个数据帧。然后,假设您的数据帧是D1和D2,下面的代码绘制数据和误差线,同时“翻转”坐标。
# Create artificial data
D1 <- data.frame(X= 1:100, Y = rnorm(100))
D2 <- data.frame(start= D1$Y - abs(rnorm(100, 10)), end = D1$Y + abs(rnorm(100, 10)), name = sample(c('A','B', 'C', 'D', 'E'), 100, rep = TRUE))
# First step: Combine the two data frames
D3 <- data.frame(D1, D2)
# Plot data
library(ggplot2)
ggplot(D3) +
geom_point(aes(x = X, y = Y)) + # Plots the points
geom_errorbar(aes(x = X, ymax = start, ymin = end, width = 1)) + # Creates the errorbars
coord_flip() # Flips the coordinates
答案 1 :(得分:0)
我不确定你想要最终的情节看起来是什么样的,特别是因为你的例子中的间隔重叠。这是一种可能性:
DF1 <-
structure(list(Y = c(0.2342, 0.5628, 0.3249, 0.5234, 1.2354,
2.3423), X = c(0.49530177, 0.61576918, 0.7362366, 0.85670401,
0.97717143, 0.09763884)), .Names = c("Y", "X"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
DF2 <-
structure(list(start = c(0.0123, 0.5352, 0.6239, 0.6985, 0.1264,
0.1932), end = c(0.123, 0.714, 0.789, 0.818, 0.216, 0.217), name = structure(c(1L,
2L, 3L, 4L, 6L, 5L), .Label = c("A1", "A2", "B4", "D2", "H4",
"V4"), class = "factor")), .Names = c("start", "end", "name"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
使用
制作图表ggplot() +
geom_point(data=DF1, aes(X, Y)) +
geom_errorbarh(data=DF2, aes(xmax=end, xmin=start, x=(start+end)/2, y=0)) +
geom_text(data=DF2, aes(x=(start+end)/2, y=0, label=name))
您可以使用颜色来尝试区分底部的条形图,但如果它们中的条纹非常多,则很快就无法区分。
ggplot() +
geom_point(data=DF1, aes(X, Y)) +
geom_errorbarh(data=DF2, aes(xmax=end, xmin=start, x=(start+end)/2, y=0, colour=name)) +
geom_text(data=DF2, aes(x=(start+end)/2, y=0, label=name, colour=name)) +
scale_colour_discrete(guide="none")