使用scale_linetype_manual更改ggplot图例名称的R代码

7

I have a dataframe which looks like this:

> 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

我正在尝试绘制数据并拥有正确的图例,目前我已经尝试过以下方法:

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)))

这给了我

在此输入图片描述

我尝试添加一个带有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.type
[1] "current" "origED3"

但我得到的是

enter image description here

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

编辑

我的数据框的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")

编辑

这并不是一个很优雅的解决方案,但将 "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)))

我能正确理解它。

在此输入图片描述


1
嗨,如果您展示dput(your_data)的输出,其他人测试您的数据会更容易。谢谢。 - tk3
你能否指定一下mynam和mycol的样子? - Hannie
我认为如果你将 values 改为 values = c(1, 2), labels = run.type),你就可以了。 - Hannie
我尝试了,但似乎不是这样。 - Manfredo
mynam和mycol只是字符数组(名称和颜色)。 - Manfredo
2个回答

6

这是一个有趣的问题,我之前在SO上没有遇到过。

简短回答

区别在于你第一版本中的线型根本不是 "dashed"

详细回答

在你的第一版中,没有为linetype审美设置任何东西,ggplot默认为scale_linetype_discrete(),而该当前代码如下:

scale_linetype <- function(..., na.value = "blank") {
  discrete_scale("linetype", "linetype_d", linetype_pal(),
    na.value = na.value, ...)
}

因此,scale_linetype_discrete()linetype_pal 函数获取其线型值,该函数由 scales 包提供(至少我只在那里找到它):
> scales::linetype_pal()(2)
[1] "solid" "22"  

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

scale_linetype_manual <- function(..., values) {
  manual_scale("linetype", values, ...)
}

因此,当您在绘图中显式地请求 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)

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

plot


我能看到一些东西,但我还不能写下解决方案。如果我使用 scale_linetype_manual(values = c("solid", "22")),我确实能够得到正确的线型。但是,如果我在我的 df$type 列中设置 "22" 而不是 "dashed",我得到的线型与宽间隔相同。我正在寻找一种将线型纳入到我的数据框中的方法,并在绘图部分引用它。 - Manfredo
在这种情况下,您应该使用scale_linetype_identity(guide =“legend”)而不是scale_linetype_manual()scale_linetype_discrete(),以让ggplot知道应将数据框中的值按原样采用。 - Z.Lin
好的,这似乎也可以。我想在这种情况下scale_linetype_manual()是不必要的通用。 - Manfredo

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)) 

我看到图例有正确的线型。我的观点是,通过使用scale_linetype_manual,线型实际上会发生变化(线条虚线更长)。 - Manfredo

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