Matplotlib 3D 绘图使用颜色图
Matplotlib 3D plot use colormap
我正在尝试使用 ax.scatter 绘制 3D 散射图。我已经从适合的文件中读取数据并将三列中的数据存储到 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 值会得到更深的颜色。但是我不断得到一个没有我想要的颜色图的图,它们都是相同的默认蓝色。我做错了什么?谢谢
根据pyplot.scatter documentation,指定要绘制的点必须采用浮点数组的形式才能应用 cmap,否则将继续应用默认颜色(在本例中为 jet) .
顺便说一句,简单地说明 cmap='hot'
将适用于此代码,因为颜色图 hot
是 matplotlib 中的注册颜色图。
您可以在 scatter
命令中使用 c
关键字,告诉它如何给点着色。
您不需要设置 zdir
,因为 that is for when you are plotting a 2d set
正如@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()
我正在尝试使用 ax.scatter 绘制 3D 散射图。我已经从适合的文件中读取数据并将三列中的数据存储到 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 值会得到更深的颜色。但是我不断得到一个没有我想要的颜色图的图,它们都是相同的默认蓝色。我做错了什么?谢谢
根据pyplot.scatter documentation,指定要绘制的点必须采用浮点数组的形式才能应用 cmap,否则将继续应用默认颜色(在本例中为 jet) .
顺便说一句,简单地说明 cmap='hot'
将适用于此代码,因为颜色图 hot
是 matplotlib 中的注册颜色图。
您可以在 scatter
命令中使用 c
关键字,告诉它如何给点着色。
您不需要设置 zdir
,因为 that is for when you are plotting a 2d set
正如@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()