If else in ggplot + switching values between character and numeric for geom_vline
If else in ggplot + switching values between character and numeric for geom_vline
我需要在 ggplot 中集成 if else
块,根据 variable_to_switch
的值,它将:
- 如果值为数字 -> 绘图线
- 值为文本 -> 不绘制线
我以最完整的版本提供我的代码,以考虑到与提供的解决方案可能存在的冲突。
# Creating Data ----
obs_number <- 500
mean <- 2
median <- 3
dens_mode <- 2
variable_to_switch <- "Text"
dlt_standard_mean <- 2
cut_off <- 12
max_dlt <- 15
metrics_test <- data.frame(xintercept = c(obs_number,cut_off,max_dlt, 0, mean, median, dens_mode,variable_to_switch, dlt_standard_mean ),
label = c("Label 1",
"Label 2",
"Label 3",
"",
"Label 4",
"Label 5",
"Label 6",
"Label 7",
"Label 8"))
mean_by_batch_route <- c(rep(1,81), rep(2,252), rep(3,170), rep(4,41))
Label <- c(rep('Label',544))
data_to_plot_test <- data.frame(cbind(Label,mean_by_batch_route))
data_to_plot_test$mean_by_batch_route <- as.numeric(data_to_plot_test$mean_by_batch_route)
# Plotting ---
x_data <- 4
histo_density_plot <- ggplot(data_to_plot_test, aes(x = mean_by_batch_route)) +
geom_histogram(aes(y = ..density..), binwidth = 1, colour= "black", fill = "white") +
geom_density(adjust = 1.75, aes(y=..density..), fill="blue", alpha = .25)
if(variable_to_switch == "Text"){
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = metrics_test[c(6,7,9), ], linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
scale_color_manual(
name= "Values",
limits = metrics_test$label,
values = c("navyblue","darkcyan", "cyan4", "white", "black", "chartreuse4", "purple","darkgoldenrod3", "red"),
guide = guide_legend(override.aes = list(label = metrics_test$xintercept,
size = 3)))
} else {
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = metrics_test[6:nrow(metrics_test), ], linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
scale_color_manual(
name= "Values",
limits = metrics_test$label,
values = c("navyblue","darkcyan", "cyan4", "white", "black", "chartreuse4", "purple","darkgoldenrod3", "red"),
guide = guide_legend(override.aes = list(label = metrics_test$xintercept,
size = 3)))
}
histo_density_plot <- histo_density_plot +
theme(plot.title = element_text(hjust = 0.5, size = 8),
axis.title.x = element_text(colour = "darkblue", size=8),
axis.text.x = element_text(face="plain", color="black",
size=8, angle=0),
axis.title.y = element_text(colour = "darkblue", size=8),
axis.text.y = element_text(face="plain", color="black",
size=8, angle=0),
legend.position = c(.80, .70),
legend.title=element_text(size=8),
legend.text = element_text(size = 8)
)+
labs(title = relevant_title, y = "Distribution fors DLT values, frequency", x = "DLT for the route: average DLT per batch, days")+
scale_x_continuous(breaks = seq(0, x_data,
ifelse(x_data <= 20, 1,
ifelse((x_data > 20 & x_data < 50), 5, 10))))
histo_density_plot
如果variable_to_switch == "Text"
我会出现这个错误:
Error: Discrete value supplied to continuous scale
.
对于 variable_to_switch
等于任何数值绘图有效。
我想在 variable_to_switch
的字符值和数值之间切换。
对于 variable_to_switch == "Text"
情况下的期望输出:
如评论中所述,主要问题是数据框 metrics_test
中的 xintercept
列包含数字和文本。数据框列只能包含一种变量类型,文本不能是数字,因此该列将始终是 chr
类型,而不是 num
类型。然后,您将此列分配给 geom_vline()
调用中的 xintercept
美学,这是错误消息的来源。
如果您提供 不包含 metrics_test$xintercept
中的文本值的数据框子集,您可以通过将列强制为数字类型 - 只要该列不再包含任何文本。在您的示例代码中,如果您将代码的第一部分替换为以下内容,它将正常工作而不会出现错误:
# your code prior to the if/then statement...
if(variable_to_switch == "Text"){
d <- metrics_test[c(6,7,9),] # temporary data frame
d$xintercept <- as.numeric(d$xintercept)
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = d, linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
# the rest of the if then statement and code continues as you have it..
我需要在 ggplot 中集成 if else
块,根据 variable_to_switch
的值,它将:
- 如果值为数字 -> 绘图线
- 值为文本 -> 不绘制线
我以最完整的版本提供我的代码,以考虑到与提供的解决方案可能存在的冲突。
# Creating Data ----
obs_number <- 500
mean <- 2
median <- 3
dens_mode <- 2
variable_to_switch <- "Text"
dlt_standard_mean <- 2
cut_off <- 12
max_dlt <- 15
metrics_test <- data.frame(xintercept = c(obs_number,cut_off,max_dlt, 0, mean, median, dens_mode,variable_to_switch, dlt_standard_mean ),
label = c("Label 1",
"Label 2",
"Label 3",
"",
"Label 4",
"Label 5",
"Label 6",
"Label 7",
"Label 8"))
mean_by_batch_route <- c(rep(1,81), rep(2,252), rep(3,170), rep(4,41))
Label <- c(rep('Label',544))
data_to_plot_test <- data.frame(cbind(Label,mean_by_batch_route))
data_to_plot_test$mean_by_batch_route <- as.numeric(data_to_plot_test$mean_by_batch_route)
# Plotting ---
x_data <- 4
histo_density_plot <- ggplot(data_to_plot_test, aes(x = mean_by_batch_route)) +
geom_histogram(aes(y = ..density..), binwidth = 1, colour= "black", fill = "white") +
geom_density(adjust = 1.75, aes(y=..density..), fill="blue", alpha = .25)
if(variable_to_switch == "Text"){
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = metrics_test[c(6,7,9), ], linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
scale_color_manual(
name= "Values",
limits = metrics_test$label,
values = c("navyblue","darkcyan", "cyan4", "white", "black", "chartreuse4", "purple","darkgoldenrod3", "red"),
guide = guide_legend(override.aes = list(label = metrics_test$xintercept,
size = 3)))
} else {
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = metrics_test[6:nrow(metrics_test), ], linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
scale_color_manual(
name= "Values",
limits = metrics_test$label,
values = c("navyblue","darkcyan", "cyan4", "white", "black", "chartreuse4", "purple","darkgoldenrod3", "red"),
guide = guide_legend(override.aes = list(label = metrics_test$xintercept,
size = 3)))
}
histo_density_plot <- histo_density_plot +
theme(plot.title = element_text(hjust = 0.5, size = 8),
axis.title.x = element_text(colour = "darkblue", size=8),
axis.text.x = element_text(face="plain", color="black",
size=8, angle=0),
axis.title.y = element_text(colour = "darkblue", size=8),
axis.text.y = element_text(face="plain", color="black",
size=8, angle=0),
legend.position = c(.80, .70),
legend.title=element_text(size=8),
legend.text = element_text(size = 8)
)+
labs(title = relevant_title, y = "Distribution fors DLT values, frequency", x = "DLT for the route: average DLT per batch, days")+
scale_x_continuous(breaks = seq(0, x_data,
ifelse(x_data <= 20, 1,
ifelse((x_data > 20 & x_data < 50), 5, 10))))
histo_density_plot
如果variable_to_switch == "Text"
我会出现这个错误:
Error: Discrete value supplied to continuous scale
.
对于 variable_to_switch
等于任何数值绘图有效。
我想在 variable_to_switch
的字符值和数值之间切换。
对于 variable_to_switch == "Text"
情况下的期望输出:
如评论中所述,主要问题是数据框 metrics_test
中的 xintercept
列包含数字和文本。数据框列只能包含一种变量类型,文本不能是数字,因此该列将始终是 chr
类型,而不是 num
类型。然后,您将此列分配给 geom_vline()
调用中的 xintercept
美学,这是错误消息的来源。
如果您提供 不包含 metrics_test$xintercept
中的文本值的数据框子集,您可以通过将列强制为数字类型 - 只要该列不再包含任何文本。在您的示例代码中,如果您将代码的第一部分替换为以下内容,它将正常工作而不会出现错误:
# your code prior to the if/then statement...
if(variable_to_switch == "Text"){
d <- metrics_test[c(6,7,9),] # temporary data frame
d$xintercept <- as.numeric(d$xintercept)
histo_density_plot <- histo_density_plot +
geom_vline(aes(xintercept = xintercept, color = label),
data = d, linetype = "dashed", size = 0.5, alpha = 1,
key_glyph = draw_key_text) +
# the rest of the if then statement and code continues as you have it..