Matplotlib 3D 绘图使用颜色映射表

8

我试图使用ax.scatter绘制一个三维散点图。我已经从fits文件中读取了数据,并将三列数据存储到x、y、z中。我确保了x、y、z数据的大小相同,并将z归一化在0和1之间。

import numpy as np
import matplotlib
from matplotlib import pylab,mlab,pyplot,cm
plt = pyplot
import pyfits as pf
from mpl_toolkits.mplot3d import Axes3D
import fitsio

data = fitsio.read("xxx.fits")

x=data["x"]
y=data["y"]
z=data["z"]
z = (z-np.nanmin(z)) /(np.nanmax(z) - np.nanmin(z))

Cen3D = plt.figure()
ax = Cen3D.add_subplot(111, projection='3d')

cmap=cm.ScalarMappable(norm=z, cmap=plt.get_cmap('hot'))
ax.scatter(x,y,z,zdir=u'z',cmap=cmap)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

我想要实现的是使用颜色来表示z的大小。比如,z值越高,颜色越深。但是我画出的图中没有显示我想要的颜色映射,它们都是默认的蓝色。我做错了什么?谢谢。
2个回答

10

您可以在scatter命令中使用c关键字,告诉它如何为点着色。

您不需要设置zdir,因为这只是用于绘制2D图形时的设置

正如@Lenford所指出的那样,您也可以在此情况下使用cmap='hot',因为您已经对数据进行了归一化处理。

我已经修改了您的示例以使用一些随机数据而不是您的拟合文件。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)

z = (z-np.nanmin(z)) /(np.nanmax(z) - np.nanmin(z))

Cen3D = plt.figure()
ax = Cen3D.add_subplot(111, projection='3d')

ax.scatter(x,y,z,cmap='hot',c=z)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

输入图像描述


1
@frankgut 由于这个答案对您有帮助,请接受答案,以便问题被标记为已解决。 - J Richard Snape
1
请注意 - 如果您希望更高的值按Q的要求具有更深的颜色,请使用c=-z - J Richard Snape
@tom,你能否请就这个问题发表一下评论:https://dev59.com/VlwY5IYBdhLWcg3wno4r#32422750 - diffracteD

3
根据 pyplot.scatter 文档,指定要绘制的点必须是浮点数数组才能应用 cmap,否则将继续应用默认颜色(在本例中为 jet)。
另外,简单地声明将适用于此代码,因为颜色映射热图是 matplotlib 中注册的颜色映射。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接