Putar penanda matplotlib dengan plot errorbar

Sep 28 2020

Saya mengikuti jawaban ini untuk memutar penanda matplotlib yang sudah ada sebelumnya.

Namun, solusi di sana tidak berfungsi dengan plot errorbar. Ini sederhana 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'

T: Bagaimana saya bisa menggunakan marker matplotlib yang sudah ada yang sudah dirotasi (atau, mungkin, marker MarkerStyle apa pun) dalam plot errorbar? (Sungguh, saya ingin rotasi 90˚ thin_diamond.)

Jawaban

2 QuangHoang Sep 28 2020 at 17:36

Menarik, saya tidak tahu kenapa didesain seperti itu. Solusinya adalah merencanakan pencar terpisah:

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()

Keluaran:

evanb Oct 02 2020 at 15:52

Ini ternyata dua bug. Satu diperbaiki di PR # 16692 dimasukkan ke dalam matplotlib 3.3.0 (saya menggunakan 3.2.2). Yang lain saya harus perbaiki dan akan berada di 3.4.0. Jika Anda membutuhkan fungsionalitas ini sekarang, Anda mungkin ingin menambal matplotlib/markers.pysesuai dengan perbedaan ini .