matplotlib - pyplot - python plot color size




rgba 색상의 색조 변경 (2)

저는 RGBA 색상을 사용하여 matplotlib의 스 캐터 플롯 (단지 매체가 관련성이있는 경우)에서 로그 스케일에 많은 데이터를 플로팅합니다. 내가 할 수 있기를 원하는 것은 모든 것을 플로팅 한 후에 개별 스 캐터 포인트를 골라 내고 RGB 색상의 색조로 바꾸고 오래된 알파 값은 유지하려고합니다. 내가 현재하고있는 방식은 다음과 같습니다.

oldHSV = rgb_to_hsv(oldRGBA[:3])
newHSV = rgb_to_hsv(newRGB)
oldHSV[0] = newHSV[0]
newRGBA = hsv_to_rgb(oldHSV).tolist() + [oldRGBA[3]]

예를 들어 이전 RGBA 값의 RGB 부분을 HSV로 바꾸고 새로운 의도 된 RGB 색상에 대해 동일한 작업을 수행 한 다음 색조를 교체하고 RGB로 되돌리고 이전 알파 값을 추가합니다.

제가 수천 번이 일을하고 있기 때문에 여기에서 보내는 것보다 훨씬 오래 걸릴 수 있습니다. 한가지 가능한 해결책은 RGB와 HSV 사이의 변환을 파헤쳐 한 번에이 작업을 수행하는 방법을 파악하는 것입니다. 그러나 색상을 처리하는 방법을 알고있는 사람들이 간단하고 효율적인 방법을 찾았 으면합니다. 이것을하는 방법.

주어진 RGBA 색 A의 색조를 A의 알파 값을 유지하면서 주어진 RGB 색 B의 색조로 변경하려면 어떻게해야합니까? 다른 색상 모델 (예 : HSL)을 사용하면 작업을 단순화 할 수 있습니까? 그렇다면 도움이 될만한 것은 무엇입니까?


한 번에 모든 교체 작업을 수행 할 수있는 해결책은 다음과 같습니다.

import matplotlib.colors as clr
import matplotlib.pyplot as plt
import numpy as np


N = 100000
x = 1.2 + 800.0 * np.random.rand(N)
y = 1.2 + 800.0 * np.random.rand(N)
# Generate random colors of the form (r, g, b, a) where r = 0.0
colors = np.random.rand(4 * N).reshape((N, 4))
colors[:, 0] = 0.0
area = np.pi * (5 * np.random.rand(N))**2

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
pcol = ax.scatter(x, y, s=area, c=colors)
ax.set_xscale('log')
ax.set_yscale('log')

# Save initial figure
plt.savefig("hue.jpg")

oldRGBA = pcol.get_facecolors().reshape((N, 1, 4))
oldRGB = oldRGBA[:, :, :3]
newRGB = oldRGB
newRGB[:, :, 0] = 1.0 # Set red component to 1.0
oldHSV = clr.rgb_to_hsv(oldRGB)
newHSV = clr.rgb_to_hsv(newRGB)
oldHSV[:, :, 0] = newHSV[:, :, 0]
newRGBA = np.copy(oldRGBA)
newRGBA[:, :, :3] = clr.rgb_to_hsv(oldHSV)
pcol.set_facecolors(newRGBA[:, 0, :])

# Save modified figure
plt.savefig("hue_bis.jpg")

plt.close()

보시다시피,이 코드는 100000 포인트의 플롯을 시도하고 실제로 약 2 초 내에이를 수행합니다. 다음은 제작 된 그림입니다.

및 :

마지막 두 가지 질문과 관련하여

주어진 RGBA 색 A의 색조를 A의 알파 값을 유지하면서 주어진 RGB 색 B의 색조로 변경하려면 어떻게해야합니까?

및 :

다른 색상 모델 (예 : HSL)을 사용하면 작업을 단순화하고, 그렇다면 도움이 될까요?

나는 그러한 수정을하는 당신의 접근법이 상당한 것이라고 생각합니다. 그것은 손으로 계산을하는 것을 피합니다 ( HSL과 HSV를보십시오 ). 다른 색상 모델을 사용하는 것이 가능합니다. HSL 및 HSV는 다른 매개 변수에 영향을 미치지 않고 색조를 변경할 수 있지만 더 좋은 방법이 아닌 다른 방법 일뿐입니다.

희망이 도움이 될 것입니다.


oldRGBA 에서 알파를 추출하여 newRGB 직접 적용 할 수 newRGB 합니다.

newRGBA = colors.to_rgba(newRGB, alpha=oldRGBA[3])

참고 : matplotlib를 사용한 적이 없으며 알파 구성 요소가 색상의 네 번째 요소라고 가정합니다.





colors