我想通过在循环上添加不同的线来生成 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)
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
)