1. ホーム
  2. r

[解決済み] ggplot2 で凡例のアルファ値を設定する方法

2023-05-27 09:26:59

質問

風向に対する風速のグラフがあり、膨大な数のポイントがあるため、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アルファになるように強制できる方法はありますか?

以下はその例です。

どのように解決するのですか?

更新 バージョン 0.9.0 のリリースでは、凡例の美的価値を上書きするために override.aes の中で guides 関数を使用します。ですから、このようなものをプロットに追加すると

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

とすればよいでしょう。


私は、データの空のサブセットを使用して geom を重複して呼び出し、その呼び出しからの凡例を使用することによって、これを回避しました。 残念ながら、データ フレームが実際に空である場合 (たとえば subset(diamonds,FALSE) を扱うのと同じようにこのケースを扱うようです。 NULL をデータフレームの代わりに扱うのと同じように扱います。 しかし、1行だけのサブセットを取って、それを NaN に設定することで同じ効果を得ることができます。

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)