带颜色渐变的3D散点图

23 投票
2 回答
66521 浏览
提问于 2025-04-17 10:25

我想知道怎么制作一个3D图,并且让图上的点有颜色渐变。下面这个例子是针对2D散点图的。

补充说明(感谢Chris):我希望在3D图中看到的点的颜色渐变是从红色到绿色,和2D散点图一样。但是在3D散点图中,我看到的只有红色的点。

解决方案:由于某些原因(和我从别处复制的渐变示例有关),我把x范围设置成了len-1,这导致3D图的显示出现了问题。

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

# Create Map
cm = plt.get_cmap("RdYlGn")

x = np.random.rand(30)
y = np.random.rand(30)
z = np.random.rand(30)
#col = [cm(float(i)/(29)) for i in xrange(29)] # BAD!!!
col = [cm(float(i)/(30)) for i in xrange(30)]

# 2D Plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y, s=10, c=col, marker='o')  

# 3D Plot
fig = plt.figure()
ax3D = fig.add_subplot(111, projection='3d')
ax3D.scatter(x, y, z, s=10, c=col, marker='o')  

plt.show()

2 个回答

5

这个可以正常工作:我搞不懂为什么你的不行。你应该可以把颜色设置成一系列的RGBA浮点数,或者仅仅是一系列的浮点数。

# Create Map
cm = plt.get_cmap("RdYlGn")

x = np.random.rand(30)
y = np.random.rand(30)
z = np.random.rand(30)
col = np.arange(30)

# 2D Plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y, s=10, c=col, marker='o')  

# 3D Plot
fig = plt.figure()
ax3D = fig.add_subplot(111, projection='3d')
p3d = ax3D.scatter(x, y, z, s=30, c=col, marker='o')                                                                                

plt.show()

不过,在散点图的帮助文档里,我看到以下内容,这可能和你的问题有关。

    A :class:`matplotlib.colors.Colormap` instance or registered
    name. If *None*, defaults to rc ``image.cmap``. *cmap* is
    only used if *c* is an array of floats.
29

这里有一个关于3D散点图的例子,使用了渐变色:

import matplotlib.cm as cmx
from mpl_toolkits.mplot3d import Axes3D
def scatter3d(x,y,z, cs, colorsMap='jet'):
    cm = plt.get_cmap(colorsMap)
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs))
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(x, y, z, c=scalarMap.to_rgba(cs))
    scalarMap.set_array(cs)
    fig.colorbar(scalarMap)
    plt.show()

当然,你可以选择不同的范围,比如从0到1之间的值。

撰写回答