python matplotlib colormap与vmax/vmin的关系

python matplotlib the relationship between colormap and vmax/vmin

我是 python matplotlib 的新手,我正在 cmpvmaxvmin

上尝试不同的设置

根据我的理解,如果结果高于 vmax,结果显示颜色图的结尾(深色),结果低于 vmin,结果显示颜色图的原始(光)像pic1

但是当我在结果中设置vmaxvmin时,颜色如何响应结果?为什么会这样显示?

例如,当我将 vmin 设置在范围之外时,结果显示蓝色,但我的 cmp 中没有蓝色,请参见图 2

vmax 超出范围时,结果显示浅色,根据我的理解,颜色应该与 cmp=plt.cm.Greens 相同,参见图 3

我上传图片。 这是我的代码:

#!/usr/bin/python
import matplotlib.pyplot as plt


num=range(1,100)
out=[x**2 for x in num]
plt.figure(figsize=(11, 11))


plt.title('Scatter',size=24)
plt.ylabel('Result',size=24)
plt.xlabel('Number',size=24)
plt.axis([0, 110, 0, 11000])

plt.scatter(num,out,s=50,lw=2,c=out,cmap=plt.cm.Greens,marker='o',label='Scatter',vmin=99999)
plt.show()

查看正在发生的情况的最佳方法是添加颜色条(plt.colorbar(),在创建散点图之后)。您会注意到 0 到 10000 之间的 out 值都低于条形的最低部分,那里是非常浅的绿色。

一般来说,低于 vmin 的值将使用最低颜色,高于 vmax 的值将使用最高颜色。

如果您设置 vmax 小于 vmin,它们将在内部交换。虽然,根据 matplotlib 的确切版本和调用的精确函数,matplotlib 可能会给出错误警告。因此,最好将 vmin 设置为始终低于 vmax

如果不设置vmin,会自动计算为数据的最小值。同样,如果不设置vmax,则会设置为数据的最大值。所以,如果你设置 vmin=99999 而没有设置 vmaxvmax 将被计算为 10000。就像现在 vmax < vmin,matplotlib 将交换它们,所以你结束vmin=10000 andvmax=99999`,如颜色条所示。

如果您不设置颜色图 (cmap=),matplotlib 将自动使用 'viridis'。此颜色图在 vmin.

附近有深 purple/blue 颜色

如果不设置c=参数,颜色取自default property cycle。所以,第一次它被称为蓝色,下一次是橙色,然后是绿色,然后是红色,......。有 10 种颜色,之后颜色再次从蓝色开始。 (在当前版本的 matplotlib 中,颜色图称为 'tab10'。)请注意,如果您未设置 c=.

,则 vminvmax 将被忽略

在下面的代码中,我添加了一条红线,其中 out 值属于颜色栏。您可以对 vmin 和 vmax 的不同值进行试验,看看会发生什么。通常,最简单的就是不填,让 matplotlib 自动计算。

import matplotlib.pyplot as plt

num = range(1, 100)
out = [x ** 2 for x in num]
plt.figure(figsize=(11, 11))

plt.title('Scatter', size=24)
plt.ylabel('Result', size=24)
plt.xlabel('Number', size=24)
plt.axis([0, 110, 0, 11000])

plt.scatter(num, out, s=50, lw=2, c=out, cmap=plt.cm.Greens, marker='o', label='Scatter', vmin=99999)
# plt.colorbar()
cbar = plt.colorbar()
cbar.ax.vlines(1, min(out), max(out), color='crimson', lw=3, clip_on=False)
plt.show()

下图中描述了三种情况:

#left plot ('c=' set to 'out', 'cmap=' set to 'Greens')
plt.scatter(num, out, s=50, lw=2, c=out, cmap=plt.cm.Greens, marker='o', vmin=99999)
#central plot ('c=' not set, 'cmap=' not set)
plt.scatter(num, out, s=50, lw=2, marker='o', vmin=99999)
#right plot ('c=' set to 'out', 'cmap=' not set)
plt.scatter(num, out, s=50, lw=2, c=out, marker='o', vmin=99999)