matplotlib中的轮廓不绘制指定的轮廓数

时间:2017-06-21 07:34:54

标签: python matplotlib plot colormap

我在循环中生成一些数据,并喜欢将它们绘制成等高线图。每个图应使用相同的色图和指定数量的轮廓级。此外,第一级颜色应为白色。

以下代码段生成的数字类似于我目前面临的问题:

import numpy as np
import matplotlib.pyplot as plt

x = y = np.linspace(-3, 3, 200)
data = 1800*np.exp(-(x[newaxis, :].T**2 + y**2))

plt.figure(1000)
plt.clf()

plt.contourf(x, y, data, 8, cmap=plt.cm.OrRd)
plt.axes().set_aspect("equal")
plt.colorbar()
plt.contour(x, y, data, 8, colors='k')

enter image description here

我注意到有9个而不是8个轮廓级别似乎取决于数据的最小值/最大值。因此,由于数据的变化,我在循环中生成的图中轮廓水平的数量不相同。我可以使用哪个色彩图,以便第一级是白色的?我知道那里有很多关于色彩图的问题。但他们倾向于手工生成色彩图。我只是想使用这个现有的,并添加白色作为第一颜色或以某种方式修改我的脚本,以便它以白色开始(我认为它无论如何)。

1 个答案:

答案 0 :(得分:1)

轮廓(f)中的levels参数指定级别数。即对于等高线图,这是您获得的线数,对于contourf图,这比不同颜色区域的数量少一个。例如,如果您采用单个级别,则会获得一行和两个彩色区域。

enter image description here

要将白色作为第一种颜色,您需要选择实际上具有白色作为第一种颜色的色彩图(请注意OrRd中没有白色)。查看colormap reference,这样的地图会例如是颠倒的afmhot。当然,您也可以构建自定义地图,其中白色为第一颜色。 选择来自色图的相应范围的颜色,使得它从级别之间的间隔的中间获取颜色。即使对于第一级,这也将导致非白色。为了克服这个问题,可以选择从给定的色彩映射生成具有N+1颜色的色彩映射,使得颜色在该间隔上是恒定的,并且平均值仍然与起始颜色相同。

levels = 8
cmap= plt.cm.get_cmap("afmhot_r", levels+1)
plt.contourf(x, y, data, levels, cmap=cmap)

产生

enter image description here