Plotly R 中的分组线图:如何控制线条颜色?
Grouped line plots in Plotly R: how to control line color?
我有一堆 'paired' 来自同一主题研究的观察结果,我正在尝试构建一个意大利面条图来可视化这些观察结果,如下所示:
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
并且实际上用那个变量给斜线着色。
有什么方法/想法吗?
您可以像这样将线条设置为相同的颜色
plot_ly(df, x = type, y = values, group = id, type = 'scatter', mode = 'lines+markers',
line=list(color='#000000'), showlegend = FALSE)
对于'bonus'二换一的问题'how to color by a different variable to the one used for grouping':
如果您只绘制标记而不绘制线条,这会很简单,因为您可以简单地向 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
我们在提供 x
的列中添加包含 NA
的行和 y
坐标)。
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)
我有一堆 'paired' 来自同一主题研究的观察结果,我正在尝试构建一个意大利面条图来可视化这些观察结果,如下所示:
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
并且实际上用那个变量给斜线着色。
有什么方法/想法吗?
您可以像这样将线条设置为相同的颜色
plot_ly(df, x = type, y = values, group = id, type = 'scatter', mode = 'lines+markers',
line=list(color='#000000'), showlegend = FALSE)
对于'bonus'二换一的问题'how to color by a different variable to the one used for grouping':
如果您只绘制标记而不绘制线条,这会很简单,因为您可以简单地向 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
我们在提供 x
的列中添加包含 NA
的行和 y
坐标)。
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)