如何根据第三列值绘制带有颜色的2D数据点

时间:2018-01-25 15:00:14

标签: python numpy matplotlib

假设我有一个包含三列的数组:

>>>print(arr)
array(
    [[1 2 -1]
    [1 3 1]
    [3 2 -1]
    [5 2 -1]]
)

假设我想将其变成散点图:

plt.plot(arr[:,0], arr[:,1], 'xr')

工作正常。但是,所有分散的点看起来像红色&#39; 。假设我想要一个红色的&#39; x&#39;如果第三列值为-1,则蓝色&#39; <&#39; 如果值为1.我该怎么做?

这可以通过plt.plot()来实现吗?

3 个答案:

答案 0 :(得分:2)

如果要更改颜色标记,则需要绘制多个散点图,每个标记至少一个。

import matplotlib.pyplot as plt
import numpy as np

a = np.array([[1, 2, -1],
              [1, 3, 1],
              [3, 2, -1],
              [5, 2, -1]])
mapping= {-1: ("red", "x"), 1: ("blue", "o")}

for c in np.unique(a[:,2]):
    d = a[a[:,2] == c]
    plt.scatter(d[:,0], d[:,1], c=mapping[c][0], marker=mapping[c][1])
    #plt.plot(d[:,0], d[:,1], color=mapping[c][0], marker=mapping[c][1])

plt.show()

enter image description here

同样可以使用plot(请参阅代码中的注释行)。

答案 1 :(得分:1)

遍历您的列表,并考虑每个子列表的第3项是颜色。根据您拥有的数据对颜色进行属性化。在这里,如果'r',我将值c分配给c == -1,否则,它将等于'b',意味着 blue

from matplotlib import pyplot as plt

arr = [[1, 2, -1], [1, 3, 1], [3, 2, -1], [5, 2, -1]]

for x, y, color in arr:
    c = 'r' if color == -1 else 'b'
    plt.plot(x, y, 'x' + c)
plt.show()

答案 2 :(得分:0)

作为Python初学者,我最近遇到了类似的问题,对我来说最好的解决方案是使用精彩的“seaborn”包。

诀窍是将Pandas'DataFrame'和Seaborn的“FacetGrid”对象结合起来让他们完成所有工作。以下是我为您的特定示例所做的工作:

  • 导入pandas和seaborn
  • 将数组转换为数据框
  • 与matplotlib散点图一起创建一个seaborn facetgrid
  • 使用优秀的“Hue”参数来获得正确的颜色

这是我的代码:

导入必要的库

import seaborn as sns
import pandas as pd

创建Pandas DataFrame

a = pd.DataFrame(
    [[1, 2, -1],
    [1, 3, 1],
    [3, 2, -1],
    [5, 2, -1]])

a.columns=['A','B','C']

生成seaborn FacetGrid并使用 Hue 作为颜色

sns.FacetGrid(a, hue="C", size=2).map(plt.scatter, "A", "B").add_legend()
plt.show()

Voila!

Scatterplot with Hue

显然这是一个微不足道的例子,但是对于真实的数据,结果非常好且易于复制(见下文)

enter image description here

PS:这是我关于stackoverflow的第一篇文章 - 感觉就像某事的开始