我有一段代码,它使用 matplotlib 绘制一组线条并使用颜色图将颜色应用于这些线条。代码摘录和结果如下:
cm = plt.cm.get_cmap('jet')
step = 15
xi = np.linspace(data[data.columns[0]].min(), data[data.columns[0]].max(), 2)
colors_l = np.linspace(0.1, 1, len(state_means[::step]))
for i, beta in enumerate(state_means[::step]):
plt.plot(xi, beta[0] * xi + beta[1], alpha=.2, lw=1, c=cm(colors_l[i]))
Run Code Online (Sandbox Code Playgroud)
这里代码的相关部分是
c=cm(colors_l[i])
Run Code Online (Sandbox Code Playgroud)
这是在 plt.plot() 函数内。这里可以使用参数(在这种情况下为 i)来索引颜色图。
但是,如果我尝试使用散景完成类似的事情,使用它的 ColorMapper 和 line() 字形,我会遇到错误。相关的代码行和输出是
call_color_mapper = LinearColorMapper(palette="Viridis256", low=min(call_strike_vals), high=max(call_strike_vals))
call_lines=dict()
call_chain_plot = figure(y_axis_label='Call OI', x_axis_label='Dates', x_axis_type = 'datetime')
for strike in call_strikes:
call_lines[strike] = call_chain_plot.line('TIMESTAMP', strike, line_color=call_color_mapper(int(strike[2:])), source=callSource)
TypeError: 'LinearColorMapper' object is not callable
Run Code Online (Sandbox Code Playgroud)
有没有办法在散景中使用颜色映射器为一组线条字形着色?
LinearColorMapper不在 Python 中计算颜色。相反,在 JavaScript 中表示在浏览器LinearColorMapper中发生的颜色映射。如果你真的需要 Python 中的颜色,你将不得不手动映射它们,有很多方法可以做到这一点。
但您可能不会,因此在 Bokeh 中执行此操作的最佳方法是使用multi_line而不是重复调用line. 这部分是出于性能原因,Bokeh 经过优化以在“矢量化”操作上表现最佳。而且,它还允许您使用linear_cmap便利功能为您喜欢的任何数据列制作颜色映射器。这是一个完整的例子:
from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.transform import linear_cmap
output_file("cmap.html")
p = figure()
source = ColumnDataSource(data=dict(
xs=[[0,1] for i in range(256)], # x coords for each line (list of lists)
ys=[[i, i+10] for i in range(256)], # y coords for each line (list of lists)
foo=list(range(256)) # data to use for colormapping
))
p.multi_line('xs', 'ys', source=source,
color=linear_cmap('foo', "Viridis256", 0, 255))
show(p)
Run Code Online (Sandbox Code Playgroud)