Как установить легенду Альфа с ggplot2


У меня есть график скорости ветра против направления, которое имеет огромное количество точек, и поэтому я использую alpha=I (1/20) в дополнение к color=month

вот пример кода:

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 Альфа вместо этого?

вот пример:

2 58

2 ответа:

обновление С выпуском версии 0.9.0, теперь можно переопределить эстетические значения в легенде с помощью override.aes на . Поэтому, если вы добавите что-то вроде этого в свой сюжет:

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

это должно сделать это.


Я обошел это, сделав дубликат вызова geom, используя пустое подмножество данных и используя легенду из этого вызова. К сожалению, это не работает, если фрейм данных на самом деле пуст (например, как вы бы получили от subset(diamonds,FALSE)) поскольку ggplot2, похоже, относится к этому случаю так же, как и к NULL вместо фрейма данных. Но мы можем получить тот же эффект, взяв подмножество с одной строкой и установка 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 и использование видовых экранов, как обсуждалось здесь.

Я не настолько сложен, но вот один подход, который должен дать вам желаемые результаты. Подход заключается в том, чтобы построить Геом дважды, один раз без Альфа-параметра и вне реальной области построения. Этот второй geom будет включать Альфа-параметр и подавлять легенду. Затем мы определим область построения с помощью xlim и ylim. Учитывая, что у вас много очков, это примерно удвоит время построения графика, но должно дать вам эффект, который вы ищете.

использование набора данных 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)