Numpy 我如何用三种不同的颜色绘制数据,对应于第三/第四/第五维度?

Numpy 我如何用三种不同的颜色绘制数据,对应于第三/第四/第五维度?,numpy,matplotlib,plot,Numpy,Matplotlib,Plot,很难写出我想做的事情,所以我会举个例子。以下是数据格式的示例(值由以下部分组成): 我相当肯定,如果1代表第一种类型,第二种类型,以及第三种类型列,则没有任何重叠。同时,收割台将被切断,但这很容易做到 我想做的是做一个帧与值的散点图,但是用三种颜色对应于有1而不是0的行。因此,如果我们假设第一个\u type是蓝色的,那么第4帧、第5帧和第8帧是散点图中的蓝色圆点。一些行可能有全零,可以用第四种颜色绘制。您可以使用np。其中可以确定1在哪一列,并且可以使用np。选择从颜色列表中获取颜色: whi

很难写出我想做的事情,所以我会举个例子。以下是数据格式的示例(值由以下部分组成):

我相当肯定,如果1代表
第一种类型
第二种类型
,以及
第三种类型
列,则没有任何重叠。同时,收割台将被切断,但这很容易做到


我想做的是做一个帧与值的散点图,但是用三种颜色对应于有1而不是0的行。因此,如果我们假设
第一个\u type
是蓝色的,那么第4帧、第5帧和第8帧是散点图中的蓝色圆点。一些行可能有全零,可以用第四种颜色绘制。

您可以使用
np。其中
可以确定
1
在哪一列,并且可以使用
np。选择
从颜色列表中获取颜色:

which_col = np.where(data[:, -3:])[1]
colors = np.choose(which_col, ['b', 'r', 'g'])
plt.scatter(*data[:, :2].T, c=colors)

注:以上假设每行只有一个
1
。输出的
的长度将是找到的
1
s的数量,并且仅当每行只有一个时才匹配

我刚刚注意到你说有些行没有
1
s。这将在
输出中留下空白。你可以这样处理。这也解决了一行中有多个
1
的问题:它将按最后一个值对其着色(我相信)

which_col = np.full(len(data), 3, int) # all of them are 3 for the imaginary "fourth column"
row, col = np.where(data[:, -3:])
which_col[row] = col   # in the rows with `1`s, record their `col`
colors = np.choose(which_col, ['b', 'r', 'g', 'k'])
plt.scatter(*data[:, :2].T, c=colors)

假设您的所有数据都在一系列numpy数组中(很容易将标准列表转换为),您可以在数据上使用numpy掩码数组,如下面的代码所示

这种方法的优点是增加了对标签和打印图标/颜色的控制,以及可能添加图例,如图所示。希望这有帮助,是明确的

(参见第页的图)


嗯,实际上
colors=np。数组(['b','r','g','k'])[哪个列]
可能比使用
choose
更快
choose
对于多维索引更有用。您也可以使用索引颜色贴图或边界颜色贴图执行此操作,而不计算
first\u type+2*second\u type+3*third\u type
。只要没有一个帧有两个1,就应该将每个帧保留为0、1、2或3。然后使用它从列表或
cmap
which_col = np.full(len(data), 3, int) # all of them are 3 for the imaginary "fourth column"
row, col = np.where(data[:, -3:])
which_col[row] = col   # in the rows with `1`s, record their `col`
colors = np.choose(which_col, ['b', 'r', 'g', 'k'])
plt.scatter(*data[:, :2].T, c=colors)
import random
import numpy as np
import matplotlib.pylab as plt

x          = np.array([])
y          = np.array([])
first_type = np.array([])

for _ in range(0,10):
    x          = np.append(x,random.random()*10)
    y          = np.append(y,random.random()*10)
    first_type = np.append(first_type,random.choice([0,1]))

#Introduce second mask as opposite of first.
second_type = first_type!=1

plt.close('all')

fig,ax = plt.subplots(1,1,figsize = (3.35,3.35))

ax.plot(np.ma.masked_array(x,mask = first_type),
        np.ma.masked_array(y,mask = first_type), 
        'ro',label='1st Type')

ax.plot(np.ma.masked_array(x,mask = second_type),
        np.ma.masked_array(y,mask = second_type), 
        'bs',label='2nd Type')     

ax.legend(prop={'size':8})
fig.show()