Rotar marcadores matplotlib con gráfico de barra de error
Estaba siguiendo esta respuesta para rotar marcadores matplotlib preexistentes.
Sin embargo, la solución no funciona con gráficos de barra de error. He aquí un simple 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'
P: ¿Cómo puedo usar un marcador matplotlib preexistente rotado (o, quizás, cualquier marcador MarkerStyle) en un gráfico de barra de error? (Realmente quiero una rotación de 90˚ thin_diamond).
Respuestas
Interesante, no sé por qué está diseñado como tal. Una alternativa es trazar una dispersión separada:
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()
Salida:
Esto resultó ser dos errores. Uno se fijó en PR # 16692 y se incorporó a matplotlib 3.3.0 (estaba usando 3.2.2). El otro lo tuve que arreglar y estará en 3.4.0. Si necesita esta funcionalidad ahora, es posible que desee parchear su matplotlib/markers.pysegún esta diferencia .