我有一堆配对的'来自同一主题的研究的观察结果,我正在尝试建立意大利面条图,以便将这些观察结果可视化如下:
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
并实际上用该变量为斜线着色。
任何方法/想法?
答案 0 :(得分:3)
您可以将线条设置为与此相同的颜色
plot_ly(df, x = type, y = values, group = id, type = 'scatter', mode = 'lines+markers',
line=list(color='#000000'), showlegend = FALSE)
对于'奖励'两个换价的问题'如何用不同的变量着色到用于分组的变量':
如果您只是绘制标记而没有线条,那么这很简单,因为您可以简单地为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
虽然这种单线跟踪方法可能是概念上最简单的方法,但如果应用于数百或数千个线段,它确实变得非常(不切实际)慢。在这种情况下,有一种更快的方法,即每种颜色只绘制一行,但是通过在不同的段之间插入NA
并使用connectgaps=FALSE
选项将此行拆分为多个段将这条线分成缺少数据的区段。
首先使用dplyr
在行标注之间插入缺失值(即对于每个唯一id
我们在提供NA
和{的列中添加包含x
的行{1}}坐标)。
y
并使用library(dplyr)
df %<>% distinct(id) %>%
`[<-`(,c(2,4),NA) %>%
rbind(df) %>%
arrange (id)
绘图:
connectgaps=FALSE