График рассеяния mpld3 3D

Я изучаю библиотеку mpld3 и не могу понять, как создавать трехмерные диаграммы рассеяния. С Matplotlib я бы сделал:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter([1],[5],[7])
plt.show()

Точно так же с mpld3 я пробовал (в блокноте Jupyter): импортировать matplotlib.pyplot как plt из mpl_toolkits.mplot3d import Axes3D import mpld3

mpld3.enable_notebook()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter([1],[5],[7])
mpld3.display(fig) 

и я получаю сообщение об ошибке

TypeError: array([ 0.94,  1.06]) is not JSON serializable

Любые идеи?

Это полный журнал ошибок:

Traceback (most recent call last) <ipython-input-26-54fc4a65da87> in <module>()
      6 N = 50
      7 ax.scatter([1],[5],[7])
----> 8 mpld3.display(fig)

/usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in display(fig, closefig, local, **kwargs)
    288     if closefig:
    289         plt.close(fig)
--> 290     return HTML(fig_to_html(fig, **kwargs))
    291 
    292 

/usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in fig_to_html(fig, d3_url, mpld3_url, no_extras, template_type, figid, use_http, **kwargs)
    234                            d3_url=d3_url,
    235                            mpld3_url=mpld3_url,
--> 236                            figure_json=json.dumps(figure_json),
    237                            extra_css=extra_css,
    238                            extra_js=extra_js)

/usr/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, sort_keys, **kw)
    241         cls is None and indent is None and separators is None and
    242         encoding == 'utf-8' and default is None and not sort_keys and not kw):
--> 243         return _default_encoder.encode(obj)
    244     if cls is None:
    245         cls = JSONEncoder

/usr/lib/python2.7/json/encoder.pyc in encode(self, o)
    205         # exceptions aren't as detailed.  The list call should be roughly
    206         # equivalent to the PySequence_Fast that ''.join() would do.
--> 207         chunks = self.iterencode(o, _one_shot=True)
    208         if not isinstance(chunks, (list, tuple)):
    209             chunks = list(chunks)

/usr/lib/python2.7/json/encoder.pyc in iterencode(self, o, _one_shot)
    268                 self.key_separator, self.item_separator, self.sort_keys,
    269                 self.skipkeys, _one_shot)
--> 270         return _iterencode(o, 0)
    271 
    272 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,

/usr/lib/python2.7/json/encoder.pyc in default(self, o)
    182 
    183         """
--> 184         raise TypeError(repr(o) + " is not JSON serializable")
    185 
    186     def encode(self, o):

TypeError: array([ 0.94,  1.06]) is not JSON serializable

person Botond    schedule 03.10.2016    source источник
comment
Функция display вызывает другую функцию figure_to_html. Последнему необходимо сохранить представление фигуры в файл, а затем использовать файл JSON. Проблема в том, что массивы не поддерживают сериализацию JSON, как показано в сообщении.   -  person MMF    schedule 03.10.2016
comment
Не могли бы вы показать нам журналы?   -  person MMF    schedule 03.10.2016
comment
@MMF У ​​вас есть рабочее решение в этом случае? Откуда вообще берется массив [0.94, 1.06]? ...   -  person Botond    schedule 03.10.2016
comment
Да, это то, что я пытаюсь понять. Если бы вы могли предоставить журналы ошибок, это мне очень помогло бы!   -  person MMF    schedule 03.10.2016
comment
пожалуйста, посмотрите редактирование. Это поможет?   -  person Botond    schedule 03.10.2016
comment
Я погрузился в исходный код, но, к сожалению, не смог обнаружить ошибку. Похоже, что объект renderer имеет атрибут с именем finished_figures, и ошибка может возникнуть из-за его инициализации с использованием объектов, подобных массиву. Однако они преобразовывают массивы в списки в своем коде, поэтому я не знаю, почему это вызывает эту ошибку: / Может быть, более старая версия, содержащая ошибку? Вы думали об обновлении библиотеки?   -  person MMF    schedule 03.10.2016
comment
Спасибо за ваши усилия. У меня версия 0.2, которая кажется самой новой на pip   -  person Botond    schedule 03.10.2016
comment
Добро пожаловать !!   -  person MMF    schedule 03.10.2016
comment
mpld3 и d3 обрабатывают только 2D-графику.   -  person swatchai    schedule 06.12.2016


Ответы (3)


Как упоминалось выше, mpld3 не поддерживает трехмерные графики, но проверьте пакеты ниже, они также предназначены для визуализации через python и графически имеет преобразование фигур matplotlib в их графики, а также mpld3.

person Michael    schedule 26.09.2018

Извините, это не полный ответ, скорее длинный комментарий ...

Я мог избавиться от ошибки, отредактировав mpld3._display.py следующим образом:

class NumpyEncoder(json.JSONEncoder):
    """ Special json encoder for numpy types """

    def default(self, obj):
        try: 
            obj=obj.tolist()
            return json.JSONEncoder.encode(self, obj)
        except AttributeError:
            pass
        if isinstance(obj, (numpy.int_, numpy.intc, numpy.intp, numpy.int8,
            numpy.int16, numpy.int32, numpy.int64, numpy.uint8,
            numpy.uint16,numpy.uint32, numpy.uint64)):
            return int(obj)
        elif isinstance(obj, (numpy.float_, numpy.float16, numpy.float32, 
            numpy.float64)):
            return float(obj)

        return json.JSONEncoder.default(self, obj)

Однако он генерирует пустой график с сообщением об ошибке в записной книжке:

Javascript error adding output!
TypeError: t.map is not a function
See your browser Javascript console for more details.

похоже, что mpld3 не был разработан для поддержки 3D ...

person Dr. Goulu    schedule 23.03.2017

К сожалению, 3D-графики в настоящее время не поддерживаются в mpld3. Он поддерживает только 2D-графики. Проверьте следующие ссылки:

person Sanchit    schedule 19.04.2017