带有颜色渐变的三维散点图

23

如何创建一个��有颜色渐变的三维散点图?请参考下面的示例,该示例适用于二维散点图。

编辑(感谢Chris):我期望从三维散点图中看到的是点的颜色渐变,范围从红色到绿色,就像二维散点图中一样。但在三维散点图中,我只看到了红色的点。

解决方案:由于某些原因(与我从其他地方复制的渐变示例有关),我将xrange设置为len-1,这会使三维图表中的所有内容都混乱。

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()

3D散点图出了什么问题?你期望从中看到什么,实际上又看到了什么?从你的代码来看,调用Axes3D.scatter似乎没问题。 - Chris
我期望从3D图中看到的是一个颜色渐变的点,范围从红色到绿色,就像2D散点图一样。但是在3D散点图中,我只看到了红色的点。 - andrea.ge
2个回答

29

这里是一个带有渐变颜色的三维散点图示例:

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。


3
ax.scatter(z, y, z, c=scalarMap.to_rgba(cs)) should be ax.scatter(x, y, z, c=scalarMap.to_rgba(cs)) - orange
6
@NoamPeled,“cs”是什么意思? - Haozhe Xie
这是每个三维点的值。如果colors_data是一个三维矩阵,为每个三维点提供一个值,则X是一个Nx3矩阵,包含x,y,z坐标的列表,因此cs=[colors_data[x,y,z] for x,y,z in zip(X [:,0],X [:,1],X [:,2]]) - Noam Peled
@NoamPeled 三维图形的绘制会改变轴线的相对比例,是否有办法防止这种情况发生?如果一个维度的值远大于其他维度,可能会显得不太自然。 - Alexander Cska

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()

然而,在scatter的帮助下,我看到了以下内容,可能与此相关。
    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.

2
通过在散点函数中添加“,cmap = cm”(ax3D.scatter(x,y,z,s = 30,c = col,marker ='o',cmap = cm)),我现在在三维散点图中也有了颜色渐变。 现在看来我错过的似乎是深度,但我猜我不能同时拥有两者。 - andrea.ge
你是什么意思,你没有深度? - Cenkoloji

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