有人可以帮助我正确设置具有多种定义美学的 ggplot 图例吗?

Can someone help me properly set up my ggplot legend with multiple defined aesthetics?

我希望在我的 ggplot(下图)中有一个更清晰的图例。具体来说,与线几何重叠的点形状不清楚。 最好为预测数据(线型、色带填充、颜色)提供一个图例,为原始数据(点形状、颜色)提供另一个图例。

经过反复尝试,我设法将两组分开,但我找不到将组颜色应用于两个图例的方法。此外,似乎即使当我使用相同的 labs() 名称将线型和填充组合在一起时,点形状图例上仍然有一个灰色填充。这是很多信息,但经过多次尝试后得出的结论是,我无法让图例正常运行。

我已经提供了我的代码和数据集;也许有人可以帮助我?

这是我的 ggplot:

这是生成它的代码:

ggplot(predict.df, aes(x = x, y = predicted, colour = group, shape = group, linetype = group)) +
  stat_smooth(method = "lm", formula = y ~ x) +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.1) +
  geom_jitter(data = raw, mapping = aes(x = x, y = response), width = 8, height = 0) +
  scale_x_continuous(name = "Sample date", breaks = c(0, 35, 70, 105), labels = c("June 26", "July 31", "Sept 4", "Oct 9")) +
  scale_y_continuous(name = "Viral load (virus/\u00b5g DNA)", breaks = c(0, 1, 2, 3), labels = c(1, 10, 100, 1000)) +
  theme_pubr(legend = "right") +
  labs(color = "Locus", shape = "Locus", fill = "Locus", linetype = "Locus") +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2")

这是插入的两个数据框:

> dput(predict.df)
structure(list(x = c(0, 0, 0, 35, 35, 35, 70, 70, 70, 105, 105, 
105), predicted = c(1.76102123590214, 0.37702177715769, 0.502111657963439, 
2.16765850174448, 1.13876128504506, 0.72723857556493, 2.57429576758682, 
1.90050079293243, 0.95236549316642, 2.98093303342917, 2.66224030081979, 
1.17749241076791), std.error = c(0.210212347913819, 0.167399741123415, 
0.183879503224061, 0.145514809621925, 0.106824868721082, 0.108685998504236, 
0.121276566028898, 0.176399586908295, 0.18802919804674, 0.15744703287395, 
0.295192239702551, 0.323169724522022), conf.low = c(1.34901260488545, 
0.0489243135344682, 0.141714454149163, 1.88245471566831, 0.929388389698517, 
0.514217932872852, 2.33659806600149, 1.55476395570442, 0.58383503695286, 
2.67234251952353, 2.08367414248708, 0.544091389811016), conf.high = c(2.17302986691883, 
0.705119240780912, 0.862508861777715, 2.45286228782065, 1.3481341803916, 
0.940259218257007, 2.81199346917216, 2.24623763016043, 1.32089594937998, 
3.2895235473348, 3.24080645915251, 1.8108934317248), group = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("Basal", 
"Medial", "Distal"), class = "factor")), row.names = c(NA, -12L
), class = c("ggeffects", "data.frame"), legend.labels = c("Basal", 
"Medial", "Distal"), x.is.factor = "0", continuous.group = FALSE, rawdata = structure(list(
    response = c(2.23667815433731, 0.585725623985699, 0, 2.63585811315419, 
    0, 0, 2.33374975605124, 0, 0.884942436609621, 1.16286703780418, 
    1.06709808539313, 0, 0.890758164061038, 0, 0.639404117570214, 
    2.47790759499121, 0, 0, 2.14524220682092, 0, 0, 1.9740589910418, 
    0, 0, 0, 1.25516666996646, 2.66751722923715, 0, 0, 1.92521830152371, 
    0.903597044237988, 0.945099129999455, 2.6442228874261, 2.58142029334097, 
    0, 2.32153495885343, 1.3801896215756, 1.02489379026788, 2.05743286900869, 
    1.11074999614049, 0.860338006570994, 1.55767122072119, 0.989126434016326, 
    1.21554496604287, 2.14770759585995, 1.92492507723203, 1.86644529881602, 
    2.40375462277453, 1.34200834355252, 1.14456300882461, 2.25413032451885, 
    1.05881158464742, 0.880851309461926, 2.72704842428525, 1.01414176946023, 
    1.13102772933728, 2.78511309801747, 2.0899051114394, 1.02716459664481, 
    1.90825217816864, 0.791001136920094, 2.27946840305546, 2.48278954016739, 
    0.940828612330139, 2.20441891726465, 1.95118485766815, 1.01752434498353, 
    1.22992186490351, 1.18351341124408, 1.17491390968833, 1.54441258580579, 
    1.24401572811876, 0.878566226876958, 2.35327316999556, 2.13603849721832, 
    2.29146399657572, 2.41044404137815, 2.21254419548501, 0.826472233221594, 
    2.20421121140994, 1.57587890647473, 0.897437484440932, 2.34225098899079, 
    2.38136059256142, 0.972352525321007, 1.6028414421383, 2.20134373839759, 
    0.810820367137012, 2.77026731894286, 2.29241135584685, 0.57988940596851, 
    3.71170452590752, 3.4954877455041, 3.18504082301818, 3.67423352412794, 
    2.98414705180641, 0.141639163861031, 2.41217775364379, 0.51123419122885, 
    0.476456687670469, 3.36887472776869, 3.02081502150107, 0.513445669923521, 
    3.63514892267612, 3.51925820816477, 3.40746252696249, 3.27998529166281, 
    0.623505586942313, 0.798307744015814, 3.27752745673065, 3.18652456493964, 
    0.184008911262831, 3.18983391030149, 2.77631390383718, 0.395623039048979, 
    3.46567596502934, 3.02900875924267, 0.433385505287688), x = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 
    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 
    35, 35, 35, 35, 35, 35, 35, 70, 70, 70, 70, 70, 70, 70, 70, 
    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 
    70, 70, 70, 70, 70, 70, 105, 105, 105, 105, 105, 105, 105, 
    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 
    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105), group = structure(c(1L, 
    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 
    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("Basal", 
    "Medial", "Distal"), class = "factor")), class = "data.frame", row.names = c(NA, 
-118L)), title = "Predicted values of log.Virus.Particles", x.title = "Date", y.title = "log.Virus.Particles", legend.title = "Locus", constant.values = list(
    Study.ID = "0 (population-level)"), terms = c("Date", "Locus"
), original.terms = c("Date", "Locus"), at.list = list(Date = c(0, 
35, 70, 105), Locus = c("Basal", "Medial", "Distal")), prediction.interval = FALSE, ci.lvl = 0.95, family = "gaussian", link = "identity", logistic = "0", is.trial = "0", fitfun = "lm", model.name = "model1")

>  dput(raw)
structure(list(response = c(2.23667815433731, 0.585725623985699, 
0, 2.63585811315419, 0, 0, 2.33374975605124, 0, 0.884942436609621, 
1.16286703780418, 1.06709808539313, 0, 0.890758164061038, 0, 
0.639404117570214, 2.47790759499121, 0, 0, 2.14524220682092, 
0, 0, 1.9740589910418, 0, 0, 0, 1.25516666996646, 2.66751722923715, 
0, 0, 1.92521830152371, 0.903597044237988, 0.945099129999455, 
2.6442228874261, 2.58142029334097, 0, 2.32153495885343, 1.3801896215756, 
1.02489379026788, 2.05743286900869, 1.11074999614049, 0.860338006570994, 
1.55767122072119, 0.989126434016326, 1.21554496604287, 2.14770759585995, 
1.92492507723203, 1.86644529881602, 2.40375462277453, 1.34200834355252, 
1.14456300882461, 2.25413032451885, 1.05881158464742, 0.880851309461926, 
2.72704842428525, 1.01414176946023, 1.13102772933728, 2.78511309801747, 
2.0899051114394, 1.02716459664481, 1.90825217816864, 0.791001136920094, 
2.27946840305546, 2.48278954016739, 0.940828612330139, 2.20441891726465, 
1.95118485766815, 1.01752434498353, 1.22992186490351, 1.18351341124408, 
1.17491390968833, 1.54441258580579, 1.24401572811876, 0.878566226876958, 
2.35327316999556, 2.13603849721832, 2.29146399657572, 2.41044404137815, 
2.21254419548501, 0.826472233221594, 2.20421121140994, 1.57587890647473, 
0.897437484440932, 2.34225098899079, 2.38136059256142, 0.972352525321007, 
1.6028414421383, 2.20134373839759, 0.810820367137012, 2.77026731894286, 
2.29241135584685, 0.57988940596851, 3.71170452590752, 3.4954877455041, 
3.18504082301818, 3.67423352412794, 2.98414705180641, 0.141639163861031, 
2.41217775364379, 0.51123419122885, 0.476456687670469, 3.36887472776869, 
3.02081502150107, 0.513445669923521, 3.63514892267612, 3.51925820816477, 
3.40746252696249, 3.27998529166281, 0.623505586942313, 0.798307744015814, 
3.27752745673065, 3.18652456493964, 0.184008911262831, 3.18983391030149, 
2.77631390383718, 0.395623039048979, 3.46567596502934, 3.02900875924267, 
0.433385505287688), x = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 70, 70, 70, 70, 70, 
70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 
70, 70, 70, 70, 70, 70, 70, 70, 105, 105, 105, 105, 105, 105, 
105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 
105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105), group = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L), .Label = c("Basal", "Medial", "Distal"), class = "factor")), class = "data.frame", row.names = c(NA, 
-118L))

编辑 1,处理 MrFlick 的评论

我尝试了您提供的 link 中的建议:

## Model with predictive slopes
ggplot(predict.df, aes(x = x, y = predicted, colour = group, shape = group, linetype = group)) +
  stat_smooth(method = "lm", formula = y ~ x) +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.1) +
  geom_jitter(data = raw, mapping = aes(x = x, y = response), width = 8, height = 0) +
  scale_x_continuous(name = "Sample date", breaks = c(0, 35, 70, 105), labels = c("June 26", "July 31", "Sept 4", "Oct 9")) +
  scale_y_continuous(name = "Viral load (virus/\u00b5g DNA)", breaks = c(0, 1, 2, 3), labels = c(1, 10, 100, 1000)) +
  theme_pubr(legend = "right") +
  scale_color_brewer(name = "Raw data", palette = "Dark2") +
  scale_fill_brewer(name = "Prediction", palette = "Dark2") +
  scale_linetype_discrete(name = "Prediction") +
  scale_shape_discrete(name = "Raw data")

最后是:

无论我尝试什么,这或多或少都是我的结局。

我想你可以通过改变 guides:

来得到你想要的
ggplot(predict.df, aes(x = x, y = predicted, colour = group, 
                       shape = group, linetype = group)) +
  stat_smooth(method = "lm", formula = y ~ x) +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.1) +
  geom_jitter(data = raw, mapping = aes(x = x, y = response), width = 8, height = 0) +
  scale_x_continuous(name = "Sample date", breaks = c(0, 35, 70, 105), 
                     labels = c("June 26", "July 31", "Sept 4", "Oct 9")) +
  scale_y_continuous(name = "Viral load (virus/\u00b5g DNA)", 
                     breaks = c(0, 1, 2, 3), 
                     labels = c(1, 10, 100, 1000)) +
  theme_pubr(legend = "right") +
  labs(color = "Raw", shape = "Raw", fill = "Locus", linetype = "Locus") +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(fill = guide_legend(name = "Locus", 
                             override.aes = list(
                                    fill = RColorBrewer::brewer.pal(3, "Dark2"),
                                    alpha = 0.1)),
         linetype = guide_legend(name = "Locus", 
                                 override.aes = list(
                                    color = RColorBrewer::brewer.pal(3, "Dark2"))),
         shape = guide_legend(name = "Raw", override.aes = list(size = 3)),
         color = guide_legend(name = "Raw", 
                              override.aes = list(fill = NA,
                              linetype = 0)))