2013-04-28 48 views
0

Python和MatPlot3D新手。我有一個情節,我希望根據某些屬性顯示使用不同形狀和顏色的座標。數據看起來像這樣。如何使用matplot3d更改3d點的形狀/顏色

col1 col2 col3 col4 col5 
276 147 -6 K dia 
274 145 -8 A cir 
270 141 -12 B dia 
267 138 -15 K cir 
266 137 -16 K cir 
261 132 -21 B bu 
251 122 -31 C cir 

現在我想改變基於col4和基於col5形狀的顏色的形狀。現在我有這個代碼從文件中讀取數據點,只繪製點。

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

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

data = np.genfromtxt('distances.txt') 

x = data[:,0] 
y = data[:,1] 
z = data[:,3] 

ax.scatter(x, y, z,c='red',marker='^') 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

如何根據col4和col5的值輕鬆指定形狀和顏色?

回答

1

您需要做的第一件事是以不會將這些列轉換爲'nan'的方式導入您的數據,然後您需要將列值轉換爲mpl可以理解的值。

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 
import csv 

color_map = {'A':'r', 'B':'b', 'K':'k', 'C':'c'} 
shape_map = {'dia':'^', 'cir':'o', 'bu':'.'} 

with open('/tmp/dist.txt','r') as in_file: 
    reader = csv.DictReader(in_file, delimiter=' ', skipinitialspace=True) 
    data = [] 
    for r in reader: 
     data.append([float(r['col1']), 
        float(r['col2']), 
        float(r['col3']), 
        color_map[r['col4']], 
        shape_map[r['col5']]]) 

要得到的顏色很容易,scatter將採取的顏色可迭代的每個標記着色:

X, Y, Z, col, shape = zip(*data) 


fig = plt.figure() 
ax = fig.add_subplot(111,projection='3d') 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 


ax.scatter(X, Y, Z, c=col) 

獲得的形狀是有點棘手,因爲scatter只需要爲所有的一個點,所以如果你想使用多個scatter來電:

import collections 

by_shape = collections.defaultdict(list) 
for d in data: 
    by_shape[d[4]].append(d[:4]) 

for key, val in by_shape.items(): 
    X, Y, Z, col = zip(*val) 
    ax.scatter(X, Y, Z, c=col, marker=key) 
+0

非常感謝您的答案和解釋! – eastafri 2013-04-28 19:29:41