ggplot2:将线条宽度应用于图例键

14

考虑数据框 "dfc":

dfc <- structure(list(lag = c(-5L, -4L, -3L, -2L, -1L, 0L, 1L, 2L, 3L, 
       4L, 5L, -5L, -4L, -3L, -2L, -1L, 0L, 1L, 2L, 3L, 4L, 5L), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("var1", "var2"), class = "factor"), 
value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0.6, 1.2, 1.8, 
2.4, 3, 3.6, 4.2, 4.8, 5.4, 6, 6.6), size = c(2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("lag", 
"variable", "value", "size"), row.names = c(NA, -22L), class = "data.frame")

看起来像这样:

head(dfc)
  lag variable value size
1  -5     var1     1    2
2  -4     var1     2    2
3  -3     var1     3    2
4  -2     var1     4    2
5  -1     var1     5    2
6   0     var1     6    2

我希望能够根据“变量”使用不同的线条样式并根据“大小”使用不同的线条宽度绘制“滞后”与“值”的图形。我用这段代码实现了这个功能:

ggplot(dfc) +
geom_line(aes(x = lag, y = value, linetype = variable, size = size)) +
scale_size(range=c(1, 2), guide=FALSE) +
scale_linetype_manual(values = 1:2, labels = c("Name of var1    ", "Name of var2")) +
theme(legend.title = element_blank(), legend.position = "bottom",
      legend.direction = "horizontal")
给出了这个图: enter image description here 但我不知道如何同时更改图例内部线条的大小并保持重命名。
3个回答

23
z <- ggplot(dfc) + 
     geom_line(aes(x = lag, y = value, linetype = variable, size = size)) + 
     scale_size(range=c(1, 2), guide=FALSE)
z <- z + theme(legend.key.width = unit(5,"cm"))
z <- z + guides(linetype = guide_legend(override.aes = list(size = 2)))
z

我已经在之前的回答中添加了guides()函数。

增加legend.key.width宽度后,可以使用override.aes参数将其分配给linetype变量,从而更改图例中线条的大小。 enter image description here

这种方法可能与@cogitovita提出的不同。


var2 应该是 1,而不是 2。正如所说,我不需要改变键的宽度。 - user3710546
guide_legend中,使用list(size = c(2,1))即可正常工作。 - user3710546
2
澄清一下:legend.key.width 改变图例符号(在本例中为线条)的宽度,而 list(size = 2) 则增加了图例中线条的粗细(或高度)。 - theforestecologist
1
自从ggplot 3.4.0版本以来,线条大小参数已从size更改为linewidth。但是在guide_legend()函数中没有关于此的警告。正确的调用应该是guide_legend(override.aes = list(linewidth = 2)) - drmariod

4
library(ggplot2)
library(grid)

z <- ggplot(dfc) + geom_line(aes(x = lag, y = value, linetype = variable, size = size)) + 
     scale_size(range=c(1, 2), guide=FALSE)

z <- z + theme(legend.key.width = unit(5,"cm"))

enter image description here

使用ggplot2库包中的legend.key.width参数可以改变图例的宽度。

您可以更改宽度的数值。重要的是要加载grid库,否则R无法识别“unit”。


2
不好意思,它不能做到。我承认我的请求表述不够清晰。我想改变图例中线条的大小,而不是键本身的长度/宽度。 - user3710546

4

由于dfc是按$variable分组的,而$size在每个组内是恒定的。尝试提取$size并手动设置。

var_size = c('var1'=2, 'var2'=1)
ggplot(dfc) + 
geom_line(aes(x = lag, y = value, linetype = variable, size=variable)) + 
scale_size_manual(values=var_size)

enter image description here


好的。我现在意识到我的问题不符合我的需求。我必须进行编辑。 - user3710546

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接