web-dev-qa-db-ja.com

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

ポイント数が非常に多い方向に対する風速のグラフがあるので、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アルファにする方法はありますか?

次に例を示します。 Example Graph

77
Chris

pdateバージョン0.9.0のリリースでは、guides関数で_override.aes_を使用して凡例の美的値を上書きできるようになりました。したがって、次のようなものをプロットに追加すると、

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

それでうまくいくはずです。


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

チェイスの例に基づいて:

_# 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)
_
93
yoyoyoyosef

少しグーグルが表示されました この投稿 これは、ggplotが現在このオプションをサポートしていることを示していないようです。 gridExtra を使用し、 ここ で説明したようにviewPortsを使用することで、関連する問題に対処する人もいます。

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

Diamondsデータセットを使用する:

#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) 
5
Chase