Подтвердить что ты не робот

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

У меня есть график скорости ветра против направления, которое имеет огромное количество точек, и поэтому я использую альфа = я (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

4b9b3361

Ответ 1

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

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

который должен это сделать.


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

Ответ 2

Немного googling появилось этот пост, который, похоже, не указывает, что ggplot в настоящее время поддерживает эту опцию. Другие рассмотрели связанные проблемы, используя gridExtra и используя viewPorts, как обсуждалось здесь,

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

Использование набора данных алмазов:

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