można napisać własną funkcję, która przekształca wartości 0 ... 100 => 0 ... 120 stopni, a następnie wykorzystywane tę wartość jako H (lub kąt) z kolorem w przestrzeni kolorów HSV (lub HLS). Następnie można go przekonwertować na kolor RGB w celu wyświetlania. Liniowo interpretować kolor często wyglądają lepiej, gdy są obliczane w tym kolorów: Oto co HSV colorspace wygląda następująco:
Aktualizacja:
Dobre wieści, byłem mile zaskoczony, aby dowiedzieć się, że Python posiada procedury konwersji przestrzeni kolorów w swoim wbudowanym module colorsys
(w rzeczywistości oznaczają one "baterie w zestawie"). Co znajduje się ładny o to, że to sprawia, że tworzenie funkcji, która ma co opisałem dość łatwe, jak pokazano poniżej:
from colorsys import hsv_to_rgb
def pseudocolor(val, minval, maxval):
""" Convert val in range minval..maxval to the range 0..120 degrees which
correspond to the colors Red and Green in the HSV colorspace.
"""
h = (float(val-minval)/(maxval-minval)) * 120
# Convert hsv color (h,1,1) to its rgb equivalent.
# Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
r, g, b = hsv_to_rgb(h/360, 1., 1.)
return r, g, b
if __name__ == '__main__':
steps = 10
print('val R G B')
for val in range(0, 100+steps, steps):
print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
val, *pseudocolor(val, 0, 100)))
wyjściowa:
val R G B
0 -> (1.000, 0.000, 0.000)
10 -> (1.000, 0.200, 0.000)
20 -> (1.000, 0.400, 0.000)
30 -> (1.000, 0.600, 0.000)
40 -> (1.000, 0.800, 0.000)
50 -> (1.000, 1.000, 0.000)
60 -> (0.800, 1.000, 0.000)
70 -> (0.600, 1.000, 0.000)
80 -> (0.400, 1.000, 0.000)
90 -> (0.200, 1.000, 0.000)
100 -> (0.000, 1.000, 0.000)
Oto przykład pokazujący co jego wyjście wygląda następująco:
Myślę, że możesz znaleźć kolory generowane ładniej niż w mojej drugiej odpowiedzi.
Uogólniając:
Jest możliwe, aby zmodyfikować tę funkcję, aby być trochę bardziej ogólny w tym sensie, że będzie pracować z kolorami innych potem po prostu czerwony i zielony obecnie sztywno do niego.
Oto jak to zrobić:
def pseudocolor(val, minval, maxval, start_hue, stop_hue):
""" Convert val in range minval..maxval to the range start_hue..stop_hue
degrees in the HSV colorspace.
"""
h = (float(val-minval)/(maxval-minval)) * (stop_hue-start_hue) + start_hue
# Convert hsv color (h,1,1) to its rgb equivalent.
# Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
r, g, b = hsv_to_rgb(h/360, 1., 1.)
return r, g, b
if __name__ == '__main__':
# angles of common colors in hsv colorspace
RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA = range(0, 360, 60)
steps = 10
print('val R G B')
for val in range(0, 100+steps, steps):
print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
val, *pseudocolor(val, 0, 100, YEllOW, BLUE)))
Wyniki:
Dzięki. Interesująca sugestia. Choć trudno jest uwierzyć, że funkcja taka jak ta, której potrzebuję, nie jest już wbudowana w Pythonie. After, pcolor w matplotlib robi to samo. A więc musi jakoś wywoływać taką funkcję. Czy wiesz o takiej funkcji? – Nik
@Nik: Nie, nie jestem świadomy wbudowanego, i szczerze mówiąc, nie jestem zaskoczony, że nie ma takiego - jest to specyficzne dla danej domeny. Jedyną nie banalną częścią jest konwersja kolorów, którą powinieneś znaleźć w podstawowej książce komputerowej lub [online] (http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB). Prawdopodobnie jest dostępny pakiet graficzny o otwartym kodzie źródłowym z takim narzędziem, którego możesz użyć. – martineau
@Nik: Python ma wbudowane funkcje konwersji przestrzeni kolorów - zobacz moją aktualizację tej odpowiedzi. – martineau