Multi-thread plotting - use axes instead of pyplot

 

matploblib.pyplot module은 thread-safe 하지 않다고 한다.

실제로 다음과 같이 plt.title()에서 문제가 발생하였다.

  plt.title("Measure distribution")
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/pyplot.py", line 3031, in title
  return gca().set_title(
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/pyplot.py", line 879, in gca
  return gcf().gca(**kwargs)
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/figure.py", line 1957, in gca
  return self.add_subplot(1, 1, 1, **kwargs)
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/figure.py", line 1421, in add_subplot
  return self._add_axes_internal(key, a)
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/figure.py", line 1425, in _add_axes_internal
  self._axstack.add(key, ax)
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/figure.py", line 130, in add
  super().remove((key, a_existing))
File "/opt/conda/envs/rapids/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 654, in remove
  raise ValueError('Unknown element o')
ValueError: Unknown element o

따라서 multi-thread programming 시 pyplot을 사용하여 그림을 그리는 경우 문제가 발생할 수 있기 때문에 pyplot 대신 axes 객체를 사용하여 그림을 그려야 한다.

대부분의 method는 동일한 이름을 가지고 있거나 pyplot method 이름 앞에 set_을 붙여주기만 하면 된다.
다만, pyplot.xticks() 계열은 axes.set_xticks()axes.set_xticklabels()로 나누어 적는다.

# pyplot version
fig = plt.figure()
plt.xticks(range(10), range(1, 11))

# axes version
fig = plt.figure()
ax  = fig.gca()
ax.set_xticks(range(10))
ax.set_xticklabels(range(1, 11))