Plotly R中的分组线图:如何控制线条颜色?

时间:2016-06-20 13:15:09

标签: r plotly

我有一堆配对的'来自同一主题的研究的观察结果,我正在尝试建立意大利面条图,以便将这些观察结果可视化如下:

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并实际上用该变量为斜线着色。

任何方法/想法?

1 个答案:

答案 0 :(得分: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我们在提供NA和{的列中添加包含x的行{1}}坐标)。

y

并使用library(dplyr) df %<>% distinct(id) %>% `[<-`(,c(2,4),NA) %>% rbind(df) %>% arrange (id) 绘图:

connectgaps=FALSE

enter image description here