Matplotlib"灰" colormap不会跨越全黑到白色范围

时间:2014-11-23 12:58:30

标签: python matplotlib colors grayscale

以下代码生成圆形图案:

import numpy as np
import matplotlib.pyplot as mp

def sphere_depth(x, y, depth, radius):
  squ = x**2 + y**2
  rsqu = radius**2
  squ[squ > rsqu] = rsqu
  res = np.sqrt(rsqu - squ)
  res -= (radius - depth)
  res[res < 0.] = 0.
  return res

y_pix = x_pix = 100.

c_steps = 10

x, y = np.mgrid[0:x_pix:1, 0:y_pix:1]
z = sphere_depth(x - x_pix / 2, y - y_pix / 2, 5., 100.)
lvls = np.linspace(z.min(), z.max(), c_steps)

mp.close(1)
fig = mp.figure(1)
mp.axes([0, 0, 1, 1], frameon=False)
mp.contourf(x, y, z, cmap=mp.cm.gray, levels=lvls)
mp.axis('off')
mp.savefig("test.png")

色彩图设置为“灰色”,我希望最小值对应黑色,最大值对应白色。虽然后者属实,但前者并不适用于这个例子。最低值是深灰色。这可以在增加c_steps时调整,但我需要一个非常粗糙的灰色颜色贴图。感谢任何想法如何从黑色开始,以白色结束。

1 个答案:

答案 0 :(得分:1)

在这种情况下,

contourf的行为与imshowpcolormesh略有不同。它有意与contour保持一致,并且由于定义了级别的方式。

每个等级范围的颜色由该范围的中点定义。 (另外,你的中心轮廓实际上并不是完全白色,但它在视觉上与它完全相同。)

要指定您希望第一个区间填充“纯”黑色,请在示例中设置vmin=mean(lvls[:1])

举个例子,根据你问题中的优秀例子:

import numpy as np
import matplotlib.pyplot as plt

def sphere_depth(x, y, depth, radius):
  squ = x**2 + y**2
  rsqu = radius**2
  squ[squ > rsqu] = rsqu
  res = np.sqrt(rsqu - squ)
  res -= (radius - depth)
  res[res < 0.] = 0.
  return res

y_pix = x_pix = 100.

c_steps = 10

x, y = np.mgrid[0:x_pix:1, 0:y_pix:1]
z = sphere_depth(x - x_pix / 2, y - y_pix / 2, 5., 100.)
lvls = np.linspace(z.min(), z.max(), c_steps)

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.contourf(x, y, z, levels=lvls, cmap=plt.cm.gray, 
            vmin=np.mean(lvls[:2]), vmax=np.mean(lvls[-2:]))
ax.axis('off')

plt.show()

enter image description here

仅作比较,这是原始示例中的图像:

enter image description here

它很微妙,但第一个在边缘有“纯”黑色,第二个没有。