python - python matplotlib colormap与vmax/vmin的关系
问题描述
我是 python matplotlib 的新手,我正在尝试不同的设置cmp
和vmax
,vmin
据我了解,如果结果高于vmax
,则结果显示颜色图(暗)的结尾,结果低于vmin
结果显示颜色图(浅)的原始值,如 pic1
但是当我设置vmax
或vmin
输出结果时,颜色如何响应结果?为什么会这样显示?
例如当我设置超出范围并且结果显示蓝色但我看到 pic2
vmin
中没有蓝色cmp
当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()
在创建散点图之后)。您会注意到,out
介于 0 和 10000 之间的值都低于条形图的最低部分,那里的东西是非常浅的绿色。
通常,低于值的值vmin
将使用最低颜色着色,高于值的值vmax
将获得最高颜色。
如果您设置vmax
小于vmin
,则在内部它们将被交换。虽然,根据 matplotlib 的确切版本和调用的精确函数,matplotlib 可能会给出错误警告。因此,最好设置vmin
始终低于vmax
。
如果不设置vmin
,将自动计算为数据的最小值。同样,如果你不设置vmax
,它将被设置为数据的最大值。所以,如果你设置vmin=99999
和不设置vmax
,vmax
将被计算为 10000。现在vmax < vmin
,matplotlib 将交换它们,所以你以vmin=10000 and
vmax=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)
推荐阅读
- http - 我应该使用 http 还是 https 来跟踪链接?
- java - Servlet 在 session.getAttribute 的转换上抛出异常
- html - 为什么 CSS/HTML 中的颜色以 # 开头
- html - 第一个 div 坐在我的导航栏中?
- android - Android Studio 无法解决:com.android.support:support-core-ui:27.1.1
- python - Python中带或不带括号的函数?
- python - 使用 Seaborn 创建 for 循环以绘制 DataFrame 的各个列的直方图
- java - 无法访问请求映射spring boot
- java - 重复某件事直到成功,但最多 3 次
- arduino - 使用 Arduino、ATTiny85 和一个简单的蜂鸣器创建振荡音调