ggplot2图例不显示的原因

13

我试图在我的R ggplot2图表中展示一个涉及多个绘图的图例,但是没有成功。以下是我的数据框df和代码:

  Individuals        Mod.2        Mod.1          Mod.3
1           2 -0.013473145  0.010859793    -0.08914021
2           3 -0.011109863  0.009503278    -0.09049672
3           4 -0.006465788  0.011304668    -0.08869533
4           5  0.010536718  0.009110458    -0.09088954
5           6  0.015501212  0.005929766    -0.09407023
6           7  0.014565584  0.005530390    -0.09446961
7           8 -0.009712516  0.012234843    -0.08776516
8           9 -0.011282278  0.006569570    -0.09343043
9          10 -0.011330579  0.003505439    -0.09649456

str(df)
    'data.frame':   9 obs. of  4 variables:
     $ Individuals   : num  2 3 4 5 6 7 8 9 10
     $ Mod.2         : num  -0.01347 -0.01111 -0.00647 0.01054 0.0155 ...
     $ Mod.1         : num  0.01086 0.0095 0.0113 0.00911 0.00593 ...
     $ Mod.3         : num  -0.0891 -0.0905 -0.0887 -0.0909 -0.0941 ...

ggplot(df, aes(df$Individuals)) +
    geom_point(aes(y=df[,2]), colour="red") + geom_line(aes(y=df[,2]), colour="red") +
    geom_point(aes(y=df[,3]), colour="lightgreen") + geom_line(aes(y=df[,3]), colour="lightgreen") +
    geom_point(aes(y=df[,4]), colour="darkgreen") + geom_line(aes(y=df[,4]), colour="darkgreen") +
    labs(title = "Modules", x = "Number of individuals", y = "Mode")

我查阅了以下 Stackflow 帖子以及 Google 搜索结果:

这让我意识到,尽管图例通常会自动出现,但让图例出现是一个反复出现的问题。

我的第一个问题是使用 ggplot 时图例没有出现的原因是什么?第二个问题是如何解决这些问题。其中一个原因似乎与多个图表和使用 aes() 有关,但我怀疑还有其他原因。


1
没有实际数据框很难回答。但是在ggplot中,你正在使用普通的 plot() 语法。关键问题在于为ggplot准备数据框架。如果您提供数据框的部分内容,我很乐意帮忙。 - Joyvalley
我已经将数据框添加到我的OP中。 - MBorg
4个回答

33

应将colour= XYZ放在aes()内部,而不是外部:

geom_point(aes(data, colour=XYZ)) #------>legend

geom_point(aes(data),colour=XYZ)  #------>no legend

希望有所帮助,我花了很长时间才理解。


3
在这种情况下,颜色语句无法工作。 我目前有一个类似的问题(这就是为什么我来到这里的原因 :))。我有一个包含多个geom_line()命令的图形,我想要这些线条以热图颜色显示,但它们现在是彩虹色的。当我将color="black"放入aes()中时,颜色不起作用,没有黑色线条。 当我将color放在aes()之外时,其中一条线变成了黑色;颜色有效,但是该线的图例消失了。 我还没有同时成功地实现图例和颜色。 - alika
这是对问题的正确答案! - ibilgen

10
您在设置颜色方面的做法完全错误。您已经在多个层中将颜色设置为常量字符值,而不是将其映射到单个层中变量的值。
这主要是因为您的数据不是“整洁的”(请参见此链接)。
head(df)
  x           a          b          c
1 1 -0.71149883  2.0886033  0.3468103
2 2 -0.71122304 -2.0777620 -1.0694651
3 3 -0.27155800  0.7772972  0.6080115
4 4 -0.82038851 -1.9212633 -0.8742432
5 5 -0.71397683  1.5796136 -0.1019847
6 6 -0.02283531 -1.2957267 -0.7817367

相反,您应该首先重塑数据:

df <- data.frame(x=1:10, a=rnorm(10), b=rnorm(10), c=rnorm(10))
mdf <- reshape2::melt(df, id.var = "x")

这会生成更合适的格式:

head(mdf)
 x variable       value
1 1        a -0.71149883
2 2        a -0.71122304
3 3        a -0.27155800
4 4        a -0.82038851
5 5        a -0.71397683
6 6        a -0.02283531
这将使它在ggplot2中更容易按预期的方式使用,其中颜色被映射到变量的值:
ggplot(mdf, aes(x = x, y = value, colour = variable)) + 
    geom_point() + 
    geom_line()

ggplot函数的输出


此外,这个问题之前已经有了答案 https://dev59.com/Zp3ha4cB1Zd3GeqPOxMb?noredirect=1&lq=1 - alan ocallaghan
你的建议修复了我的代码: dfm <- reshape2::melt(df, id.var = "Individuals") plot <- ggplot(dfm, aes(x = Individuals, y = value, colour = variable)) + geom_point() + geom_line() + labs(title = "Delta 1 vs Delta 2", x = "Number of individuals", y = "Mode")我还想知道图例不显示的一般原因是什么?我猜测在多个层中将颜色设置为常量值,而不是在单个层中映射它变量是其中之一。 - MBorg
1
完全正确。通常应使用aes将美学映射到变量,而如果您只想将美学设置为静态值,则可以直接调整它(在aes之外)。例如:ggplot(mtcars, aes(x=cyl, y=mpg)) + geom_point(colour="blue") - alan ocallaghan

0
ind = 1:10
my.df <- data.frame(ind,  sample(-5:5,10,replace = T) ,  
sample(-5:5,10,replace = T) , sample(-5:5,10,replace = T))
df <- data.frame(rep(ind,3) ,c(my.df[,2],my.df[,3],my.df[,4]), 
c(rep("mod.1",10),rep("mod.2",10),rep("mod.3",10)))
colnames(df) <- c("ind","value","mod")

你的数据框应该长成这个样子

   ind value   mod
    1     5 mod.1
    2    -5 mod.1
    3     3 mod.1
    4     2 mod.1
    5    -2 mod.1
    6     5 mod.1

然后你所要做的就是:

ggplot(df, aes(x = ind, y = value, shape = mod, color = mod)) + 
geom_line() + geom_point()

尝试运行您的绘图代码会出现错误: “错误:无法将连续变量映射到形状”我也希望知道传说不出现的一般原因,而不仅仅是我的代码。无论如何,感谢您的尝试。 - MBorg
图例不显示的一般原因是你忽略了ggplot()的语法。你需要调整你的数据框以适应ggplot的要求。 - Joyvalley

-1

我曾经遇到过与标题类似的问题,但是我找到了一种显示标题的方法:您可以使用以下方式添加一个图层

  • ggtitle("您想要显示的标题名称")

例如:

ggplot(data=mtcars,
       mapping = aes(x=hp,
                     fill = factor(vs)))+
  geom_histogram(bins = 9,
                 position = 'identity',
                 alpha = 0.8, show.legend = T)+
  labs(title = 'Horse power',
       fill = 'Vs Motor',
       x = 'HP',
       y = 'conteo',
       subtitle = 'A',
       caption = 'B')+
  ggtitle("Horse power")
                

问题是关于显示图例,而不是标题。 - MBorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接