Python 具有不同标记和颜色的 matplotlib 散点图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26490817/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
matplotlib scatter plot with different markers and colors
提问by Donbeo
I would like to make a plot with different markers and different colors according to the values of 2 external vectors.
我想根据 2 个外部向量的值用不同的标记和不同的颜色绘制一个图。
Here what I have tried:
这是我尝试过的:
>>> 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']
>>>
EDIT: The proposed solution work on the simulated example but it does not work on my real problem. (I do not know why).
编辑:建议的解决方案适用于模拟示例,但不适用于我的实际问题。(我不知道为什么)。
Here my full code :
这是我的完整代码:
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))
If I replace the plotting part with the suggested answer I obtain only 2 points in the plot (I do not know why)
如果我用建议的答案替换绘图部分,我只会在图中获得 2 分(我不知道为什么)
How can I solve?
我该如何解决?
采纳答案by Noel Evans
This works:
这有效:
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()
Rendering like this:
渲染成这样:


Update
更新
It seems you can have a variety of colors and have a single call to the scatter function: example. The multiple color feature is confirmed on the APIbut it doesn't read that you can specify an iterable for the marker kwarg. Your code works if you remove marker=s
似乎您可以拥有多种颜色,并且只需一次调用 scatter 函数:example。多色功能在API上得到确认,但它没有说明您可以为标记 kwarg 指定一个可迭代对象。如果您删除,您的代码将起作用marker=s

