【问题标题】:Rotate matplotlib markers with errorbar plot使用误差线图旋转 matplotlib 标记
【发布时间】:2021-01-14 07:14:46
【问题描述】:

我关注 this answer 来旋转预先存在的 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'

问:如何在误差线图中使用旋转的预先存在的 matplotlib 标记(或者,可能是任何 MarkerStyle 标记)?(我真的想要 thin_diamond 旋转 90˚。 )

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

这原来是两个错误。一个在PR #16692 中修复,被并入matplotlib 3.3.0(我使用的是3.2.2)。 The otherhad to fix 将在 3.4.0 中。如果您现在需要此功能,您可能需要根据this diff 修补您的matplotlib/markers.py

【讨论】:

    【解决方案2】:

    有趣,我不知道为什么要这样设计。一种解决方法是绘制一个单独的散点图:

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

    输出:

    【讨论】:

    • 这对我来说应该是显而易见的!
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多