Як встановити альфа-легенду за допомогою ggplot2


81

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

Ось зразок коду:

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 альфа?

Ось приклад: Приклад графіку

Відповіді:


112

Оновлення З виходом версії 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)

1
Блискуче. Це рішення було дивовижним. Тільки що можна було спробувати. Працює ласощі
Кріс,

3
+1 за оновлення @ joran (і чудовий хак, який зараз непотрібний)
Грегор Томас

Я використовую версію 0.9.3.1, але вона не працює для мене. Я поставив guides()функцію в різні позиції, але я не отримую очікуваної поведінки. Будь-які підказки?
поляризуйте

Щоб додати до старої нитки, вам потрібно змінити colourзалежно від того, що ви використовуєте для встановлення кольорів. Наприклад, я використовував вищезазначене рішення, guides(fill = guide_legend(...))оскільки використовував aes(fill = val)для мого сюжету
Mxblsdl

4

Трохи погуглив цей пост, що, здається, не вказує на те, що 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) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.