按组自定义 ggplot 图例
Custom ggplot legend by group
我想创建如下图,但按组使用自定义图例。我有两个样本名称 A 和 B 以及一个相关联的目标 (Y)。我想要的是将图例与一侧分组:
样本 A:真实与观察
和另一边
样本 B:真实与观察
具有相应的形状和颜色。
下面,这是我已经拥有的。
library(ggplot2)
sites = rep(seq(0.55,0.58,0.01), times = 4)
sites = sort(sites)
org = rep(c("Y_A", "Y_A_obs", "Y_b", "Y_b_obs"), times = 4)
values = rnorm(16)
df = data.frame(sites = sites, origine = org, values = values)
ggplot(df, aes(x=sites, y=values, color=origine)) +
geom_point(aes(shape=origine, color=origine), size=3)+
scale_shape_manual(values=c(0, 15, 2, 17))+
scale_color_manual(values=c("blue", "purple", "red", "orange"))
这就是我想要的:
感谢您的帮助!
实现您想要的结果的一个选择是使用 ggnewscale
包,它允许多个比例和图例用于相同的美学。这种方法的缺点是它加倍了代码行数:
library(ggplot2)
library(ggnewscale)
set.seed(123)
sites = rep(seq(0.55,0.58,0.01), times = 4)
sites = sort(sites)
org = rep(c("Y_A", "Y_A_obs", "Y_b", "Y_b_obs"), times = 4)
values = rnorm(16)
df = data.frame(sites = sites, origine = org, values = values)
ggplot() +
geom_point(data = subset(df, grepl("^Y_A", org)), aes(x=sites, y=values, shape=origine, color=origine), size=3)+
scale_shape_manual(name = "A", values=c(Y_A = 0, Y_A_obs = 15),
labels=c(Y_A = "y_true", Y_A_obs = "y_pred"),
guide = guide_legend(order = 1))+
scale_color_manual(name = "A",
values=c(Y_A = "blue", Y_A_obs = "purple"),
labels=c(Y_A = "y_true", Y_A_obs = "y_pred"),
guide = guide_legend(order = 1)) +
new_scale_color() +
new_scale("shape") +
geom_point(data = subset(df, grepl("^Y_b", org)), aes(x=sites, y=values, shape=origine, color=origine), size=3)+
scale_shape_manual(name = "B",
values=c(Y_b = 2, Y_b_obs = 17),
labels=c(Y_b = "y_true", Y_b_obs = "y_pred"),
guide = guide_legend(order = 2))+
scale_color_manual(name = "B",
values=c(Y_b = "red", Y_b_obs = "orange"),
labels=c(Y_b = "y_true", Y_b_obs = "y_pred"),
guide = guide_legend(order = 2))
我想创建如下图,但按组使用自定义图例。我有两个样本名称 A 和 B 以及一个相关联的目标 (Y)。我想要的是将图例与一侧分组:
样本 A:真实与观察
和另一边
样本 B:真实与观察
具有相应的形状和颜色。
下面,这是我已经拥有的。
library(ggplot2)
sites = rep(seq(0.55,0.58,0.01), times = 4)
sites = sort(sites)
org = rep(c("Y_A", "Y_A_obs", "Y_b", "Y_b_obs"), times = 4)
values = rnorm(16)
df = data.frame(sites = sites, origine = org, values = values)
ggplot(df, aes(x=sites, y=values, color=origine)) +
geom_point(aes(shape=origine, color=origine), size=3)+
scale_shape_manual(values=c(0, 15, 2, 17))+
scale_color_manual(values=c("blue", "purple", "red", "orange"))
这就是我想要的:
感谢您的帮助!
实现您想要的结果的一个选择是使用 ggnewscale
包,它允许多个比例和图例用于相同的美学。这种方法的缺点是它加倍了代码行数:
library(ggplot2)
library(ggnewscale)
set.seed(123)
sites = rep(seq(0.55,0.58,0.01), times = 4)
sites = sort(sites)
org = rep(c("Y_A", "Y_A_obs", "Y_b", "Y_b_obs"), times = 4)
values = rnorm(16)
df = data.frame(sites = sites, origine = org, values = values)
ggplot() +
geom_point(data = subset(df, grepl("^Y_A", org)), aes(x=sites, y=values, shape=origine, color=origine), size=3)+
scale_shape_manual(name = "A", values=c(Y_A = 0, Y_A_obs = 15),
labels=c(Y_A = "y_true", Y_A_obs = "y_pred"),
guide = guide_legend(order = 1))+
scale_color_manual(name = "A",
values=c(Y_A = "blue", Y_A_obs = "purple"),
labels=c(Y_A = "y_true", Y_A_obs = "y_pred"),
guide = guide_legend(order = 1)) +
new_scale_color() +
new_scale("shape") +
geom_point(data = subset(df, grepl("^Y_b", org)), aes(x=sites, y=values, shape=origine, color=origine), size=3)+
scale_shape_manual(name = "B",
values=c(Y_b = 2, Y_b_obs = 17),
labels=c(Y_b = "y_true", Y_b_obs = "y_pred"),
guide = guide_legend(order = 2))+
scale_color_manual(name = "B",
values=c(Y_b = "red", Y_b_obs = "orange"),
labels=c(Y_b = "y_true", Y_b_obs = "y_pred"),
guide = guide_legend(order = 2))