[r] ggplot2로 범례 알파를 설정하는 방법

점이 많은 방향에 대한 풍속 그래프가 있으므로 color = month 외에 alpha = 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 알파로 만들 수있는 방법이 있습니까?

다음은 그 예입니다.
그래프 예



답변

업데이트 버전 0.9.0의 릴리스로 이제 함수 override.aes에서 사용하여 범례의 미적 값을 재정의 할 수 있습니다 guides. 따라서 다음과 같은 것을 플롯에 추가하면 :

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

그렇게해야합니다.


데이터의 빈 하위 집합을 사용하고 해당 호출의 범례를 사용하여 geom에 대한 중복 호출을 수행하여이 문제를 해결했습니다. 안타깝게도 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)


답변

ggplot이 현재이 옵션을 지원한다는 것을 나타내지 않는 것으로 보이는 이 게시물에 약간의 인터넷 검색이 나타났습니다. 다른 사람들은 gridExtra 를 사용하고 여기 에서 설명하는 viewPorts를 사용 하여 관련 문제를 해결했습니다 .

나는 그렇게 정교하지는 않지만 원하는 결과를 제공하는 한 가지 접근 방식이 있습니다. 접근 방식은 알파 매개 변수없이 실제 플로팅 영역 외부에 한 번 지오메트리를 두 번 플로팅하는 것입니다. 두 번째 도형은 alpha 매개 변수를 포함하고 범례를 억제합니다. 그런 다음 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)


답변