python-3.x - 参数 'c' 和 'cmap' 在 matplotlib 散点图中的表现如何?

标签 python-3.x matplotlib plot colors scikit-learn

对于 pyplot.scatter(x,y,s,c....) 函数,

matplotlib 文档指出:

c : color, sequence, or sequence of color, optional, default: 'b' The marker color. Possible values:

A single color format string. A sequence of color specifications of length n. A sequence of n numbers to be mapped to colors using cmap and norm. A 2-D array in which the rows are RGB or RGBA. Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped. If you want to specify the same RGB or RGBA value for all points, use a 2-D array with a single row.



但是,我不明白如何按照我的意愿更改数据点的颜色 .

我有这段代码:
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
import matplotlib


%matplotlib inline
matplotlib.rcParams['figure.figsize'] = (13.0, 9.0)

# Generate a dataset and plot it
np.random.seed(0)
X, y = sklearn.datasets.make_moons(200, noise=0.55)
print(y)
plt.scatter(X[:,0], X[:,1], c=y)#, cmap=plt.cm.Spectral)

the output plot

如果我愿意,如何更改颜色以假设黑色和绿色数据点?或者是其他东西 ?还请解释一下 cmap 到底是做什么的。

为什么每次使用 plt.cm.Spectral 时我的图都是洋红色和蓝色?

最佳答案

关于如何对散点进行着色,基本上有两种选择。

1. 外部映射

您可以从外部将值映射到颜色并将这些颜色的列表/数组提供给 scatterc争论。

z = np.array([1,0,1,0,1])
colors = np.array(["black", "green"])
plt.scatter(x,y, c=colors[z])

2. 内部映射

除了显式颜色之外,还可以提供一个值列表/数组,这些值应该根据归一化和颜色图映射到颜色。
  • 一个 colormap是一个可调用的,它采用 0. 之间的浮点值和 1.作为输入并返回 RGB 颜色。
  • 归一化是一个可调用的,它接受任何数字作为输入并根据一些先前设置的限制输出另一个数字。 Normalize的常见情况将提供 vmin 之间值的线性映射和 vmax0. 之间的范围和 1. .

  • 因此,从某些数据中获取颜色的自然方法是将两者链接起来,
    cmap = plt.cm.Spectral
    norm = plt.Normalize(vmin=4, vmax=5)
    z = np.array([4,4,5,4,5])
    plt.scatter(x,y, c = cmap(norm(z)))
    

    这里的值 4将映射到 0通过归一化,以及 5 的值映射到 1 ,以便颜色图提供两种最外面的颜色。

    此过程在 scatter 内部发生如果将数值数组提供给 c .

    一个 scatter创建一个 PathCollection , 子类 ScalarMappable .一个 ScalarMappable由颜色图、归一化和值数组组成。因此,上述内容通过内化
    plt.scatter(x,y, c=z, norm=norm, cmap=cmap)
    

    如果将最小和最大数据用作规范化的限制,则可以忽略该参数。
    plt.scatter(x,y, c=z, cmap=cmap)
    

    这就是问题中的输出始终为紫色和黄色点的原因,与提供给 c 的值无关。 .

    回到映射 0 数组的要求和 1对于黑色和绿色,您现在可以查看 colormaps provided by matplotlib并寻找包含黑色和绿色的颜色图。例如。 nipy_spectral颜色图

    enter image description here

    这里黑色在颜色图的开头,绿色在中间的某个地方,比如 0.5 .因此需要设置 vmin到 0,和 vmax ,使得 vmax*0.5 = 1 (使用 1 要映射到绿色的值),即 vmax = 1./0.5 == 2 .
    import matplotlib.pyplot as plt
    import numpy as np
    x,y = np.random.rand(2,6)
    z = np.array([0,0,1,1,0,1])
    
    plt.scatter(x,y, c = z, 
                norm = plt.Normalize(vmin=0, vmax=2),
                cmap = "nipy_spectral")
    
    plt.show()
    

    enter image description here

    由于可能并不总是存在具有可用颜色的颜色图,并且由于从现有颜色图中获取颜色位置可能并不直接,因此另一种方法是专门为所需目的创建新的颜色图。

    在这里,我们可以简单地创建一个黑色和绿色两种颜色的颜色图。
    matplotlib.colors.ListedColormap(["black", "green"])
    

    我们在这里不需要任何规范化,因为我们只有两个值,因此可以依靠自动规范化。
    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    import numpy as np
    x,y = np.random.rand(2,6)
    z = np.array([0,0,1,1,0,1])
    
    plt.scatter(x,y, c = z, cmap = mcolors.ListedColormap(["black", "green"]))
    
    plt.show()
    

    enter image description here

    关于python-3.x - 参数 'c' 和 'cmap' 在 matplotlib 散点图中的表现如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52108558/

    相关文章:

    python - 如何在 matplotlib 中使用(随机)*.otf 或 *.ttf 字体?

    python - 根据梯度符号为数据分配颜色 (Python)

    r - 绘制 lm 返回的模型的结果

    python-3.x - 如何使用 Python Pandas 将列的日期聚合到每个人的日期列表中?

    Python:转换电子邮件地址列表以发送电子邮件

    python - 为什么 functools.lru_cache 会破坏这个功能?

    python - 在 python 代码中与使用 Qt Designer 创建的 MatplotlibWidget 进行交互

    python - 如何从具有透明背景的 matplotlib 导出绘图?

    python-3.x - 如何标准化滚动 Pandas 数据框的子集?

    r - 更改 ggplot2 中绘制的一组因素的顺序