以下代码生成圆形图案:
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
时调整,但我需要一个非常粗糙的灰色颜色贴图。感谢任何想法如何从黑色开始,以白色结束。
答案 0 :(得分:1)
contourf
的行为与imshow
或pcolormesh
略有不同。它有意与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()
仅作比较,这是原始示例中的图像:
它很微妙,但第一个在边缘有“纯”黑色,第二个没有。