Как установить легенду Альфа с 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 ответа:
обновление С выпуском версии 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)