Я использую Bokeh в ноутбуке Python 3 Jupyter, чтобы создать простую тепловую карту. В качестве основы для своей работы я использовал пример неработоспособность.py (из https://bokeh.pydata.org/en/latest/docs/gallery/unemployment.html). Я довольно плохо знаком с Python и Bokeh, но у меня возникают проблемы с работой LabelSet, поскольку я использую категориальные данные на обоих Ось X и Y. Похоже, что он предназначен для использования координат ху
Я пытался использовать категориальные данные в качестве x и y для LabelSet, но получаю сообщение об ошибке. Я не уверен, куда идти отсюда.
Я использую раздел «Этикетки» https://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html, чтобы направлять меня.
labels = LabelSet(x='AppointmentDate', y='BookingMasterPage', text='EventCount', level='glyph', x_offset=0, y_offset=0, source=df, render_mode='canvas')
AppointmentDate и BookingMasterPage являются категориальными данными. Я хочу, чтобы EventCount отображался в каждом прямоугольнике. Приведенный выше код в результате выдает следующую ошибку:
ValueError Traceback (most recent call last)
<ipython-input-20-44d66cdb039c> in <module>
47
48 labels = LabelSet(x='AppointmentDate', y='BookingMasterPage', text='EventCount', level='glyph',
---> 49 x_offset=0, y_offset=0, source=df, render_mode='canvas')
50
51 color_bar = ColorBar(color_mapper=mapper, major_label_text_font_size="8pt",
~\Anaconda3\lib\site-packages\bokeh\model.py in __init__(self, **kwargs)
259 self._document = None
260 self._temp_document = None
--> 261 super(Model, self).__init__(**kwargs)
262 default_theme.apply_to_model(self)
263
~\Anaconda3\lib\site-packages\bokeh\core\has_props.py in __init__(self, **properties)
251
252 for name, value in properties.items():
--> 253 setattr(self, name, value)
254
255 def __setattr__(self, name, value):
~\Anaconda3\lib\site-packages\bokeh\core\has_props.py in __setattr__(self, name, value)
278
279 if name in props or (descriptor is not None and descriptor.fset is not None):
--> 280 super(HasProps, self).__setattr__(name, value)
281 else:
282 matches, text = difflib.get_close_matches(name.lower(), props), "similar"
~\Anaconda3\lib\site-packages\bokeh\core\property\descriptors.py in __set__(self, obj, value, setter)
543 raise RuntimeError("%s.%s is a readonly property" % (obj.__class__.__name__, self.name))
544
--> 545 self._internal_set(obj, value, setter=setter)
546
547 def __delete__(self, obj):
~\Anaconda3\lib\site-packages\bokeh\core\property\descriptors.py in _internal_set(self, obj, value, hint, setter)
764
765 '''
--> 766 value = self.property.prepare_value(obj, self.name, value)
767
768 old = self.__get__(obj, obj.__class__)
~\Anaconda3\lib\site-packages\bokeh\core\property\bases.py in prepare_value(self, obj_or_cls, name, value)
325 break
326 else:
--> 327 raise e
328 else:
329 value = self.transform(value)
~\Anaconda3\lib\site-packages\bokeh\core\property\bases.py in prepare_value(self, obj_or_cls, name, value)
318 try:
319 if validation_on():
--> 320 self.validate(value)
321 except ValueError as e:
322 for tp, converter in self.alternatives:
~\Anaconda3\lib\site-packages\bokeh\core\property\instance.py in validate(self, value, detail)
112 if not isinstance(value, self.instance_type):
113 msg = "" if not detail else "expected an instance of type %s, got %s of type %s" % (self.instance_type.__name__, value, type(value).__name__)
--> 114 raise ValueError(msg)
115
116 def _may_have_unstable_default(self):
ValueError: expected an instance of type DataSource, got AppointmentDate BookingMasterPage EventCount