2017-05-25 64 views
0

我有一个data.frame,我在y轴上绘制一个值,id,对x轴上的一个值t另一个值s如何添加一条垂直线到R的阴谋图和y变量的因子

library(plotly) 
library(dplyr) 

# create data.frame 
df <- data.frame(id=c("a","b","c"),s=c(1,3,2),t=c(3,2,1)) 

# set order 
levels <- df %>% 
arrange(s) %>% 
.$id #[1] a c b 

# plot 
df %>% 
mutate(id=factor(id, levels = levels)) %>% 
plot_ly(x=~t,y=~id) %>% 
add_markers() 

这工作正常。

enter image description here

但是我想添加一个垂直线表示T的平均值,由s

line <- weighted.mean(df$t,df$s) 

加权和我无法找到正确的方式来做到这一点

TIA

回答

0

为了防止Plotly使用分类值对y轴进行排序,您可以绘制多条显示为一条线的线。

p <- add_lines(p, 
       x = rep(line, nrow(df)), 
       y = df$id) 

enter image description here


library(plotly) 
library(dplyr) 

# create data.frame 
df <- data.frame(id=c("a","b","c"),s=c(1,3,2),t=c(3,2,1)) 

# set order 
levels <- df %>% 
    arrange(s) %>% 
    .$id #[1] a c b 

# plot 
p <- df %>% 
    mutate(id=factor(id, levels = levels)) %>% 
    plot_ly(x=~t,y=~id) %>% 
    add_markers() 

line <- weighted.mean(df$t,df$s) 


p <- add_lines(p, 
       x = rep(line, nrow(df)), 
       y = df$id) 
p 
+0

我想在加权平均点的垂直线(因此在该示例中这将是在1.83)从“A”到“b”延伸的一路在我的情节。 x_values = weighted.mean(df $ t,df $ s)将行放在正确的位置,但像y_values = c(as.character(levels [1]),as.character(levels [length(levels)]))根据需要在a和b之间插入一行,但将y轴重新排列为字母顺序,这不是我想要的 – pssguy

+0

@pssguy:感谢您的澄清!查看更新的答案。 –

+0

@Maximillian Peters非常感谢。在更正的代码中,我认为我们现在可以不使用x_values&y_values。更重要的是,我认为它应该是nrow(df)而不是长度(df)。我认为后者只适用于这个例子,因为行数等于列数。如果你可以确认我在这里是正确的,那么我会把它作为答案 – pssguy