R,使用 scale_linetype_manual 更改 ggplot 图例名称

Man*_*edo 5 plot r ggplot2

我有一个看起来像这样的数据框:

> df
    Year mpft       value   type index
1   1996    2 0.033827219  solid   2.1
2   1997    2 0.133278701  solid   2.1
3   1998    2 0.261428650  solid   2.1
4   1999    2 0.394702438  solid   2.1
5   1996    3 0.019079686  solid   3.1
6   1997    3 0.074332942  solid   3.1
7   1998    3 0.149042964  solid   3.1
8   1999    3 0.227812452  solid   3.1
9   1996    4 0.009909126  solid   4.1
10  1997    4 0.026231721  solid   4.1
11  1998    4 0.052912805  solid   4.1
12  1999    4 0.086256016  solid   4.1
13  1996   17 0.017256492  solid  17.1
14  1997   17 0.079446280  solid  17.1
15  1998   17 0.166014538  solid  17.1
16  1999   17 0.316175339  solid  17.1
17  1996   18 0.080072523  solid  18.1
18  1997   18 0.313289644  solid  18.1
19  1998   18 0.629398957  solid  18.1
20  1999   18 1.024946245  solid  18.1
110 1996    2 0.031634282 dashed   2.2
21  1997    2 0.139244701 dashed   2.2
31  1998    2 0.273270126 dashed   2.2
41  1999    2 0.412409808 dashed   2.2
51  1996    3 0.019430502 dashed   3.2
61  1997    3 0.079252516 dashed   3.2
71  1998    3 0.161607337 dashed   3.2
81  1999    3 0.252595611 dashed   3.2
91  1996    4 0.009976637 dashed   4.2
101 1997    4 0.027057403 dashed   4.2
111 1998    4 0.055755671 dashed   4.2
121 1999    4 0.093064641 dashed   4.2
171 1996   18 0.061041422 dashed  18.2
181 1997   18 0.245554619 dashed  18.2
191 1998   18 0.490633135 dashed  18.2
201 1999   18 0.758070060 dashed  18.2
Run Code Online (Sandbox Code Playgroud)

我正在尝试绘制数据并有正确的图例,到目前为止我最初尝试过

ggplot(df,aes(x=Year,y=value, colour = factor(mpft),linetype=type)) +
      geom_line(aes(group = index), size = 1.4) +
      #scale_linetype_manual(name= "Run Type", values = unique(df$type), labels = run.type) +
      scale_color_manual(name = "PFT",
                         values = setNames(mycol[unique(df$mpft)], unique(df$mpft)),
                         labels = setNames(mynam[unique(df$mpft)], unique(df$mpft)))
Run Code Online (Sandbox Code Playgroud)

这给了我

在此处输入图片说明

我曾尝试添加 scale_linetype_manual

ggplot(df,aes(x=Year,y=value, colour = factor(mpft),linetype=type)) +
      geom_line(aes(group = index), size = 1.4) +
      scale_linetype_manual(name= "Run Type", values = unique(df$type), labels = run.type) +
      scale_color_manual(name = "PFT",
                         values = setNames(mycol[unique(df$mpft)], unique(df$mpft)),
                         labels = setNames(mynam[unique(df$mpft)], unique(df$mpft)))
Run Code Online (Sandbox Code Playgroud)

> run.type
[1] "current" "origED3"
Run Code Online (Sandbox Code Playgroud)

但我得到

在此处输入图片说明

它具有图例的正确名称,但具有不同的线型。我错过了什么?

编辑

dput我的数据帧的是

> dput(df)
structure(list(Year = c(1996, 1997, 1998, 1999, 1996, 1997, 1998, 
1999, 1996, 1997, 1998, 1999, 1996, 1997, 1998, 1999, 1996, 1997, 
1998, 1999, 1996, 1997, 1998, 1999, 1996, 1997, 1998, 1999, 1996, 
1997, 1998, 1999, 1996, 1997, 1998, 1999), mpft = c(2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 17L, 17L, 17L, 17L, 18L, 
18L, 18L, 18L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
18L, 18L, 18L, 18L), value = c(0.0338272191848643, 0.133278701149992, 
0.261428650232716, 0.394702437670559, 0.0190796862689925, 0.0743329421068756, 
0.149042964352043, 0.227812451937011, 0.00990912614900737, 0.0262317206863519, 
0.0529128049802722, 0.0862560162908444, 0.017256491619149, 0.0794462797803606, 
0.166014537897384, 0.31617533869767, 0.0800725232220131, 0.31328964372358, 
0.629398957462415, 1.02494624459608, 0.0316342818911836, 0.139244700529005, 
0.273270126484303, 0.412409807917143, 0.0194305022713642, 0.0792525159706922, 
0.161607337403947, 0.252595610607411, 0.00997663742883768, 0.0270574028188436, 
0.0557556714277292, 0.0930646413413941, 0.0610414215913856, 0.245554619318541, 
0.490633135315979, 0.758070059865948), type = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L), .Label = c("solid", "dashed"), class = "factor"), 
    index = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
    3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 
    7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L), .Label = c("2.1", 
    "3.1", "4.1", "17.1", "18.1", "2.2", "3.2", "4.2", "18.2"
    ), class = "factor")), .Names = c("Year", "mpft", "value", 
"type", "index"), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "20", "110", "21", "31", "41", "51", "61", "71", 
"81", "91", "101", "111", "121", "171", "181", "191", "201"), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

编辑

不是一个非常优雅的解决方案,但用"dashed""22",然后使用:

ggplot(df,aes(x=Year,y=value, colour = factor(mpft),linetype=type)) +
      geom_line(aes(group = index), size = 1.4) +
      scale_linetype_manual(name= "Run Type", values = unique(as.character(df$type)), labels = run.type) +
      scale_color_manual(name = "PFT",
                         values = setNames(mycol[unique(df$mpft)], unique(df$mpft)),
                         labels = setNames(mynam[unique(df$mpft)], unique(df$mpft)))
Run Code Online (Sandbox Code Playgroud)

我能做对

在此处输入图片说明

Z.L*_*Lin 6

有趣的问题,我以前从未遇到过这个问题。

简短回答

区别是因为第一个版本中的线型"dashed"根本不是。

长答案

在您的第一个版本中,没有指定任何linetype美观内容, ggplot 默认为scale_linetype_discrete()当前代码是:

scale_linetype <- function(..., na.value = "blank") {
  discrete_scale("linetype", "linetype_d", linetype_pal(),
    na.value = na.value, ...)
}
Run Code Online (Sandbox Code Playgroud)

因此,scale_linetype_discrete()从函数中获取其线型值linetype_pal,由包提供scales(至少,这是我找到它的唯一地方):

> scales::linetype_pal()(2)
[1] "solid" "22"  
Run Code Online (Sandbox Code Playgroud)

linetype当您在第二个版本中指定美学映射时,使用scale_linetype_manual(),对应的当前代码为:

scale_linetype_manual <- function(..., values) {
  manual_scale("linetype", values, ...)
}
Run Code Online (Sandbox Code Playgroud)

c("solid", "dashed")因此,当您在图中明确要求提供两个线型值时,ggplot 将使用它们。如果不这样做,默认值是c("solid", "22"), ,并且"22"对应于比"dashed"的模式不同的、间隔更紧密的模式。

下面的演示,使用内置数据:

df.sample <- diamonds %>% 
  filter(cut %in% c("Fair", "Good")) %>%
  group_by(cut, clarity) %>% 
  summarise(price = mean(price / carat)) %>%
  ungroup() 

p <- ggplot(df.sample,
            aes(x = clarity, y = price, group = cut,
                linetype = cut)) +
  geom_line(size = 1) +
  guides(linetype = guide_legend(keywidth = 3, keyheight = 1)) +
  theme(legend.position = c(1, 0), legend.justification = c(1, 0))

library(gridExtra)
grid.arrange(p + 
               labs(title = "Default scale",
                    subtitle = c("values = linetype_pal()(2)")),
             p + scale_linetype_manual(values = c("solid", "dashed")) +
               labs(title = "Manual scale",
                    subtitle = "values = c('solid', 'dashed')"),
             p + scale_linetype_manual(values = c("solid", "22")) +
               labs(title = "Manual scale",
                    subtitle = "values = c('solid', '22')"),
             nrow = 1)
Run Code Online (Sandbox Code Playgroud)

第三个图模仿了默认比例的行为。

阴谋


小智 1

您只是看不到线型差异 - 如果您将图例加宽,则它是可见的:

ggplot(df,aes(x=Year,y=value, colour = factor(mpft),linetype=type)) +
  geom_line(aes(group = index), size = 1.4) +
  scale_linetype_manual(name= "Run Type", values = unique(df$type), labels = run.type) +
  guides(linetype = guide_legend(keywidth = 3, keyheight = 1)) 
Run Code Online (Sandbox Code Playgroud)