dnl*_*rky 4 size r line legend ggplot2
如何根据数据集中的列覆盖图例指南的aes大小值ggplot2?
请参阅此示例(编辑2:添加了试用版C,并将行大小更改为使用对数比例):
library(data.table)
set.seed(26798)
dt<-rbind(data.table(Trial="A",Value=rweibull(1000,1.0,0.5)),
data.table(Trial="B",Value=rweibull(100,1.2,0.75)),
data.table(Trial="C",Value=rweibull(10,1.3,0.8)))
# Add a count and something like a cumulative distribution:
dt2<-dt[order(Trial,Value),list(Value,N=.N),by=Trial][,list(Value,N,y=1-cumsum(N)/sum(N)),by=Trial]
dt2
## Trial Value N y
## 1: A 0.0003628745 1000 0.999
## 2: A 0.0013002615 1000 0.998
## 3: A 0.0017002173 1000 0.997
## 4: A 0.0022597343 1000 0.996
## 5: A 0.0026608082 1000 0.995
## ---
##1096: B 1.6821827814 100 0.040
##1097: B 2.2431595707 100 0.030
##1098: B 2.5122479833 100 0.020
##1099: B 2.5519954416 100 0.010
##1100: B 2.6848412995 100 0.000
ggplot(dt2) +
geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) +
scale_size(range=c(0.1, 2), trans="log") +
guides(size=F, color=guide_legend(override.aes=list(size=2)))
Run Code Online (Sandbox Code Playgroud)

我想指导图例中每个试验值的线厚度与图中的线匹配(即"A"应该是厚的,"B"应该是薄的). 编辑1: @Arun和@ChelseaE给出了手动调整每个厚度的好建议,但我的实际数据集有很多因子水平并且在不断变化,所以我需要它是"动态的".
@DidzisElferts对类似问题(控制ggplot2图例外观而不影响绘图)的答案显示了如何将大小设置为静态值.在size=2上面的例子中的最后一行的部分让我改变了传奇的行大小,但我想它匹配的情节线的大小.使用size=N相反似乎是合乎逻辑的,但它给出了错误"对象'N'未找到".什么是正确的语法?
期望的输出:

您应该相应地为A和B设置尺寸.您只设置了1个尺寸.试试这个:
p <- ggplot(dt2) +
geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) +
scale_size(range=c(0.1, 2)) +
guides(size=FALSE, color=guide_legend(override.aes=list(size=c(2, .1))))
Run Code Online (Sandbox Code Playgroud)
根据OP的评论:
好的,在这种情况下,你将不得不做更多的工作(可能更简单的方法;我现在想不到它们,如果有的话).
scales <- c(0.1, 2) # the range you want: min, max
vals <- summary(lm(scales ~ c(min(dt2$N), max(dt2$N))))$coefficients[,1]
sizes <- vals[2] * unique(dt2$N) + vals[1]
ggplot(dt2) +
geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) +
scale_size(range=scales) +
guides(size=FALSE, color=guide_legend(override.aes=list(size=sizes)))
Run Code Online (Sandbox Code Playgroud)
这应该工作.尝试一下,如果您有问题,请告诉我.