R 着色并在循环上添加线条

问题描述 投票:0回答:1

我想通过在循环上添加不同的线来生成 ggplot。每条线都应该有自己的颜色。我已经尝试过这个:

scenario_colors <- c(
  "scenario1" = "black",
  "scenario2" = "red",
  "scenario3" = "green"
)
all_scenario_names <- c("scenario1", "scenario2", "scenario3")
p <- p + scale_color_manual(values = scenario_colors)

for (j in 1:3){
  column <- column_names[j]
  scenario <- all_scenario_names[j]
  print(paste0(column, " ---- ", scenario, " ---- ", scenario_colors[scenario]))
  p <- p + geom_line(data=rama_data, aes(y = .data[[column]], group = 1, color=scenario))
}

然而,这会导致错误的最终情节。所有 3 条线都是场景 3 的颜色。

但是如果我尝试对其进行硬编码,它就可以正常工作

for (j in 1:3){
  column <- column_names[j]
  scenario <- all_scenario_names[j]
  print(paste0(column, " ---- ", scenario, " ---- ", scenario_colors[scenario]))
  if (j == 1){p <- p + geom_line(data=rama_data, aes(y = .data[[column]], group = 1, color="scenario1"))}
  else if(j == 2){p <- p + geom_line(data=rama_data, aes(y = .data[[column]], group = 1, color="scenario2"))}
  else{p <- p + geom_line(data=rama_data, aes(y = .data[[column]], group = 1, color="scenario3"))}
}

每条线都以相应的颜色显示(黑色、红色和绿色)。

我已经被这段代码困住了几天,似乎无法弄清楚第一个片段有什么问题。第二种方法是不可行的,因为将来我需要扩大场景的数量。手动对它们进行硬编码是不可能的。第一种方法有什么问题?

额外信息: 使用的数据形状是这样的:

variable1 <- c(runif(5))
variable2 <- c(3*runif(5))
variable3 <- c(5 + runif(5))
period <- c("MM012021", "MM022021", "MM032021", "MM042021", "MM052021")
# Create the data.table
column_names <- c("variable1", "variable2", "variable3")
rama_data <- data.table(period, variable1, variable2, variable3)

我还添加了两种实现之间的结果: 谢谢!

r loops ggplot2 scale-color-manual
1个回答
0
投票
一旦您的数据为长格式,

ggplot2
将使用任意数量的行来处理此问题。当您使用
data.table
时,让我们这样做。我还将你的
period
变成了约会:

rama_long <- melt(
    rama_data,
    id.vars = "period",
    variable.name = "scenario"
)[
    ,
    scenario := sub("variable", "", scenario)
][
    ,
    period := as.IDate(
        period,
        format = "MM%m%d%y"
    )
]

然后我们可以将

scenario
列提供给
color
美学:

ggplot(rama_long) +
    geom_line(
        aes(
            x = period,
            y = value,
            color = scenario
        ),
        linewidth = 2
    )

© www.soinside.com 2019 - 2024. All rights reserved.