오차 막대 플롯으로 matplotlib 마커 회전
Sep 28 2020
나는 기존의 matplotlib 마커를 회전시키기 위해이 대답 을 따랐습니다.
그러나이 솔루션은 오차 막대 플롯에서 작동하지 않습니다. 다음은 간단합니다 example.py.
#!/usr/bin/env python3
import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
# I want to use this marker in an errorbar plot
m = MarkerStyle("D")
m._transform.scale(1.0, 0.6)
# I can use it in a scatter plot
fig, ax = plt.subplots()
plt.scatter([1,2,3],[1,2,3], s=225, marker="d")
plt.scatter([1,2,3],[2,3,4], s=225, marker=m, color="crimson")
plt.show()
# which produces a figure similar to https://stackoverflow.com/a/49662571/
# But when I use it in errorbar
fix, ax = plt.subplots()
plt.errorbar([1,2,3],[3,4,5], yerr=[0.5,0.5,0.5], marker=m, color='green')
plt.show()
# I get
#>Traceback (most recent call last):
#> File "./example.py", line 19, in <module>
#> plt.errorbar([1,2,3],[3,4,5], yerr=[0.5,0.5,0.5], marker=m, color='green')
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/pyplot.py", line 2524, in errorbar
#> return gca().errorbar(
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/__init__.py", line 1565, in inner
#> return func(ax, *map(sanitize_sequence, args), **kwargs)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/axes/_axes.py", line 3265, in errorbar
#> data_line = mlines.Line2D(x, y, **plot_line_style)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/lines.py", line 378, in __init__
#> self._marker = MarkerStyle(marker, fillstyle)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/markers.py", line 225, in __init__
#> self.set_marker(marker)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/markers.py", line 289, in set_marker
#> Path(marker)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/path.py", line 127, in __init__
#> vertices = _to_unmasked_float_array(vertices)
#> File "/usr/local/lib/python3.8/site-packages/matplotlib/cbook/__init__.py", line 1317, in _to_unmasked_float_array
#> return np.asarray(x, float)
#> File "/usr/local/lib/python3.8/site-packages/numpy/core/_asarray.py", line 83, in asarray
#> return array(a, dtype, copy=False, order=order)
#>TypeError: float() argument must be a string or a number, not 'MarkerStyle'
Q : 오차 막대 플롯에서 회전 된 기존 matplotlib 마커 (또는 MarkerStyle 마커)를 어떻게 사용할 수 있습니까? (정말 90도 회전을 원합니다 thin_diamond.)
답변
2 QuangHoang Sep 28 2020 at 17:36
흥미롭게도 왜 그렇게 설계되었는지 모르겠습니다. 해결 방법은 별도의 분산을 그리는 것입니다.
fix, ax = plt.subplots()
plt.errorbar([1,2,3],[3,4,5], yerr=[0.5,0.5,0.5], marker=None, color='green')
plt.scatter([1,2,3],[3,4,5], s=225, marker=m, color="green")
plt.show()
산출:
evanb Oct 02 2020 at 15:52
이것은 두 가지 버그로 밝혀졌습니다. PR # 16692 에서 수정 된 하나는 matplotlib 3.3.0에 통합되었습니다 (3.2.2를 사용했습니다). 다른 하나 는 수정 해야했고 3.4.0에있을 것입니다. 지금이 기능이 필요한 경우이 diffmatplotlib/markers.py 에 따라 패치를 적용 할 수 있습니다 .