ggplot2修改geom_line图例标题与值报错:输入标签为何不被识别?
问题描述
给定数据框:
df <- tibble( x = c(1:6, 1:6), y = c(1, 5, 6, 4, 1, 1, 1, 4, 5, 4, 2, 2), f = c(rep("a", 6), rep("b", 6)) )
基于该数据框,针对分组变量f绘制x、y坐标的折线图,代码如下:
p <- ggplot(df, aes(x,y, group = f))+ geom_line(aes(linetype = f, col = f)) p
尝试将图例标题从f改为“Animal”,并将图例值“a”改为“cat”、“b”改为“dog”,运行以下代码:
p <- ggplot(df, aes(x,y, group = f))+ geom_line(aes(linetype = f, col = f))+ scale_linetype_manual(name = "Animal", labels = c("cat", "dog")) p
但出现报错:
Error in
f():
! Insufficient values in manual scale. 2 needed but only 0 provided.
Runrlang::last_error()to see where the error occurred.
疑问:明明输入了两个标签(cat和dog),ggplot2却无法识别,这是为什么?
原因及解决办法
问题出在scale_linetype_manual的用法上——这个函数是用来手动指定线型样式的,你只设置了图例标题和标签,但没给每个分组指定对应的线型(比如实线、虚线这类具体样式),ggplot2就会认为你没提供足够的样式值,所以报错。
另外,你同时用了linetype和col两个映射,只改scale_linetype_manual的话,颜色的图例还会保留原来的标题和标签,最后会出现两个分开的图例,这也不是你想要的效果。
给你几种可行的解决方式:
方法一:补全线型参数,同步修改颜色图例
p <- ggplot(df, aes(x,y, group = f))+ geom_line(aes(linetype = f, col = f))+ scale_linetype_manual( name = "Animal", labels = c("cat", "dog"), values = c("solid", "dashed") # 给a、b分别指定线型 )+ scale_color_manual( name = "Animal", labels = c("cat", "dog"), values = c("#E64B35", "#3182BD") # 给a、b分别指定颜色 ) p
方法二:统一处理两个映射的图例
p <- ggplot(df, aes(x,y, group = f))+ geom_line(aes(linetype = f, col = f))+ labs(linetype = "Animal", color = "Animal")+ # 把两个图例的标题改成一样的 scale_discrete_manual( aesthetics = c("linetype", "color"), labels = c("cat", "dog"), values = list(linetype = c("solid", "dashed"), color = c("#E64B35", "#3182BD")) ) p
方法三:先改数据的因子标签(最省心)
直接把数据里的f列改成带标签的因子,绘图时自动用新标签,再改图例标题就行:
df$f <- factor(df$f, levels = c("a", "b"), labels = c("cat", "dog")) p <- ggplot(df, aes(x,y, group = f))+ geom_line(aes(linetype = f, col = f))+ labs(linetype = "Animal", color = "Animal") p
内容的提问来源于stack exchange,提问作者KT_1
相关产品推荐
相关产品推荐

