2016-06-20 169 views
1

我从同一题目的研究一堆“配对”的意见,我想建立一个意大利面条的情节想象这些意见如下:Plotly R中的分组线图:如何控制线条颜色?

library(plotly) 
df <- data.frame(id = rep(1:10, 2), 
       type = c(rep('a', 10), rep('b', 10)), 
       state = rep(c(0, 1), 10), 
       values = c(rnorm(10, 2, 0.5), rnorm(10, -2, 0.5))) 
df <- df[order(df$id), ] 
plot_ly(df, x = type, y = values, group = id, type = 'line') %>% 
    layout(showlegend = FALSE) 

它产生正确的情节,我求。但是,代码以自己的颜色显示每个组合线,这真的很烦人和分心。我似乎无法找到摆脱颜色的方法。

奖金问题:我实际上想使用color = state,而实际上是通过该变量着色斜线。

任何方法/想法?

+2

就这个问题寻找一种方式来绘制多行与一个plotly命令绊倒了。在当前的plotly-package(4.7.1)中,需要'plot_ly(df,x =〜type,y =〜values,type ='scatter',mode ='lines',split =〜id)%>% layout (showlegend = FALSE)'使这个例子工作。 – 5th

回答

3

您可以设置行相同的颜色像这样

plot_ly(df, x = type, y = values, group = id, type = 'scatter', mode = 'lines+markers', 
     line=list(color='#000000'), showlegend = FALSE) 

enter image description here

对于“奖金”二为价格 - 的 - 一个问题“如何通过颜色用于分组'的不同变量::

如果您只绘制标记并且没有线条,这将很简单,因为您可以简单地向marker.color提供颜色矢量。然而,不幸的是,line.color只接受一个值,而不是一个向量,所以我们需要解决这个限制。

如果数据不是太多(在这种情况下,此方法变慢,并且下面会给出更快的方法),您可以逐个设置每条线的颜色,将它们逐个添加为一个循环遍历ID)

p <- plot_ly() 
for (id in df$id) { 
    col <- c('#AA0000','#0000AA')[df[which(df$id==id),3][1]+1] # calculate color for this line based on the 3rd column of df (df$state). 
    p <- add_trace(data=df[which(df$id==id),], x=type, y=values, type='scatter', mode='markers+lines', 
       marker=list(color=col), 
       line=list(color=col), 
       showlegend = FALSE, 
       evaluate=T) 
    } 
p 

enter image description here

虽然这一次跟踪每行的做法可能是概念上最简单的方法,如果应用到数百或数千线段的它变得非常(不切实际)慢。在这种情况下,有一种更快的方法,即每个颜色只绘制一条线,但是通过在单独的线段之间插入NA并使用connectgaps=FALSE选项将线划分为多个线段缺少数据。

通过使用dplyr插入线链段之间的缺失值(即,对于每个唯一的id我们添加包含在提供xy坐标列NA的行)开始。

library(dplyr) 
df %<>% distinct(id) %>% 
    `[<-`(,c(2,4),NA) %>% 
    rbind(df) %>% 
    arrange (id) 

和情节,使用connectgaps=FALSE

plot_ly(df, x = type, y = values, group = state, type = 'scatter', mode = 'lines+markers', 
     showlegend = FALSE, 
     connectgaps=FALSE) 

enter image description here

+0

第一部分工作得很好。在第二个,我可能会最终使用'subplot'作为循环机制不干净,并且在许多数据点上承担处理开销。 – Gopala

+0

如果要绘制大量线条,请参阅更新,以便更快地完成第二部分。 PS不知道你的意思是“不干净”?当应用于大数据时,循环速度肯定很慢,但在我看来,这在概念上是一种干净而简单的方法。 – dww

+0

非常聪明的方法来解决这个问题。我会和这个一起去的。 “情节化”令人高兴,但并不是非常高兴,它不能处理R方式的事情。早些时候,当我的意思是干净的时候,在循环中添加大量的痕迹并不是R方式。我同意它在概念上是干净的。 – Gopala