为什么我没有使用 ggplot2 获得两个图例?

Dek*_*ike 4 r ggplot2

我正在绘制一些数据点上不同模型的预测线。我想得到一个图例,指示每个点颜色属于哪个个体,另一个图例指示每个线颜色属于哪个模型。下面我分享一个可重复性的假例子:

set.seed(123)
df <- data.frame(Height =rnorm(500, mean=175, sd=15),
                 Weight =rnorm(500, mean=70, sd=20),
                 ID = rep(c("A","B","C","D"), (500/4)))

mod1 <- lmer(Height ~ Weight + (1|ID), df)
mod2 <- lmer(Height ~ poly(Weight,2) + (1|ID), df)

y.mod1 <- predict(mod1, data.frame(Weight=df$Weight),re.form=NA) # Prediction of y according to model 1
y.mod2 <- predict(mod2, data.frame(Weight=df$Weight),re.form=NA) # Prediction of y according to model 2

df <- cbind(df, y.mod1,y.mod2)
df <- as.data.frame(df)

head(df)

    Height   Weight ID   y.mod1   y.mod2
1 166.5929 57.96214  A 175.9819 175.4918
2 171.5473 50.12603  B 176.2844 176.3003
3 198.3806 90.53570  C 174.7241 174.7082
4 176.0576 85.02123  D 174.9371 174.5487
5 176.9393 39.81667  A 176.6825 177.7303
6 200.7260 68.09705  B 175.5905 174.8027
Run Code Online (Sandbox Code Playgroud)

首先我绘制我的数据点:

Plot_a <- ggplot(df,aes(x=Weight, y=Height,colour=ID)) + 
  geom_point() +
  theme_bw() +
  guides(color=guide_legend(override.aes=list(fill=NA)))

Plot_a
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

然后,我添加与预测模型相关的行:

Plot_b <- Plot_a + 
  geom_line(data = df, aes(x=Weight, y=y.mod1,color='mod1'),show.legend = T) + 
  geom_line(data = df, aes(x=Weight, y=y.mod2,color='mod2'),show.legend = T) +
  guides(fill = guide_legend(override.aes = list(linetype = 0)),
         color=guide_legend(title=c("Model")))

Plot_b

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有谁知道为什么我没有得到两个不同的传说,一个是标题Model,另一个是ID

我想得到这个

在此处输入图片说明

Rui*_*das 6

这类问题通常与重塑数据有关。格式应该是长格式,数据是宽格式。请参阅有关如何将数据从长格式重塑为宽格式的帖子

情节层变得更简单,一个geom_line就足够了,不需要guide覆盖美学。

要自定义模型的图例文本,请创建图例向量,在本例中为plotmath,以便具有数学符号。颜色也是手动设置的。

library(dplyr)
library(tidyr)
library(ggplot2)

model_labels <- c(expression(X^1), expression(X^2))

df %>%
  pivot_longer(
    cols = c(y.mod1, y.mod2),
    names_to = "Model",
    values_to = "Value"
  ) %>%
  ggplot(aes(Weight, Height)) +
  geom_point(aes(fill = ID), shape = 21) +
  geom_line(aes(y = Value, color = Model)) +
  scale_color_manual(labels = model_labels, 
                     values = c("coral", "coral4")) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


ste*_*fan 5

问题是在 ggplot2 中,每个美学只能有一个比例和一个图例。由于您仅使用coloraes,因此您将获得一个图例。如果您想要具有相同美感的多个图例,请查看ggnewscales包装。否则,您必须使用第二种美学。

我的首选方法类似于@RuiBarradas 提出的方法。但是,要坚持您的方法,可以这样实现:

  1. 而不是linetype在您对geom_line.
  2. 将线条的颜色设置为参数,即不在 aes 内。
  3. 利用scale_linetype_manual获得两种模型的实线。
  4. 使用guide_legend来修复图例中出现的颜色
library(ggplot2)
library(lme4)
#> Loading required package: Matrix

set.seed(123)
df <- data.frame(Height =rnorm(500, mean=175, sd=15),
                 Weight =rnorm(500, mean=70, sd=20),
                 ID = rep(c("A","B","C","D"), (500/4)))

mod1 <- lmer(Height ~ Weight + (1|ID), df)
mod2 <- lmer(Height ~ poly(Weight,2) + (1|ID), df)

y.mod1 <- predict(mod1, data.frame(Weight=df$Weight),re.form=NA) # Prediction of y according to model 1
y.mod2 <- predict(mod2, data.frame(Weight=df$Weight),re.form=NA) # Prediction of y according to model 2

df <- cbind(df, y.mod1,y.mod2)
df <- as.data.frame(df)
Plot_a <- ggplot(df) + 
  geom_point(aes(x=Weight, y=Height, colour=ID)) +
  theme_bw() +
  guides(color=guide_legend(override.aes=list(fill=NA)))

line_colors <- scales::hue_pal()(2)
Plot_b <- Plot_a + 
  geom_line(aes(x=Weight, y=y.mod1, linetype = "mod1"), color = line_colors[1]) + 
  geom_line(aes(x=Weight, y=y.mod2, linetype = "mod2"), color = line_colors[2]) + 
  scale_linetype_manual(values = c(mod1 = "solid", mod2 = "solid")) +
  labs(color = "ID", linetype = "Model") +
  guides(linetype = guide_legend(override.aes = list(color = line_colors)))

Plot_b
Run Code Online (Sandbox Code Playgroud)