проблема рассеянного графика с версиями matplotlib => 2.1 - PullRequest
1 голос
/ 15 марта 2019

Мы используем matplotlib в нашем приложении для просмотра событий для отображения наборов данных.Я запускаю следующий код без проблем с версиями matplotlib <2.1, как показано в этом примере <a href="https://i.stack.imgur.com/qyK9X.png" rel="nofollow noreferrer"> plot .Мы заранее создаем объекты сюжета, а потом заполняем данными.Это значительно быстрее, чем очистка и повторное создание коллекций снова и снова.Мы должны придерживаться этого, если мы хотим сохранить разумное время реакции.

import numpy as np
from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_axes((0.1, 0.1, 0.8, 0.8),autoscale_on=False)

#Empty data plot
points = ax.scatter([],[], color='r', zorder=2)
#ax properties
ax.set_xlim(-10, 10)
ax.set_ylim(5e-2, 5e3)
ax.set_yscale("log")

#Example data points
x_data = [-5, -3, 0, 3, 5]
y_data = [1, 10, 1000, 10, 1]
#Set data points
points.set_offsets(np.dstack((x_data, y_data)))

pyplot.show()

Однако, с версией matplotlib выше 2.1, она сломана, и я не могу найти причину.

Я получаю следующее сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__
    return self.func(*args)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 590, in callit
    func(*args)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 323, in idle_draw
    self.draw()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 304, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 430, in draw
    self.figure.draw(self.renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/figure.py", line 1295, in draw
    renderer, self, artists, self.suppressComposite)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 2399, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 845, in draw
    Collection.draw(self, renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 256, in draw
    transform, transOffset, offsets, paths = self._prepare_points()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 237, in _prepare_points
    offsets = transOffset.transform_non_affine(offsets)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/transforms.py", line 2457, in transform_non_affine
    return self._a.transform_non_affine(points)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/transforms.py", line 2244, in transform_non_affine
    y_points = y_points.reshape((len(y_points), 1))
ValueError: cannot reshape array of size 2 into shape (1,1)
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__
    return self.func(*args)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 233, in resize
    self.show()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 304, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 430, in draw
    self.figure.draw(self.renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/figure.py", line 1295, in draw
    renderer, self, artists, self.suppressComposite)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 2399, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 845, in draw
    Collection.draw(self, renderer)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 256, in draw
    transform, transOffset, offsets, paths = self._prepare_points()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py", line 237, in _prepare_points
    offsets = transOffset.transform_non_affine(offsets)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/transforms.py", line 2457, in transform_non_affine
    return self._a.transform_non_affine(points)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/transforms.py", line 2244, in transform_non_affine
    y_points = y_points.reshape((len(y_points), 1))
ValueError: cannot reshape array of size 2 into shape (1,1)

Я считаю, что API некоторых функций изменился и теперь мешает построению графиков.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Чтобы объединить два 1D-массива по столбцам в 2D-массив, numpy.dstack может быть не лучшим выбором, независимо от версий matplotlib.

Вы можете использовать

np.column_stack((x_data, y_data))

или просто

np.c_[x_data, y_data]
0 голосов
/ 15 марта 2019

Если вы печатаете форму ваших массивов dstacked,

print (np.dstack((x_data, y_data)).shape)

вы получите (1, 5, 2)matplotlib versions => 2.1 все работает нормально, если вы просто используете индекс [0] для массива dstacked, который имеет форму (5, 2).Я использую matplotlib 2.2.2 и python 3.6.5


Рабочий код

import numpy as np
from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_axes((0.1, 0.1, 0.8, 0.8),autoscale_on=False)

#Empty data plot
points = ax.scatter([],[], color='r', zorder=2)
#ax properties
ax.set_xlim(-10, 10)
ax.set_ylim(5e-2, 5e3)
ax.set_yscale("log")

#Example data points
x_data = [-5, -3, 0, 3, 5]
y_data = [1, 10, 1000, 10, 1]
#Set data points
points.set_offsets(np.dstack((x_data, y_data))[0]) # <--- Here [0]
pyplot.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...