Python matplotlib散点图: 根据给定条件更改数据点的颜色

12

我有以下数据(四个等长数组):

a = [1, 4, 5, 2, 8, 9, 4, 6, 1, 0, 6]
b = [4, 7, 8, 3, 0, 9, 6, 2, 3, 6, 7]
c = [9, 0, 7, 6, 5, 6, 3, 4, 1, 2, 2]
d = [La, Lb, Av, Ac, Av, By, Lh, By, Lg, Ac, Bt]

我正在制作一张由数组a、b和c构成的三维图:

import pylab
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(a,b,c)

plt.show()

现在,我想使用名为“d”的数组对这些散点进行着色,如果相应的d中第i个元素值的第一个字母是'L',则将该点涂成红色,如果以'A'开头,则将其涂成绿色,如果以'B'开头,则将其涂成蓝色。

因此,第一个点(1,4,9)应该是红色的,第二个点(4,7,0)也是红色的,第三个点(5,8,7)应该是绿色的,依此类推...

是否可能这样做?如果您有任何想法,请帮忙解决 :)


“d”是一个字符串列表还是变量名?如果是字符串,它应该长这样:d = ['La', 'Lb', 'Av', ...] - askewchan
1
而且你可能在文件中的某个地方使用了 from mpl_toolkits.mplot3d import Axes3D - askewchan
你说得对,实际上是 d = ['La', 'Lb', 'Av', ...]。我正在处理一个复杂的大问题,这只是其中一个小部分,我卡住了。因此,我创建了这个简单的示例来提出我的问题。抱歉忘记考虑这两个小细节了! - Panchi
2个回答

17
根据scatter的文档,您可以传递c参数:

c:颜色或颜色序列,可选,默认值

c可以是单个颜色格式字符串,也可以是长度为N的颜色规范序列或N个数字序列,这些数字将使用通过kwargs指定的cmap和norm映射到颜色。注意,c不应该是单个数值RGB或RGBA序列,因为那与要进行颜色映射的值数组无法区分。但是,c可以是2-D数组,其中行是RGB或RGBA。

所以类似于以下内容:

use_colours = {"L": "red", "A": "green", "B": "blue"}
ax.scatter(a,b,c,c=[use_colours[x[0]] for x in d],s=50)

应该产生

彩色点


1
我原本想建议使用 np.select 而不是字典,但你必须聪明地从字符串数组中获取第一个字符: c=np.select(map(lambda s: s==da.view('S1,S1')['f0'], ['L', 'A', 'B']),['red','green','blue']) 或者 c=np.select(map(lambda s: s==da.view('S1,S1')['f0'], use_colours.keys()),use_colours.values()) ,但前提是颜色数量少而点的数量多。 - askewchan
@DSM:谢谢你,我没想到这个(根据相应单词的首字母分配颜色)如此简单 :) 非常感谢!!! - Panchi

1

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter

c : color or sequence of color, optional, default

"c可以是单个颜色格式字符串,也可以是长度为N的颜色规范序列或N个数字序列,通过kwargs指定cmap和norm进行颜色映射(见下文)。请注意,c不应该是单个数字RGB或RGBA序列,因为这与要进行颜色映射的值数组无法区分。c可以是一个二维数组,其中行是RGB或RGBA。"
"你试过这个吗?"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接