2016-02-02 7 views
0

У меня есть нерегулярно разнесенные данные точек сетки в виде [[xi1, yi1, zi1], [xi2, yi2, zi2], ....]. Они образуют часть сферыPython: изогнутый поверхностный график с цветами плотности

У меня также есть данные [[x1, y1, z1, n1], [x2, y2, z2, n2] ....] где (x1, y1, z1) и т. Д. координата середины каждой ячейки сетки и ni - плотности в соответствующих местах. 3d график рассеяния с квадратными маркерами внешний вид данных, как это (где цвета показывают значение п) enter image description here

его вид сбоку, показывающий кривизну enter image description here

Я пытаюсь сделать это в гладкую поверхность участка , Я рассмотрел этот пример matplotlib color, но здесь точки сетки равномерно распределены, в то время как в моем случае они не являются, также как можно представить плотности, используя цвет в такой нерегулярной сетке. Я открыт для тестирования других пакетов, кроме matplotlib.

Благодаря

ответ

1

Одним из способов является вручную создать и построить коллекцию треугольников:

(Edit: вручную создание и красящие треугольников вокруг бен середин)

import numpy 

import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.tri import Triangulation 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 
import matplotlib.cm as cm 

# Generate a dataset 

R = 1 

# bin midpoints 
theta = numpy.linspace(numpy.pi/6, numpy.pi/3, 20) + numpy.pi/2 
phi = numpy.linspace(numpy.pi/6, numpy.pi/3, 20) 

ttheta, pphi = numpy.meshgrid(theta, phi) 
x = R * numpy.sin(ttheta) * numpy.cos(pphi) 
y = R * numpy.sin(ttheta) * numpy.sin(pphi) 
z = R * numpy.cos(ttheta) 

n = numpy.exp(-(ttheta - numpy.pi/4 - numpy.pi/2)**2 * 20 - (pphi - numpy.pi/4)**2 * 20) 

mappable = cm.ScalarMappable(cmap=cm.coolwarm, norm=matplotlib.colors.Normalize(vmin=0, vmax=1)) 
colors = mappable.to_rgba(n) 

# Scatter plot 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
ax.scatter(x.flatten(), y.flatten(), z.flatten(), c=colors.reshape(x.size, 4)) 
ax.set_xlim(0.2, 0.8) 
ax.set_ylim(0.2, 0.8) 
ax.set_zlim(-0.9, -0.45) 
ax.elev = 50 
fig.savefig('t.png') 

# Surface plot 

# bin vertex spherical coordinates 
dtheta = theta[1] - theta[0] 
dphi = phi[1] - phi[0] 
v_theta = numpy.concatenate([theta - dtheta/2, numpy.array([theta[-1] + dtheta/2])]) 
v_phi = numpy.concatenate([phi - dphi/2, numpy.array([phi[-1] + dphi/2])]) 

# bin vertex Cartesian coordinates 
v_ttheta, v_pphi = numpy.meshgrid(v_theta, v_phi) 
vx = R * numpy.sin(v_ttheta) * numpy.cos(v_pphi) 
vy = R * numpy.sin(v_ttheta) * numpy.sin(v_pphi) 
vz = R * numpy.cos(v_ttheta) 

# Creating triangles and corresponding face colors 

triangles = [] 
facecolors = [] 

for i in range(v_theta.size - 1): 
    for j in range(v_phi.size - 1): 
     triangles.extend([ 
      [(i, j), (i + 1, j), (i, j + 1)], 
      [(i + 1, j), (i + 1, j + 1), (i, j + 1)]]) 
     facecolors.extend([ 
      colors[i, j], 
      colors[i, j] 
      ]) 

triangle_vertices = numpy.array(
    [[[vx[i,j], vy[i,j], vz[i,j]] for i, j in t] for t in triangles]) 
coll = Poly3DCollection(triangle_vertices, facecolors=facecolors, edgecolors=(0,0,0,0)) 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
ax.add_collection(coll) 
ax.set_xlim(0.2, 0.8) 
ax.set_ylim(0.2, 0.8) 
ax.set_zlim(-0.9, -0.45) 
ax.elev = 50 
fig.savefig('t2.png') 

Разброс участок :

enter image description here

Поверхность участка:

enter image description here

+0

Спасибо! Не могли бы вы объяснить немного больше о том, что вы имели в виду под (a) явно передавая индексы треугольника, вы имели в виду вершины бункеров в моих данных? (b) присваивать значения бинов соответствующим треугольникам, каждый бит - немного изогнутый «четырехугольник». – HuShu

+0

Извините, я немного торопился и подумал, что объясню только метод. Изменен код для создания и цвета треугольников. – fjarri