Матрица трехмерного рассеяния Matplotlib с градиентом цвета - PullRequest
15 голосов
/ 17 января 2012

Как я могу создать трехмерный график с цветным градиентом для точек?См. Пример ниже, который работает для двухмерного точечного графика.

Редактировать (спасибо Крису): я ожидаю увидеть на трехмерном графике цветовой градиент точек в диапазоне от красного до зеленого, какв 2D-графике рассеяния.На графике трехмерного рассеяния я вижу только красные точки.

Решение: по некоторым причинам (в связи с примером градиента, который я скопировал в другом месте), я установил для 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()

Ответы [ 2 ]

22 голосов
/ 28 ноября 2014

Вот пример для трехмерного рассеяния с градиентными цветами:

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.

1 голос
/ 17 января 2012

Следующие работы: я не могу понять, почему твоя нет. Вы должны иметь возможность устанавливать цвет как последовательность поплавков 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.
...