Drehen Sie die Matplotlib-Marker mit dem Fehlerbalkendiagramm
Ich folgte dieser Antwort, um bereits vorhandene Matplotlib-Marker zu drehen.
Die dortige Lösung funktioniert jedoch nicht mit Fehlerbalkendiagrammen. Hier ist ein einfaches 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'
F: Wie kann ich einen gedrehten, bereits vorhandenen Matplotlib-Marker (oder möglicherweise einen MarkerStyle-Marker) in einem Fehlerbalkendiagramm verwenden? (Wirklich, ich möchte eine 90˚-Drehung von thin_diamond.)
Antworten
Interessant, ich weiß nicht, warum es so konzipiert ist. Eine Problemumgehung besteht darin, eine separate Streuung zu zeichnen:
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()
Ausgabe:
Dies stellte sich als zwei Fehler heraus. Eine wurde in PR # 16692 fixiert und in matplotlib 3.3.0 eingebaut (ich habe 3.2.2 verwendet). Das andere musste ich reparieren und werde in 3.4.0 sein. Wenn Sie diese Funktionalität jetzt benötigen, können Sie Ihre matplotlib/markers.pyentsprechend diesem Unterschied patchen .