Как установить легенду альфа с ggplot2 - PullRequest
69 голосов
/ 13 марта 2011

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

Вот пример: Example Graph

Ответы [ 2 ]

93 голосов
/ 24 марта 2011

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

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

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


Я справился с этим, выполнив двойной вызов геому, используяпустое подмножество данных и используя легенду из этого вызова.К сожалению, это не работает, если фрейм данных фактически пуст (например, как вы получили бы из 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)
5 голосов
/ 13 марта 2011

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

Я не такой изощренный, но вот один подход, который должен дать вам желаемые результаты.Подход заключается в том, чтобы построить геом дважды, один раз без альфа-параметра и за пределами реальной области построения.Второй 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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...