r - 修改色标图例指南以匹配 ggplot2 中的线条大小

标签 r ggplot2 size line legend

你如何覆盖aes ggplot2 的大小值图例指南基于数据集中的列?

请参阅此示例( Edit 2 :添加了 Trial 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)))

Plot of three trials

我希望指南图例中每个 Trial 值的线条粗细与图中的线条相匹配(即“A”应该粗,“B”应该细)。 编辑 1: @Arun 和 @ChelseaE 为手动调整每个厚度提供了很好的建议,但我的实际数据集有很多因子水平并且不断变化,所以我需要它是“动态的”。

@DidzisElferts 对类似问题 ( Control ggplot2 legend look without affecting the plot ) 的回答显示了如何将大小设置为静态值。 size=2上面示例的最后一行中的部分让我更改图例的线条大小,但我希望它与图中线条的大小相匹配。使用 size=N相反似乎合乎逻辑,但它给出了错误“找不到对象'N'”。什么是正确的语法?

所需输出:

Plot of three trials with desired legend

最佳答案

您应该相应地为 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))))

按照 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)))

这应该有效。尝试一下,如果您有问题,请告诉我。

关于r - 修改色标图例指南以匹配 ggplot2 中的线条大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364367/

相关文章:

r - 是否可以在两个 R 实例之间推/拉变量?

r - map 传单上的标记 Shiny

r - `geom_a(stat="b", ... )` and ` stat_b(geom ="a",...)`之间有什么区别吗?

r - 从 geom_area 获取区域大小(离散值)

c++ - 一个变量中的最大指针数

c++ - 如何获得 boost SPSC 队列的大小?

使用 mapply() 从 Map() 再现结果

r - 提高 R 中嵌套 For 循环的性能

r - 几何密度 : remove horizontal line at zero

html - Canvas 上的大字体在 Chrome 中需要很长时间