Jupyter Bokeh: Non-existent column name in glyph renderer

爷,独闯天下 提交于 2019-12-06 10:28:02

问题


I have a GlyphRenderer whose data_source.data is

{'index': [0, 1, 2, 3, 4, 5, 6, 7],
 'color': ['#3288bd', '#66c2a5', '#abdda4', '#e6f598', '#fee08b', '#fdae61', '#f46d43', '#d53e4f']}

The renderer's glyph is

Oval(height=0.1, width=0.2, fill_color="color")

When rendering, I see

E-1001 (BAD_COLUMN_NAME): Glyph refers to nonexistent column name: color [renderer: GlyphRenderer(id='1d1031f5-6ee3-4744-a0f7-22309798e313', ...)]

I'm clearly missing something, but this is pretty much lifted from published examples. I verified in a debugger that data_source.column_names is just ['index']; what I don't understand is why the 'color' column doesn't appear in the data source's column_names, or why Bokeh produces this warning (the graph appears to be correctly rendered).

The complete source is available at https://pastebin.com/HXAEEujP


回答1:


It's generally better to provide all relevant arguments when constructing an object rather than mutating the object after it's already been created. It's especially true for Bokeh - in many cases it does some additional work based on the arguments passed to __init__.

Take a look at this version of your code:

import math

from bokeh.io import show
from bokeh.models import GraphRenderer, StaticLayoutProvider, Oval, GlyphRenderer, ColumnDataSource, MultiLine
from bokeh.palettes import Spectral8
from bokeh.plotting import figure

N = 8
node_indices = list(range(N))

plot = figure(title="Graph Layout Demonstration", x_range=(-1.1, 1.1), y_range=(-1.1, 1.1),
              plot_width=250, plot_height=250,
              tools="", toolbar_location=None)

node_ds = ColumnDataSource(data=dict(index=node_indices,
                                     color=Spectral8),
                           name="Node Renderer")
edge_ds = ColumnDataSource(data=dict(start=[0] * N,
                                     end=node_indices),
                           name="Edge Renderer")
### start of layout code
circ = [i * 2 * math.pi / 8 for i in node_indices]
x = [math.cos(i) for i in circ]
y = [math.sin(i) for i in circ]
graph_layout = dict(zip(node_indices, zip(x, y)))
graph = GraphRenderer(node_renderer=GlyphRenderer(glyph=Oval(height=0.1, width=0.2, fill_color="color"),
                                                  data_source=node_ds),
                      edge_renderer=GlyphRenderer(glyph=MultiLine(),
                                                  data_source=edge_ds),
                      layout_provider=StaticLayoutProvider(graph_layout=graph_layout))

plot.renderers.append(graph)

show(plot)


来源:https://stackoverflow.com/questions/49358586/jupyter-bokeh-non-existent-column-name-in-glyph-renderer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!