그래프에서 플롯 선의 색상을 선택하기 위해 어떤 알고리즘이 있습니까?


19

플롯 라인RGB 또는 HSV 색상을 생성 하여 이웃과 시각적으로 구별되도록 프로그래밍 방식으로 구현할 수있는 알고리즘 또는 규칙에 관심 이 있습니다.

전문지도 제작에는지도에서 인접한 두 국가가 같은 색상이 아닌지 확인하는 알고리즘이나 규칙이 있다는 것을 알고 있습니다. 또한 Microsoft office Excel을 플롯 선 (빨간색, 파란색, 보라색 / 주황색)에 적합한 색조 / 음영을 선택하는 것으로 생각할 수 있습니다.

여기 내가 말하는 것에 대한 예가 있습니다-검정색 배경에 12 줄의 색상을 생성해야합니다. 여기의 색상은 웹 안전 RGB 색상 코드를 사용하여 수작업으로 하드 코딩했습니다. 이 선이 겹칠 때 문제가 발생합니다. 자주색, 약간 어두운 자주색 또는 보라색을보고 있는지 알기가 어렵습니다. 이와 같은 플롯 라인의 색상을 생성하는 더 나은 알고리즘을 찾고 있습니다.

여러 플롯 선 색상 예

다음은 jQuery 용 플로팅 플로팅 라이브러리를 사용하는 예입니다. 그래프의 연속 색상이 훌륭합니다. 여기에 이미지 설명을 입력하십시오



그들은 단지 기본 색상을 선택한 것 같습니다. 이 차트에는 다섯 줄만 있고 다른 예제는 12 줄입니다. Flot이 더 많은 그래프를 갖도록하면 비슷한 문제가 발생할 가능성이 높습니다. 그 많은 다른 색들만이 있고 거기에서 당신은 그늘을 반복해야하고 그들 사이에 "거리"를 가지려고 노력할 수 있습니다.
thorsten müller

1
실제 구현 측면에서 매우 흥미롭고 좋은 문제가 있지만, 테마에 대한 색상 세트 (회색조, 고 대비, 파스텔, 색맹 등)를 식별하는 것이 좋습니다. 32 또는 128 정도의 색상 (응용 프로그램에 따라 다름)에서 다음 최대 색상을 계산하는 대신 해당 배열 색인을 사용하십시오.

답변:


15

HSV와 HSL은 사람과 다르게 보이는 색상을 생성하는 데 더 적합하므로 RGB 색상 공간이 아닌 HSV 또는 HSL 색상 공간을 사용하는 것이 좋습니다. RGB에서 더 많은 작업을 수행 할 수 있습니다 (필요한 경우에는 변환이 계속 필요하지만).

HSV / HSL은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

HSV 또는 HSL 색상 공간을 사용하는 경우 두 색상의 H (색조) 구성 요소 간의 차이가 색상 간 지각 거리의 근사치 인 것으로 가정 할 수 있습니다. 즉, 색상 변화가 클수록 다른 색은 인간에게 보일 것입니다. S (채도) 및 L / V (밝기 / 값)를 사용하여 몇 가지 매우 다른 색상을 표현할 수 있지만 색조를 변경하는 것과 동일한 값 변경에 대해 다르게 보이지는 않습니다.

필요한 고유 한 색상 수에 따라 색조 공간을 여러 색상으로 나눌 수 있습니다. 예를 들어 색조 범위가 256 값이고 16 개의 고유 한 색상이 필요한 경우 첫 번째 색상은 (0, 128, 128), 두 번째 색상은 (16, 128, 128) 등이 될 수 있습니다. 나는 중간에 S / L 값을 임의로 임의로 선택했습니다. 보통 색차를 명확하게 볼 수있을 정도로 가볍고 포화됩니다. 이 시스템은 간단하며 그래프 / 맵에서 색상의 인접성에 대해 알 필요가 없다고 가정합니다.

필요한 색상 수를 미리 알지 못하지만 상한을 알고 색조 범위를 상한을 염두에 둔 색상으로 나누면 여전히 지각 적으로 다른 색상을 얻을 수 있습니다. 상한

매우 많은 고유 한 색상이 필요한 경우 비슷한 색상을 가진 그래프의 다른 요소 근처에 표시되지 않는 한 매우 유사하거나 동일한 색상을 사용하여 벗어날 수 있습니다. 렌더링하려는 그래프에서 인접 상황을 알아야하며 항상 간단하지는 않지만 Dukeling이 의견에서 지적한 것처럼 좋은 생각이 아닐 수도 있습니다. 두 가지 다른 개념에 대한 그래프에서 두 번.

따라서 가장 복잡한 상황에서는 그래프가 복잡하여 위의 시스템을 사용하여 너무 유사한 색상의 고유 한 요소로 끝나지 않도록 충분한 색상 공간이 없습니다. 이 경우 시각화 그래프 요소의 인접 그래프를 작성해야합니다. 여기의 인접성은 퍼지 개념입니다. 실제 상황에 맞게 올바르게 정의해야합니다. 예를 들어 두 번째 예에서 7 월 12 일의 데이터에는 모든 색상이 다른 모든 색상에 인접한 초크 지점이 있습니다. 인접 그래프를 빌드 할 수있는 경우 도움이 될 수있는 한 가지 방법은 그래프 색상 문제입니다. 예를 들어 C ++의 boost :: graph와 같이 도움이 될 수있는 라이브러리가 있습니다 .


교차점이 있는지 여부에 관계없이 단일 그래프에서 서로 다른 것을 나타내는 동일한 색상을 원하지 않고 (이것이 암시하는 경우) 혼동의 여지가 너무 많아서 어느 것이 어느 것인지 알아낼 수 없습니다. 그래프 채색은 관련이 없습니다. 눈치 채지 못한 경우 각 선은 하나의 색상 만 가지며 일련의 연결된 점으로 구성됩니다.
Dukeling

@Dukeling-당신은 내 요점을 오해합니다. 어느 시점에서, 아무리 신중하게 선택하더라도, 많은 다른 색상이 필요한 경우 비슷한 모양의 색상이 시작됩니다 (예 : 문제의 첫 번째 이미지에있는 자주색). 그 시점에서 내가 제안한 것처럼 순진하지만 간단한 구현은 이러한 색상을 서로 가깝게 배치하여 진행 상황을 확인하기 어렵게 만들 수 있습니다. 이때 그래프 색상을 사용하여 그래프의 "닫힌"선에 먼 색상을 사용할 수 있습니다.
Joris Timmermans

@Dukeling-동일한 색상을 재사용하는 것이 왜 좋지 않을 수 있는지에 대한 귀하의 의견을 포함하도록 답변을 편집했습니다.
Joris Timmermans

1

미리 몇 가지 다른 색상이 필요한지 미리 알지 못하는 경우 다른 흥미로운 알고리즘이 필요 합니다 . 황금 비율 알고리즘 입니다.

원하는 색상으로 시작한 다음 황금 각 (137.5 °) 단계로 컬러 휠 주위를 돌아 다니십시오 . 이 각도를 사용하면 색상환 주위의 모든 컨볼 루션 후에 새 색상이 이미 만든 색상 사이에있게됩니다.

일부 꽃에서 연속적인 작은 꽃 사이의 각도는 황금 각입니다.

( wikipedia의 이미지 )


0

나는 약간의 실험을했는데 HSL / HSV조차도 멋지고 방해받지 않고 진정 (모두 주관적이지만 ...)이지만 대조적 인 색상을위한 알맞은 알고리즘을 얻는 것이 쉽지 않다는 것을 알았습니다. 스펙터의 일부는 시각적으로 비슷합니다-esp. 녹색-파랑 섹션. 그래서 약간의 밝기 변화를 추가해야했습니다.

내가 끝내는 것은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

$.plot($('#application_pie'), data_application_pie, {
    series: { pie: { show: true,  innerRadius: 0.55, offset: { top: 0, left: -120 } } },
    colors: $.map( data_application_pie, function (item, index) {
        return jQuery.Color({
            hue: (index*0.95*360/data_application_pie.length),
            saturation: 0.95,
            //lightness: (index%2/-4)+0.55, alpha: 1
            lightness: ((index%4 == 3 ? 1:0)/-4)+0.55, alpha: 1
        }).toHexString();
    })
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.