R语言 如何单独更改geom_path和geom_point颜色,使其反映在图例中?

u4dcyp6a  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(206)

如果我有两个数据集,我想把它们画成一条线穿过的点,我可以很简单地用这样的代码来完成。

library(ggplot2)

xdata = c(1,2,3,4,5,6)
ydata = xdata^2
ydata2 = 2^xdata
xydata = data.frame(xdata,ydata)

ggplot(xydata) +
  geom_path(aes(x=xdata,y=ydata,color="x^2"),size=1) +
  geom_point(aes(x=xdata,y=ydata,color="x^2"),size=2) +
  geom_path(aes(x=xdata,y=ydata2,color="2^x"),size=1) +
  geom_point(aes(x=xdata,y=ydata2,color="2^x"),size=2)

这将导致this plot。图例正确显示点和路径以及它们的颜色。现在,我想分别更改线和点,并使这些更改反映在图例中。但我不确定如何执行此操作。如果我尝试天真地更改路径的线型和点的颜色,这些更改不会保留到图例中。

library(ggplot2)

xdata = c(1,2,3,4,5,6)
ydata = xdata^2
ydata2 = 2^xdata
xydata = data.frame(xdata,ydata)

ggplot(xydata) +
  geom_path(aes(x=xdata,y=ydata,color="x^2"),size=1) +
  geom_point(aes(x=xdata,y=ydata,color="x^2"),size=2,color="black") +
  geom_path(aes(x=xdata,y=ydata2,color="2^x"),size=1,linetype="dashed") +
  geom_point(aes(x=xdata,y=ydata2,color="2^x"),size=2)

导致this plot。我理解为什么会这样,但是我不知道一个好的方法(意思是一般的/干净的方法)来修复图例以匹配geom_point和geom_line。这看起来会是something like this
我希望有一个快速的方法来完成这个任务,或者至少是一个简单的方法。我已经尝试了aes(填充),scale_color_manual,scale_linetype_manual和融化数据,但是一直无法得到我想要的。谢谢。

ryevplcw

ryevplcw1#

这很棘手,因为ggplot2使用“color”来控制geom_line颜色和geom_point颜色,所以我不知道一种直接的方法来混合它们并让图例反映出来。
这里的一个技巧是使用一个带有fill的geom_point形状(例如21),然后使用“fill”来代替。要使颜色和填充图例相合并,我们需要给予它们相同的名称。要使一条线为黑色,我们可以使用scale_fill_manual并指定两个点的颜色。

ggplot(xydata) +
  geom_path(aes(x=xdata,y=ydata,color="x^2"),size=1) +
  geom_point(aes(x=xdata,y=ydata,color="x^2", fill="x^2"), shape = 21, size = 3, stroke = 0) +
  geom_path(aes(x=xdata,y=ydata2,color="2^x"),size=1,linetype="dashed") +
  geom_point(aes(x=xdata,y=ydata2,color="2^x", fill = "2^x"), shape = 21, size=3, stroke = 0) +
  scale_color_discrete(name = "group") +
  scale_fill_manual(name = "group", values = c("#F8766D", "black"))

rdrgkggo

rdrgkggo2#

ggplot2中的图例反映了视觉质量(例如颜色、线型)是如何Map到数据的,因此,如果有数据可以回答“这应该是什么颜色?"的问题,那么就更容易了。因此,最好将所有“y”数据放在一个长列中,并使用另一个列来解释每个值属于哪个组,以便颜色和线型可以Map到该列。

library(ggplot2)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
xdata = c(1,2,3,4,5,6)

df <- data.frame(x = rep(xdata, 2),
                 y = c(xdata^2, 2^xdata),
                 func = factor(rep(c("x^2", "2^x"), each = 6))) %>%
  group_by(func)
df
#> # A tibble: 12 × 3
#> # Groups:   func [2]
#>        x     y func 
#>    <dbl> <dbl> <fct>
#>  1     1     1 x^2  
#>  2     2     4 x^2  
#>  3     3     9 x^2  
#>  4     4    16 x^2  
#>  5     5    25 x^2  
#>  6     6    36 x^2  
#>  7     1     2 2^x  
#>  8     2     4 2^x  
#>  9     3     8 2^x  
#> 10     4    16 2^x  
#> 11     5    32 2^x  
#> 12     6    64 2^x

ggplot(df, aes(x, y, color = func, linetype = func)) +
  geom_point() +
  geom_path() +
  scale_color_manual(values = c("red", "black"))

reprex package(v2.0.1)于2023年1月31日创建

相关问题