Как установить цвета линии, используя шестнадцатеричное из цветовой палитры holoviews - PullRequest
0 голосов
/ 07 июня 2019

Я хочу указать вручную цвет отрезка линии в holoviews на основе третьего столбца.

Мне известны примеры hv.Path, однако это уменьшает длину линии на 1 сегмент, что мне не нужно.Я могу сделать это, используя bokeh, или используя matplotlib, но я не могу сделать это правильно, используя holoviews

def get_color(min_val, max_val, val, palette):
    return palette[(int((val-min_val)*((len(palette)-1)/(max_val-min_val))+.5))]
from bokeh.io import output_file, show
from bokeh.plotting import figure
y = [0,1,2,3,4,5]
x = [0]*len(y)
z = [1,2,3,4,5]
p = figure(plot_width=500, plot_height=200, tools='')
[p.line([x[i],x[i+1]],[y[i],y[i+1]],line_color = get_color(1,5,z,Viridis256), line_width=4) for i,z in enumerate(z) ]
show(p)
import numpy
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

# The line format you curently have:
lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
         [(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
         [(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
         [(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]

# Reformat it to what `LineCollection` expects:
lines = [zip(x, y) for x, y in lines]

z = np.array([0.1, 9.4, 3.8, 2.0])

fig, ax = plt.subplots()
lines = LineCollection(lines, array=z, cmap=plt.cm.rainbow, linewidths=5)
ax.add_collection(lines)
fig.colorbar(lines)

# Manually adding artists doesn't rescale the plot, so we need to autoscale
ax.autoscale()

plt.show()
from bokeh.io import output_file, show
from bokeh.plotting import figure
y = [0,1,2,3,4,5]
x = [0]*len(y)
z = [1,2,3,4,5]
p = figure(plot_width=500, plot_height=200, tools='')
[p.line([x[i],x[i+1]],[y[i],y[i+1]],line_color = get_color(1,5,z,Viridis256), line_width=4) for i,z in enumerate(z) ]
show(p)
from bokeh.palettes import Viridis256



curvlst = [hv.Curve([[x[i],y[i]],[x[i+1],y[i+1]]],line_color = get_color(1,5,z,Viridis256)) for i,z in enumerate(z) ]
hv.Overlay(curvlst)

ПРЕДУПРЕЖДЕНИЕ: param.Curve26666: Установка не-параметр line_color = # 440154 с использованием механизма, предназначенного только для параметров

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вы можете использовать так называемое диммерное преобразование, немного переписав функцию:

def get_color(val, min_val, max_val, palette):
    return [palette[(int((val-min_val)*((len(palette)-1)/(max_val-min_val))+.5))]]

y = [0,1,2,3,4,5]
x = [0]*len(y)
z = [1,2,3,4,5]

hv.NdOverlay({z: hv.Curve(([x[i],x[i+1]], [y[i],y[i+1]])) for i, z in enumerate(z)}, kdims=['z']).opts(
    'Curve', color=hv.dim('z', get_color, 1, 5, Viridis256))

При этом я не думаю, что вам нужно вручную раскрашивать кривые, поэтому я открыл: https://github.com/pyviz/holoviews/issues/3764.

0 голосов
/ 07 июня 2019

Я думаю, что я узнал ..

from bokeh.palettes import Viridis256
def get_color(min_val, max_val, val, palette):
    return palette[(int((val-min_val)*((len(palette)-1)/(max_val-min_val))+.5))]


curvlst = [hv.Curve([[x[i],y[i]],[x[i+1],y[i+1]]]).opts(color=get_color(1,5,z,Viridis256)) for i,z in enumerate(z) ]
hv.Overlay(curvlst)

Пожалуйста, дайте мне знать, что это хорошая практика, или если вы знаете лучший способ ..

...