【问题标题】:matplotlib scatter plot with different markers and colors具有不同标记和颜色的 matplotlib 散点图
【发布时间】:2014-12-16 22:06:15
【问题描述】:

我想根据 2 个外部向量的值用不同的标记和不同的颜色绘制一个图。

这是我尝试过的:

>>> s = [u'+', u'+', u'o']
>>> col = ['r','r','g']
>>> x = np.array([1,2,3])
>>> y = np.array([4,5,6])
>>> pl.scatter(x,y,marker=s,c=col)
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 233, in set_marker
    Path(marker)
  File "/usr/lib/python3/dist-packages/matplotlib/path.py", line 133, in __init__
    vertices = np.asarray(vertices, np.float_)
  File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 460, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not convert string to float: '+'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 3087, in scatter
    linewidths=linewidths, verts=verts, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 6298, in scatter
    marker_obj = mmarkers.MarkerStyle(marker)
  File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 162, in __init__
    self.set_marker(marker)
  File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 236, in set_marker
    raise ValueError('Unrecognized marker style {}'.format(marker))
ValueError: Unrecognized marker style ['+', '+', 'o']
>>> 

编辑: 建议的解决方案适用于模拟示例,但不适用于我的实际问题。 (我不知道为什么)。

这是我的完整代码:

import matplotlib.pyplot as pl
import numpy as np
locY = np.linspace(0, 1, 50) #in the real data locX and locY are coordinate of the points
locX = np.linspace(0,1,50)
p = 50

C = {0: [0, 13, 14, 19, 22, 30], 16: [1, 16, 17], 20: [15, 18, 20, 24], 37: [4, 8, 9, 33, 37, 40, 47], 41: [5, 7, 28, 32, 34, 36, 39, 41, 42, 44, 46], 26: [6, 26, 27, 29, 31, 35], 45: [10, 11, 12, 38, 43, 45, 48, 49], 21: [2, 3, 21, 23, 25]}
        index = C.keys()

        def plot_cluster(C, index):
            color_map = ['b', 'g', 'r', 'c', 'm', 'y',  'k', 'w']
            colors = []
            m_type = []


            for i in range(p):
                for pos, k in enumerate(index):
                    if i in C[k]:
                        #colors.append(pos)
                        colors.append(color_map[pos])
                        if i == k:
                            m_type.append(u'+')
                        else:
                            m_type.append(u'o')


            fig = pl.scatter(locX, locY, c=colors, s=30, cmap='spectral')
            fig = pl.locator_params(nbins=3)
            fig = pl.xlim(-0.2, 1.2)
            fig = pl.ylim(-0.2, 1.2)
            fig = pl.locator_params(nbins=5, axis='y')

            return fig

    pl.show(plot_cluster(C, index))

如果我用建议的答案替换绘图部分,我只会在图中获得 2 分(我不知道为什么)

我该如何解决?

【问题讨论】:

    标签: python matplotlib scatter-plot


    【解决方案1】:

    这行得通:

    s = [u'+', u'+', u'o']
    col = ['r','r','g']
    x = np.array([1,2,3])
    y = np.array([4,5,6])
    
    for _s, c, _x, _y in zip(s, col, x, y):
        plt.scatter(_x, _y, marker=_s, c=c)
    
    plt.xlim(0, 4)
    plt.ylim(0, 8)
    
    plt.show()
    

    像这样渲染:

    更新

    您似乎可以拥有多种颜色,并且只需调用 scatter 函数:example。多色功能在API 上得到确认,但它并没有读到您可以为标记 kwarg 指定一个可迭代对象。如果您删除 marker=s,您的代码将有效

    【讨论】:

    • 这适用于模拟示例,但不适用于实际代码。我已经更新了问题
    • 如果我尝试运行该代码,我会收到消息“AttributeError: 'module' object has no attribute 'show'”,即最后一行有问题。你能再检查一下吗
    • 它对我有用。注意缩进并在开头使用 import matplotlib.pyplot as pl 和 import numpy as np
    • @Donbeo pyplot 导入通常以plt 完成,而不是pl
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2019-11-03
    • 2016-09-04
    • 2018-07-31
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多