简体   繁体   English

R,用scale_linetype_manual更改ggplot图例名称

[英]R, change ggplot legend names with scale_linetype_manual

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

I am trying to plot the data and have the right legend, so far I have initially tried with 我试图绘制数据并拥有正确的图例,到目前为止我最初尝试过

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

Which gives me 哪能给我

在此输入图像描述

I have tried adding a scale_linetype_manual with 我尝试过添加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)))

with

> run.type
[1] "current" "origED3"

But I get 但我明白了

在此输入图像描述

which has the right names for the legend but has a different linetype. 它具有正确的图例名称,但具有不同的线型。 What am I missing? 我错过了什么?

EDIT 编辑

The dput of my dataframe is 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")

EDIT 编辑

Not a very elegant solution but substituting "dashed" with "22" and then using: 不是一个非常优雅的解决方案,而是将"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)))

I am able to get it right 我能够做对

在此输入图像描述

Interesting question, and one I haven't come across on SO before. 有趣的问题,以及我之前没有遇到过的问题。

Short answer 简短的回答

The difference is because the linetype in your first version isn't "dashed" at all. 不同之处在于,您的第一个版本中的线型根本不是"dashed"

Long answer 答案很长

In your first version, without specifying anything for the linetype aesthetic, ggplot defaults to scale_linetype_discrete() , and the current code for that is: 在你的第一个版本,而无需为任何指定linetype美观,ggplot默认为scale_linetype_discrete()当前代码对于是:

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

Hence, scale_linetype_discrete() gets its linetype values from the linetype_pal function, courtesy of the scales package (at least, that's the only place I found it): 因此, scale_linetype_discrete()从获得的线型值linetype_pal功能,礼貌scales封装(至少,这只是我发现它的地方):

> scales::linetype_pal()(2)
[1] "solid" "22"  

When you specified the linetype aesthetic mapping in the second version, using scale_linetype_manual() , the corresponding current code is: 时指定的linetype在第二版本审美映射,使用scale_linetype_manual()对应的当前代码是:

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

Thus when you explicitly ask for c("solid", "dashed") as the two linetype values in your plot, ggplot uses them. 因此,当您明确要求c("solid", "dashed")作为绘图中的两个线型值时,ggplot会使用它们。 When you don't, the default values are c("solid", "22") , and "22" corresponds to a different, more tightly spaced pattern than "dashed" 's pattern. 如果不这样做,则默认值为c("solid", "22")"22"对应于与"dashed"模式不同的更紧密间隔的模式。

Demonstration below, using built-in data: 下面的演示,使用内置数据:

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)

The third plot mimics the behaviour of the default scale. 第三个图模仿默认比例的行为。

情节

you're just not able to see the linetype difference - if you make the legend wider it's visible: 你只是无法看到线型差异 - 如果你使图例更宽,它是可见的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 scale_linetype_manual 不起作用或显示在 R 中的图例上,为什么? - scale_linetype_manual is not working or shown on legend in R, why? 使用scale_linetype_manual更改ggplot图中的一行 - Change one line in the ggplot graph with scale_linetype_manual 在 r 中使用 scale_linetype_manual 错误显示名称 - Incorrectly displayed names using scale_linetype_manual in r 使用 scale_linetype_manual 的图例在图例中产生相同的行 - Legend using scale_linetype_manual results in identical lines in legend 为什么 scale_linetype_manual() 会巧妙地改变线型美学? - Why does scale_linetype_manual() subtly change the linetype aesthetic? 尝试 scale_linetype_manual 添加图例但不成功 - Tried scale_linetype_manual to add legend but not successful 如何重新排序 ggplot2 中同时具有 scale_colour_manual 和 scale_linetype_manual 的图例? - How can I reorder the legend in ggplot2 having scale_colour_manual and scale_linetype_manual together? 为什么我的 `legend.text` 和颜色没有在使用 `scale_linetype_manual` 和 `guides` 的第二个图例中正确分配? - Why my `legend.text` and colour is not assigned properly in a second legend using `scale_linetype_manual` and `guides`? ggplot中的线型手动更改 - linetype manual change in ggplot R ggplot2 更改*特别*线型图例的背景颜色 - R ggplot2 change background color of *specifically* linetype legend
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM