R语言plotly绘制如何不连续折线图

R语言plotly绘制如何不连续折线图

我有一个数据框例如

date            variable      value

20230801 1 0.5
20230802 1 0.4
20230803 1 0.9
20230804 1 0.2
20230805 1 0.7
20230801 2 0.1
20230804 2 0.5
20230805 2 0.9

在绘制plotly多折线图时候varuable=2的折线图会把20230802,20230803的数据平滑化(值等于连接20230801(0.1)和20230804(0.5)的线上值 )
我想绘制出不连续的折线图该怎么做

img

【以下回答由 GPT 生成】

解决方案

为了绘制不连续的折线图,可以使用add_trace函数在同一个图中添加多个折线图。对于每个折线图,我们需要将不连续的部分处理成缺失值,然后再进行绘制。下面是具体的解决方法和代码示例。

  1. 首先,我们需要安装并加载plotly包,代码如下:
install.packages("plotly")
library(plotly)
  1. 然后,我们需要创建一个数据框来存储给定的数据,代码如下:
data <- data.frame(
  date = c(20230801, 20230802, 20230803, 20230804, 20230805, 20230801, 20230804, 20230805),
  variable = c(1, 1, 1, 1, 1, 2, 2, 2),
  value = c(0.5, 0.4, 0.9, 0.2, 0.7, 0.1, 0.5, 0.9)
)
  1. 接下来,我们需要将数据框中的日期列转换为字符型,并将变量列转换为因子型,代码如下:
data$date <- as.character(data$date)
data$variable <- as.factor(data$variable)
  1. 然后,我们需要使用split函数将数据框按照变量分割为多个子数据框,代码如下:
data_list <- split(data, data$variable)
  1. 对于每个子数据框,我们需要将不连续的部分处理成缺失值。首先,我们找出每个子数据框中连续的日期序列,然后使用complete函数将其转换为包含缺失日期的完整序列。代码如下:
complete_data_list <- lapply(data_list, function(df) {
  df$date <- as.Date(df$date, "%Y%m%d")
  complete(df, date = seq(min(df$date), max(df$date), by = "day"))
})
  1. 最后,我们使用add_trace函数在同一个图中添加每个子数据框的折线图。我们可以使用循环来遍历每个子数据框,并设置每个折线图的颜色和线型。代码如下:
p <- plot_ly()
colors <- c("#1f77b4", "#ff7f0e")  # 可自行设置颜色
linetypes <- c("solid", "dashed")  # 可自行设置线型

for (i in seq_along(data_list)) {
  p <- add_trace(
    p,
    type = "scatter",
    mode = "lines",
    x = complete_data_list[[i]]$date,
    y = complete_data_list[[i]]$value,
    color = colors[i],
    linetype = linetypes[i],
    name = unique(data_list[[i]]$variable)
  )
}

p

这样,我们就可以得到一个包含不连续折线图的plotly图形。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^