gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:20:56 28 4
gpt4 key购买 nike

我有一个如下所示的数据框:

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

这给了我

enter image description here

我尝试添加一个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")

编辑

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

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

我能做对

enter image description here

最佳答案

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

简短回答

差异是因为第一个版本中的线型不是 "dashed"完全没有。

长答案

在您的第一个版本中,没有为 linetype 指定任何内容美观,ggplot 默认为 scale_linetype_discrete() ,以及 current code因为那是:

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() ,对应current code是:

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

关于R,使用scale_linetype_manual更改ggplot图例名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50293125/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com