首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2:创建包含多种符号、线型和颜色的图例

ggplot2:创建包含多种符号、线型和颜色的图例
EN

Stack Overflow用户
提问于 2019-05-01 00:26:06
回答 2查看 239关注 0票数 0

我正在尝试创建一个函数,它将绘制测量的流值(作为未连接的点),以及模型值的平滑曲线。我希望能够为每种类型的数据流(15分钟与24小时)制作一个独特的形状,并为两个模型流提供独特的颜色和线型。

我已经能够为我的测量值创建不同的颜色,并在图例中正确显示,但当我试图更改形状时,我遇到了麻烦。在我的曲线中尝试匹配虚线和实线也是一样的。我曾尝试将geom_point() +更改为geom_point(shape = variable) +,但这会产生此错误: Error in layer(data = data,mapping = mapping,stat = stat,geom = GeomLine,:object 'variable‘not found

代码语言:javascript
复制
ggplot(data = r1,aes(x=ReturnPeriod, y=value, color=variable)) +
  geom_point()+
  geom_line(data = r2,aes(x=ReturnPeriod, y=value))+
  ylab("Max Yearly Flow (cfs)") +
  xlab("Return Interval (years)") +
  scale_shape_manual(name = "Legend", 
                      labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                      values = c("Peak_cfs"=16, "Daily_cfs"=17, "PeakEst"=NA, 
                                 "DailyEst" = NA)) +
  scale_colour_manual(name = "Legend", 
                      labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                      values = c("Peak_cfs"="grey", "Daily_cfs"="black", "PeakEst"="dark grey", 
                                 "DailyEst" = "black")) +
  scale_linetype_manual(name = "Legend", 
                        labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                        values = c("Peak_cfs"="blank", "Daily_cfs"="blank", "PeakEst"="solid", 
                                   "DailyEst" = "dashed"))+
  guides(colour = guide_legend(override.aes = list(
    linetype = c("blank", "blank", "solid", "dashed"),
    shape = c(16,17,NA,NA),
    color = c("grey","black", "dark grey", "black")))) +
  theme(legend.position=c(0.92, 0.2),  
        legend.background = element_rect(fill="white"),
        legend.key = element_blank(),
        legend.box = "horizontal")

我的数据是:

代码语言:javascript
复制
r1 = read.table(
  header = TRUE,
  stringsAsFactors = FALSE,
  text = 
"ReturnPeriod  variable value
1      1.090909 Daily_cfs  14.3
2      1.200000 Daily_cfs  52.3
3      1.333333 Daily_cfs  66.6
4      1.500000 Daily_cfs  93.3
5      1.714286 Daily_cfs  94.3
6      2.000000 Daily_cfs 103.0
7      2.400000 Daily_cfs 107.0
8      3.000000 Daily_cfs 119.0
9      4.000000 Daily_cfs 123.0
10     6.000000 Daily_cfs 166.0
11    12.000000 Daily_cfs 207.0
12     1.090909  Peak_cfs  29.0
13     1.200000  Peak_cfs 159.0
14     1.333333  Peak_cfs 241.0
15     1.500000  Peak_cfs 255.0
16     1.714286  Peak_cfs 296.0
17     2.000000  Peak_cfs 320.0
18     2.400000  Peak_cfs 339.0
19     3.000000  Peak_cfs 351.0
20     4.000000  Peak_cfs 512.0
21     6.000000  Peak_cfs 737.0
22    12.000000  Peak_cfs 800.0"
)

r2 <- read.table(
  header = TRUE,
  stringsAsFactors = FALSE,
  text = 
    "ReturnPeriod variable      value
1      1.010101 DailyEst   8.185016
2      2.000000 DailyEst 104.434396
3      4.000000 DailyEst 148.084828
4     10.000000 DailyEst 180.992656
5     25.000000 DailyEst 199.429333
6     50.000000 DailyEst 207.967918
7      1.010101  PeakEst  14.846387
8      2.000000  PeakEst 349.352462
9      4.000000  PeakEst 547.379809
10    10.000000  PeakEst 713.827969
11    25.000000  PeakEst 815.243158
12    50.000000  PeakEst 865.063562"
)

我希望在图中24小时内得到Ob的三角形符号,但我得到的是圆圈,在图例和图形中,我试图将实线黑线变成虚线黑线。

当前代码生成的图形:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-01 13:57:32

如果将r1r2合并到r3中进行绘制,并将shape + linetype添加到aes中,则可以正常工作

代码语言:javascript
复制
library(ggplot2)

r1$variable <- factor(r1$variable)
r2$variable <- factor(r2$variable)
r3 <- rbind(r1, r2)

ggplot(data = r3, aes(x=ReturnPeriod, y=value, color=variable, shape=variable)) +
  geom_point()+
  geom_line(aes(linetype=variable))+
  ylab("Max Yearly Flow (cfs)") +
  xlab("Return Interval (years)") +
  scale_shape_manual(name = "Legend", 
                     labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                     values = c("Peak_cfs"=16, "Daily_cfs"=17, "PeakEst"=NA, 
                                "DailyEst" = NA)) +
  scale_colour_manual(name = "Legend", 
                      labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                      values = c("Peak_cfs"="grey", "Daily_cfs"="black", "PeakEst"="dark grey", 
                                 "DailyEst" = "black")) +
  scale_linetype_manual(name = "Legend",
                        labels = c("Obs 15-min", "Obs 24-hour", "15-min P3", "24-hr P3"),
                        values = c("Peak_cfs"="blank", "Daily_cfs"="blank", "PeakEst"="solid",
                                   "DailyEst" = "dashed"))+
  guides(colour = guide_legend(override.aes = list(
    linetype = c("blank", "blank", "solid", "dashed"),
    shape = c(16,17,NA,NA),
    color = c("grey","black", "dark grey", "black")))) +
  theme(legend.position=c(0.8, 0.6),  
    legend.background = element_rect(fill="white"),
    legend.key = element_blank(),
    legend.box = "horizontal")
#> Warning: Removed 12 rows containing missing values (geom_point).

票数 0
EN

Stack Overflow用户

发布于 2019-05-01 00:39:09

您需要告诉ggplot如何通过包含geom_point(aes(shape = factor(variable)))对形状进行分组

然后,您需要在scale_shape_manual(values = c(19, 17))中调用一个值,它告诉ggplot使用哪些符号(在本例中为实心圆圈和实心三角形)。这应该是而不是您当前拥有的values列表。

同样,对于geom_line调用和两种线型,也需要包括编组因子和线型值。

查看ggplot2 pages上的一些好技巧

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55925170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档