ポイント数が非常に多い方向に対する風速のグラフがあるので、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アルファにする方法はありますか?
次に例を示します。
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)
_
少しグーグルが表示されました この投稿 これは、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)