programing

색상 1과 색상 2의 범위에서 n가지 색상의 그라데이션

linuxpc 2023. 6. 5. 23:41
반응형

색상 1과 색상 2의 범위에서 n가지 색상의 그라데이션

저는 종종 함께 일합니다.ggplot2그라데이션을 좋게 만듭니다(예를 들어 여기를 클릭).저는 기지에서 일할 필요가 있고 저는 생각합니다.scales색 그라데이션을 만드는 데도 사용할 수 있지만 어떻게 하는지는 잘 모르겠어요.기본적인 목표는 x 색상에서 y 색상에 이르는 n색 팔레트를 생성하는 것입니다.그러나 솔루션은 기본적으로 작동해야 합니다.여기가 출발점이었는데 n을 입력할 곳이 없습니다.

 scale_colour_gradientn(colours=c("red", "blue"))

저는 다음을 잘 알고 있습니다.

brewer.pal(8, "Spectral") 

부터RColorBrewer나는 더 많은 방법을 찾고 있습니다.ggplot2이 두 가지 색상을 가지고 있으며 15가지 색상을 원하는 그라데이션을 처리합니다.내가 어떻게 그럴 수 있을까?

colorRampPalette여기서 당신의 친구가 될 수 있습니다.

colfunc <- colorRampPalette(c("black", "white"))
colfunc(10)
# [1] "#000000" "#1C1C1C" "#383838" "#555555" "#717171" "#8D8D8D" "#AAAAAA"
# [8] "#C6C6C6" "#E2E2E2" "#FFFFFF"

효과가 있다는 것을 보여주기 위해서입니다.

plot(rep(1,10),col=colfunc(10),pch=19,cex=3)

여기에 이미지 설명 입력

이전 답변을 확장하기 위해colorRampPalette두 가지 이상의 색상을 처리할 수 있습니다.

그래서 좀 더 확장된 "열 지도" 유형의 외관을 위해….

colfunc<-colorRampPalette(c("red","yellow","springgreen","royalblue"))
plot(rep(1,50),col=(colfunc(50)), pch=19,cex=2)

결과 이미지:

여기에 이미지 설명 입력

다음을 시도합니다.

color.gradient <- function(x, colors=c("red","yellow","green"), colsteps=100) {
  return( colorRampPalette(colors) (colsteps) [ findInterval(x, seq(min(x),max(x), length.out=colsteps)) ] )
}
x <- c((1:100)^2, (100:1)^2)
plot(x,col=color.gradient(x), pch=19,cex=2)

color.gradient를 사용한 색상 그림

편집
제가 이 기능이 다른 제안된 솔루션보다 우수하다고 생각하는 이유를 설명해 보겠습니다.

그림에 사용한 지수 데이터에 대해 jsol에서 제안한 함수를 적용해 보겠습니다.다음을 사용하여 두 가지 변형을 시도합니다.range그리고.length할 때에colfunc.
결과:단순히 의도한 대로 작동하지 않습니다.

colfunc <- colorRampPalette(c("red","yellow","springgreen","royalblue"))
x <- c((1:100)^2, (100:1)^2)
plot(x, col=colfunc(range(x)), pch=19,cex=2)
plot(x, col=colfunc(length(x)), pch=19,cex=2)

공변량을 사용한 색상 그림

위의 답변은 유용하지만 그래프에서는 검은색의 어두운 그라데이션을 구별하기가 어렵습니다.제가 찾은 한 가지 대안은 다음과 같이 회색의 그라데이션을 사용하는 것입니다.

palette(gray.colors(10, 0.9, 0.4))
plot(rep(1,10),col=1:10,pch=19,cex=3))

그레이 스케일에 대한 자세한 내용은 여기를 참조하십시오.

추가된

파란색과 검은색과 같은 다른 색상에 대해 위의 코드를 사용했을 때 그라데이션이 그리 명확하지 않았습니다. heat.colors()더 유용할 것 같습니다.

문서에는 더 자세한 정보와 옵션이 나와 있습니다.pdf

대안적인 접근법(이전의 답변보다 더 좋을 필요는 없습니다!)은 다음을 사용하는 것입니다.viridis꾸러미여기에서 설명하는 것처럼 두 가지 이상의 색상을 기준으로 다양한 색상 그라데이션을 사용할 수 있습니다.

패키지는 사용하기 매우 쉽습니다 - 당신은 단지 교체하기만 하면 됩니다.ggplot2스케일 채우기 함수(예:scale_fill_gradient(low = "skyblue", high = "dodgerblue4")) 동등한 값으로viridis기능.

따라서 이 그림의 코드를 변경합니다.

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = hp)) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Horse power') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_fill_gradient(low = "skyblue", high = "dodgerblue4") +
  theme_classic()

다음을 생성하는 요소:

여기에 이미지 설명 입력

다음을 사용하는 이 작업에viridis:

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = factor(cyl))) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Number\nof cylinders') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_color_viridis(discrete = TRUE) +
  theme_classic()

두 번째 줄부터 마지막 줄까지 유일한 차이점은 다음과 같습니다.scale_color_viridis(discrete = TRUE).

이 그림은 다음을 사용하여 생성됩니다.viridis:

여기에 이미지 설명 입력

누군가가 이것을 유용하게 생각하기를 바랍니다. 이것이 제가 이 질문을 받고 사용하게 된 해결책이기 때문입니다.

언급URL : https://stackoverflow.com/questions/13353213/gradient-of-n-colors-ranging-from-color-1-and-color-2

반응형