ggplot2で凡例アルファを設定する方法


81

ポイントの数が非常に多い方向に対する風速のグラフがあるので、color = monthに加えてalpha = I(1/20)を使用しています

コードのサンプルは次のとおりです。

library(RMySQL)
library(ggplot2)
con <- dbConnect(...)
wind <- dbGetQuery(con, "SELECT speed_w/speed_e AS ratio, dir_58 as dir, MONTHNAME(timestamp) AS month, ROUND((speed_w+speed_e)/2) AS speed FROM tablename;");

png("ratio-by-speed.png",height=400,width=1200)
qplot(wind$dir,wind$ratio,ylim=c(0.5,1.5),xlim=c(0,360),color=wind$month,alpha=I(1/30),main="West/East against direction")
dev.off()

これはまともなグラフを生成しますが、私の問題は、凡例のアルファも1/30であり、判読できないことです。代わりに凡例を1アルファにする方法はありますか?

次に例を示します。 グラフの例

回答:


112

更新バージョン0.9.0のリリースでoverride.aesは、guides関数で使用して凡例の美的値をオーバーライドできるようになりました。したがって、このようなものをプロットに追加すると、次のようになります。

+ guides(colour = guide_legend(override.aes = list(alpha = 1)))

それはそれをする必要があります。


データの空のサブセットを使用してgeomを重複して呼び出し、その呼び出しの凡例を使用することで、これを回避しました。残念ながら、データフレームが実際に空の場合(たとえば、から取得subset(diamonds,FALSE)する場合)は機能しません。これは、ggplot2がこのケースをNULLデータフレームの代わりに処理するのと同じように処理するように見えるためです。ただし、1行のみのサブセットを取得し、それをNaNプロット次元の1つに設定することで同じ効果を得ることができます。これにより、プロットされなくなります。

Chaseの例に基づく:

# Alpha parameter washes out legend:
gp <- ggplot() + geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1)
print(gp)

# Full color legend:
dummyData <- diamonds[1, ]
dummyData$price <- NaN
#dummyData <- subset(diamonds, FALSE)   # this would be nicer but it doesn't work!
gp <- ggplot() +
  geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1, legend=FALSE) + 
  geom_point(data=dummyData, aes(depth, price, colour=clarity), alpha=1.0, na.rm=TRUE)
print(gp)

1
鮮やかさ。このソリューションは素晴らしかった。試してみただけです。御馳走
クリス

3
@joranのアップデートの+1(そして今では不要になった素晴らしいハック)
Gregor Thomas

バージョン0.9.3.1を使用していますが、機能しません。私が置かれているguides()様々な位置で関数を私は期待される動作を得ることはありません。ヒントはありますか?
2014

古いスレッドに追加するには、colour色の設定に使用しているものに応じて変更する必要があります。たとえば、私は、と上記の溶液を使用しguides(fill = guide_legend(...))、私が使用するのでaes(fill = val)、私のプロットのために
Mxblsdl

4

少しグーグルでこの投稿が見つかりましたが、ggplotが現在このオプションをサポートしていることを示しているようには見えません。ここで説明するように、gridExtraviewPortsを使用して、関連する問題に対処している人もいます。

私はそれほど洗練されていませんが、ここにあなたに望ましい結果を与えるはずの1つのアプローチがあります。アプローチは、geomを2回プロットすることです。1回はアルファパラメータなしで、実際のプロット領域の外側にあります。2番目のgeomには、alphaパラメーターが含まれ、凡例が抑制されます。次に、xlimとylimを使用してプロット領域を指定します。あなたがたくさんのポイントを持っていることを考えると、これはプロット時間を約2倍にしますが、あなたが求めている効果を与えるはずです。

ダイヤモンドデータセットの使用:

#Alpha parameter washes out legend
ggplot(data = diamonds, aes(depth, price, colour = clarity)) + 
geom_point(alpha = 1/10)

#Fully colored legend
ggplot() +
geom_point(data = diamonds, aes(depth, price, colour =clarity), alpha = 1/10, legend = FALSE) + 
geom_point(data = diamonds, aes(x = depth - 999999, y = price - 999999, colour = clarity)) +
xlim(40, 80) + ylim(0, 20000) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.