gpt4 book ai didi

r - ggplot2 可以在一个图例中分别控制点大小和线条大小(线宽)吗?

转载 作者:行者123 更新时间:2023-12-04 03:07:42 25 4
gpt4 key购买 nike

使用 ggplot2 的示例绘制数据点组和连接每个组均值的线,映射到相同的 aesshapelinetype :

p <- ggplot(mtcars, aes(gear, mpg, shape = factor(cyl), linetype = factor(cyl))) + 
geom_point(size = 2) +
stat_summary(fun.y = mean, geom = "line", size = 1) +
scale_shape_manual(values = c(1, 4, 19))

问题 相对于线符号,图例中的点符号显得太小而无法看到:

p

试图 enlarge point size in legend也会扩大线宽,所以这在这里没有用。
p1 <- p + guides(shape = guide_legend(override.aes = list(size = 4)))

p1

如果线宽是与 size 不同的美学,那就太好了.
我尝试添加
+ guides(linetype = guide_legend(override.aes = list(size = 1)))

这只是发出警告。
> Warning message:
In guide_merge.legend(init, x[[i]]) : Duplicated override.aes is ignored.

如果我移动 linetype 似乎也没有什么区别 aesggplot()并进入 stat_summary() .如果我只想要点符号,我可以从图例中消除线条 this way .
p2 <- p + guides(shape = guide_legend(override.aes = list(size = 4, linetype = 0)))

p2

相反,(在图形本身中保留小点符号)我想要一个图例,其中包含最后一张图像中的大点符号和第一张图像中的细线符号。有没有办法做到这一点?

最佳答案

独立设置这些属性似乎确实很困难。我只能想出一个技巧。如果您的实际数据有很大不同,则可能需要进行调整。但我所做的是使用 override.aes设置点的大小。然后我进入并构建绘图,然后手动更改实际低级网格对象中的线宽设置。这是代码

pp<-ggplot(mtcars, aes(gear, mpg, shape = factor(cyl), linetype = factor(cyl))) + 
geom_point(size = 3) +
stat_summary(fun.y = mean, geom = "line", size = 1) +
scale_shape_manual(values = c(1, 4, 19)) +
guides(shape=guide_legend(override.aes=list(size=5)))

build <- ggplot_build(pp)
gt <- ggplot_gtable(build)

segs <- grepl("geom_path.segments", sapply(gt$grobs[[8]][[1]][[1]]$grobs, '[[', "name"))
gt$grobs[[8]][[1]][[1]]$grobs[segs]<-lapply(gt$grobs[[8]][[1]][[1]]$grobs[segs],
function(x) {x$gp$lwd<-2; x})
grid.draw(gt)

神奇的数字“8”是 gt$grobs[[8]]$name=="guide-box"所以我知道我在工作传奇。我在网格图形和 gtables 方面还不是最好的,所以也许有人可以提出更优雅的方法。

关于r - ggplot2 可以在一个图例中分别控制点大小和线条大小(线宽)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25007324/

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