Python Matplotlib“;“灰色”;彩色地图不';t跨度全黑至白范围

Python Matplotlib“;“灰色”;彩色地图不';t跨度全黑至白范围,python,matplotlib,colors,grayscale,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.

以下代码生成一个圆形图案:

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")
将numpy导入为np
将matplotlib.pyplot作为mp导入
def球体深度(x、y、深度、半径):
squ=x**2+y**2
rsqu=半径**2
squ[squ>rsqu]=rsqu
res=np.sqrt(rsqu-squ)
res-=(半径-深度)
res[res<0.]=0。
返回res
y_pix=x_pix=100。
c_步数=10
x、 y=np.mgrid[0:x\u pix:1,0:y\u pix:1]
z=球体深度(x-x\u pix/2,y-y\u pix/2,5,100.)
lvls=np.linspace(z.min(),z.max(),c_步数)
议员致辞全文(1)
图=mp.图(1)
mp.轴([0,0,1,1],frameon=False)
mp.contourf(x,y,z,cmap=mp.cm.gray,levels=lvls)
mp.轴(“关闭”)
mp.savefig(“test.png”)

颜色贴图设置为“灰色”,我希望最小值对应黑色,最大值对应白色。虽然后者是正确的,但前者不适用于本例。最低值为深灰色。这可以在增加c_步数时进行调整,但我需要一个非常粗粒度的灰色贴图。感谢您提供如何以黑色开始,以白色结束的想法。

contourf
在这种情况下的行为与
imshow
pcolormesh
稍有不同。这是为了与
等高线
保持一致,并考虑到标高的定义方式

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

要指定希望第一个间隔填充“纯”黑色,请在示例中设置
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()
将numpy导入为np
将matplotlib.pyplot作为plt导入
def球体深度(x、y、深度、半径):
squ=x**2+y**2
rsqu=半径**2
squ[squ>rsqu]=rsqu
res=np.sqrt(rsqu-squ)
res-=(半径-深度)
res[res<0.]=0。
返回res
y_pix=x_pix=100。
c_步数=10
x、 y=np.mgrid[0:x\u pix:1,0:y\u pix:1]
z=球体深度(x-x\u pix/2,y-y\u pix/2,5,100.)
lvls=np.linspace(z.min(),z.max(),c_步数)
图=plt.图()
ax=图添加轴([0,0,1,1],frameon=False)
最大轮廓f(x,y,z,levels=lvls,cmap=plt.cm.gray,
vmin=np.平均值(lvls[:2]),vmax=np.平均值(lvls[-2:]))
ax.轴(“关闭”)
plt.show()

为了便于比较,以下是原始示例中的图像:


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

lvls
更改为100左右。你只有10级。所以彩色地图只会显示这10个级别。正如我在问题中解释的那样,这是故意的。嗨,乔,非常感谢。然而,用你的代码我无法复制你发布的图像。事实上,当将图像与
vmin=np.mean(lvls[:1])、vmax=np.mean(lvls[-2:])
进行比较时,如果没有这一行,则没有这一行的图像的背景会稍微暗一些。@Clemens-很抱歉,我更改了一些内容,没有重新运行代码,并且出现了一个打字错误
lvls[:1]
是一种打字错误。它应该是
vmin=np.mean(lvls[:2])