首页 > 解决方案 > python matplotlib colormap与vmax/vmin的关系

问题描述

我是 python matplotlib 的新手,我正在尝试不同的设置cmpvmaxvmin

据我了解,如果结果高于vmax,则结果显示颜色图(暗)的结尾,结果低于vmin结果显示颜色图(浅)的原始值,如 pic1 图1

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

例如当我设置超出范围并且结果显示蓝色但我看到 pic2 vmin中没有蓝色cmp图2

vmax超出范围时,结果显示浅色,据我了解,颜色应与cmp=plt.cm.Greens图 3 相同 图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()

标签: pythonmatplotlibscatter-plot

解决方案


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

通常,低于值的值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

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

在下面的代码中,我添加了一条红线,其中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)

比较图


推荐阅读