假设我有三个数据集:

X = [1,2,3,4]
Y1 = [4,8,12,16]
Y2 = [1,4,9,16]

我可以画散点图:

from matplotlib import pyplot as plt
plt.scatter(X,Y1,color='red')
plt.scatter(X,Y2,color='blue')
plt.show()

我怎么能有10组?

我搜索了这个,可以找到任何参考我的问题。

编辑:澄清(希望)我的问题

如果我多次调用scatter,我只能在每个scatter上设置相同的颜色。此外,我知道我可以手动设置颜色数组,但我相信有更好的方法来做到这一点。 然后我的问题是,“我如何自动地分散绘制我的几个数据集,每个数据集都有不同的颜色。

如果这有帮助,我可以轻松地为每个数据集分配一个唯一的数字。


当前回答

这个问题在2013年1月和matplotlib 1.3.1(2013年8月)之前有点棘手,这是你可以在matpplotlib网站上找到的最古老的稳定版本。但在那之后就很琐碎了。

因为当前版本的matplotlib.pylab.scatter支持赋值:颜色名称字符串数组,带有颜色映射的浮点数数组,RGB或RGBA数组。

这个答案献给@Oxinabox在2015年纠正2013年版本的我的无尽热情。


你有两个选择使用分散命令与多个颜色在一个单一的调用。

pylab。散射命令支持使用RGBA阵列做任何你想要的颜色; 回到2013年初,没有办法这样做,因为命令只支持单一颜色的整个散点集合。当我在做10000行的项目时,我想出了一个绕开它的通解。所以它很俗气,但我可以做任何形状、颜色、大小和透明的。这个技巧也可以应用于绘制路径集合,线条集合....

该代码还受到pyplot源代码的启发。我只是复制了scatter的功能,没有触发它来绘制。

pyplot命令。scatter返回一个PatchCollection对象,在“matplotlib/collections.py”文件中,一个Collection类中的私有变量_facecolors和一个方法set_facecolors。

所以当你要画散点时,你可以这样做:

# rgbaArr is a N*4 array of float numbers you know what I mean
# X is a N*2 array of coordinates
# axx is the axes object that current draw, you get it from
# axx = fig.gca()

# also import these, to recreate the within env of scatter command 
import matplotlib.markers as mmarkers
import matplotlib.transforms as mtransforms
from matplotlib.collections import PatchCollection
import matplotlib.markers as mmarkers
import matplotlib.patches as mpatches


# define this function
# m is a string of scatter marker, it could be 'o', 's' etc..
# s is the size of the point, use 1.0
# dpi, get it from axx.figure.dpi
def addPatch_point(m, s, dpi):
    marker_obj = mmarkers.MarkerStyle(m)
    path = marker_obj.get_path()
    trans = mtransforms.Affine2D().scale(np.sqrt(s*5)*dpi/72.0)
    ptch = mpatches.PathPatch(path, fill = True, transform = trans)
    return ptch

patches = []
# markerArr is an array of maker string, ['o', 's'. 'o'...]
# sizeArr is an array of size float, [1.0, 1.0. 0.5...]

for m, s in zip(markerArr, sizeArr):
    patches.append(addPatch_point(m, s, axx.figure.dpi))

pclt = PatchCollection(
                patches,
                offsets = zip(X[:,0], X[:,1]),
                transOffset = axx.transData)

pclt.set_transform(mtransforms.IdentityTransform())
pclt.set_edgecolors('none') # it's up to you
pclt._facecolors = rgbaArr

# in the end, when you decide to draw
axx.add_collection(pclt)
# and call axx's parent to draw_idle()

其他回答

你总是可以像这样使用plot()函数:

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]
plt.figure()
for y in ys:
    plt.plot(x, y, 'o')
plt.show()

简单的解决方法

如果你只有一种类型的集合(例如,没有错误条的分散),你也可以在绘制完它们之后改变颜色,这有时更容易执行。

import matplotlib.pyplot as plt
from random import randint
import numpy as np

#Let's generate some random X, Y data X = [ [frst group],[second group] ...]
X = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)]
Y = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)]
labels = range(1,len(X)+1)

fig = plt.figure()
ax = fig.add_subplot(111)
for x,y,lab in zip(X,Y,labels):
        ax.scatter(x,y,label=lab)

你需要的唯一一段代码是:

#Now this is actually the code that you need, an easy fix your colors just cut and paste not you need ax.
colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired  
colorst = [colormap(i) for i in np.linspace(0, 0.9,len(ax.collections))]       
for t,j1 in enumerate(ax.collections):
    j1.set_color(colorst[t])


ax.legend(fontsize='small')

即使在同一个子图中有许多不同的散点图,输出也会提供不同的颜色。

这个问题在2013年1月和matplotlib 1.3.1(2013年8月)之前有点棘手,这是你可以在matpplotlib网站上找到的最古老的稳定版本。但在那之后就很琐碎了。

因为当前版本的matplotlib.pylab.scatter支持赋值:颜色名称字符串数组,带有颜色映射的浮点数数组,RGB或RGBA数组。

这个答案献给@Oxinabox在2015年纠正2013年版本的我的无尽热情。


你有两个选择使用分散命令与多个颜色在一个单一的调用。

pylab。散射命令支持使用RGBA阵列做任何你想要的颜色; 回到2013年初,没有办法这样做,因为命令只支持单一颜色的整个散点集合。当我在做10000行的项目时,我想出了一个绕开它的通解。所以它很俗气,但我可以做任何形状、颜色、大小和透明的。这个技巧也可以应用于绘制路径集合,线条集合....

该代码还受到pyplot源代码的启发。我只是复制了scatter的功能,没有触发它来绘制。

pyplot命令。scatter返回一个PatchCollection对象,在“matplotlib/collections.py”文件中,一个Collection类中的私有变量_facecolors和一个方法set_facecolors。

所以当你要画散点时,你可以这样做:

# rgbaArr is a N*4 array of float numbers you know what I mean
# X is a N*2 array of coordinates
# axx is the axes object that current draw, you get it from
# axx = fig.gca()

# also import these, to recreate the within env of scatter command 
import matplotlib.markers as mmarkers
import matplotlib.transforms as mtransforms
from matplotlib.collections import PatchCollection
import matplotlib.markers as mmarkers
import matplotlib.patches as mpatches


# define this function
# m is a string of scatter marker, it could be 'o', 's' etc..
# s is the size of the point, use 1.0
# dpi, get it from axx.figure.dpi
def addPatch_point(m, s, dpi):
    marker_obj = mmarkers.MarkerStyle(m)
    path = marker_obj.get_path()
    trans = mtransforms.Affine2D().scale(np.sqrt(s*5)*dpi/72.0)
    ptch = mpatches.PathPatch(path, fill = True, transform = trans)
    return ptch

patches = []
# markerArr is an array of maker string, ['o', 's'. 'o'...]
# sizeArr is an array of size float, [1.0, 1.0. 0.5...]

for m, s in zip(markerArr, sizeArr):
    patches.append(addPatch_point(m, s, axx.figure.dpi))

pclt = PatchCollection(
                patches,
                offsets = zip(X[:,0], X[:,1]),
                transOffset = axx.transData)

pclt.set_transform(mtransforms.IdentityTransform())
pclt.set_edgecolors('none') # it's up to you
pclt._facecolors = rgbaArr

# in the end, when you decide to draw
axx.add_collection(pclt)
# and call axx's parent to draw_idle()

在matplotlib中使用不同颜色的点绘制图形的正常方法是将颜色列表作为参数传递。

例如:

import matplotlib.pyplot
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue'])

当你有一个列表的列表,你想让他们每个列表着色。 我认为最优雅的方法是@DSM提出的, 只需要做一个循环,多次调用来分散。

但如果出于某种原因,你想只调用一次,你可以用一个列表理解和一点地板划分来做一个大的颜色列表:

import matplotlib
import numpy as np

X = [1,2,3,4]
Ys = np.array([[4,8,12,16],
      [1,4,9,16],
      [17, 10, 13, 18],
      [9, 10, 18, 11],
      [4, 15, 17, 6],
      [7, 10, 8, 7],
      [9, 0, 10, 11],
      [14, 1, 15, 5],
      [8, 15, 9, 14],
       [20, 7, 1, 5]])
nCols = len(X)  
nRows = Ys.shape[0]

colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys)))

cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat
Xs=X*nRows #use list multiplication for repetition
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs)

cs = [array([ 0.5,  0. ,  1. ,  1. ]),
 array([ 0.5,  0. ,  1. ,  1. ]),
 array([ 0.5,  0. ,  1. ,  1. ]),
 array([ 0.5,  0. ,  1. ,  1. ]),
 array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
 array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
 array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
 array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
 ...
 array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
          1.00000000e+00]),
 array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
          1.00000000e+00]),
 array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
          1.00000000e+00]),
 array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
          1.00000000e+00])]

你也可以创建一个颜色列表,其中包括你在散点图中需要的所有颜色,并将其作为一个参数,如下所示:

colors = ["red", "blue", "green"]
plt.scatter(X, Y, color = colors)