4

データ セット内の列に基づいて凡例ガイドの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)))

3 つの試行のプロット

ガイド凡例の Trial の各値の線の太さをプロットの線と一致させたい (つまり、「A」は太く、「B」は細くする)。 編集 1: @Arun と @ChelseaE は、各厚さを手動で調整するための良い提案をしましたが、実際のデータセットには多くの因子レベルがあり、常に変化しているため、「動的」である必要があります。

@DidzisElferts からの同様の質問 (プロットに影響を与えずに ggplot2 の凡例の外観を制御する) への回答は、サイズを静的な値に設定する方法を示しています。上記size=2の例の最後の行の部分では、凡例の線のサイズを変更できますが、プロットの線のサイズに合わせたいと思います。代わりに使用size=Nすることは論理的に思えますが、「オブジェクト 'N' が見つかりません」というエラーが発生します。正しい構文は何ですか?

望ましい出力:

希望する凡例を含む 3 つの試行のプロット

4

2 に答える 2

6

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

これはうまくいくはずです。試してみて、問題があればお知らせください。

于 2013-08-21T17:59:02.670 に答える
1

guide_legend 内にサイズ範囲を追加してみてください。

ggplot(dt2) + geom_line(aes(x = Value, y = y, group = Trial, color = Trial, size = N)) + scale_size(range = c(0.1, 2)) + guides(size = F, color = guide_legend(override.aes = list(size = range(0.1,2))))

編集:(うまくいくかもしれませんが、わかりません)

N <- dt2$NN ( )のベクトルを作成してから、size = N

お役に立てれば。

于 2013-08-21T19:06:29.050 に答える