如何使用调色板holoviews中的十六进制设置线条颜色

时间:2019-06-07 14:50:16

标签: colors holoviews line-plot

我想基于第三列在全息视图中手动指定线段的颜色。

我知道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 个答案:

答案 0 :(得分:1)

您可以通过稍微重写函数来使用所谓的暗淡变换:

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

答案 1 :(得分:0)

我想我发现了。

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)

请让我知道这是一种很好的做法,或者如果您知道更好的方法。.