2016-10-06 2 views
0

Мне нужно сделать участок интенсивности.Python - Карта интенсивности без интерполяции

У меня есть три списка значений x, y, z, импортированных из реальных данных: x_list, y_list, z_list. Каждый из этих списков содержит 200 значений. Поэтому для каждой пары x, y имеется соответствующее значение z.

Я попытался следующие, после некоторого поиска в Интернете и еще один вопрос на StackOverflow:

import numpy as np 
import pylab as plt 

data = np.loadtxt('data.d') 
x_list = data[:,0] 
y_list = data[:,1] 
z_list = data[:,2] 

from scipy.interpolate import interp2d 

f = interp2d(x_list,y_list,z_list,kind="linear") 

x_coords = np.arange(min(x_list),max(x_list)+1) 
y_coords = np.arange(min(y_list),max(y_list)+1) 
Z = f(x_coords,y_coords) 

fig = plt.imshow(Z, 
      extent=[min(x_list),max(x_list),min(y_list),max(y_list)], 
      origin="lower") 


fig.axes.set_autoscale_on(False) 
plt.scatter(x_list,y_list,400,facecolors='none') 

plt.show() 

При этом используется интерполяция, и я не уверен, что это именно то, что мне нужно. Есть ли способ построить только 200 значений z, соответствующих 200 x, y парам, для которых у меня есть заданное значение, с интерполяцией с помощью? Очевидно, мне все еще нужно какое-то «отношение интенсивности», я не могу просто иметь диаграмму рассеяния без способа интерпретации «интенсивности» значений 200 z.

+0

Это довольно очевидно, почему значения интерполируются, нет? f = interp2d (..., Z = f (..., plt.imshow (Z ... –

+0

@ tommy.carstensen да, но я не хочу интерполяции. Если это означает использование чего-то другого, а не plt.imshow , это нормально, но мне не нужна интерполяция. – johnhenry

+1

Вы можете сделать 'Z = np.reshape (z_list, (max (x_list), max (y_list))). Пожалуйста, дайте мне знать, если это сработает. –

ответ

2

Из чего я понимаю, вы хотите отобразить точки xyz в 2D-графике, где z-значение будет представлено цветом. Если это правильное решение так просто, как с указанием facecolors=z_list в вашем рассеивают участке:

data = np.random.rand(200,3) 
x_list = data[:,0] 
y_list = data[:,1] 
z_list = data[:,2] 

plt.scatter(x_list,y_list,200,facecolors=z_list) 

plt.colorbar() 
plt.show() 

Пример вывода: enter image description here

+0

Спасибо! Это работает, и это то, что я хочу. Теперь мне просто нужно выяснить, как использовать какой-то logarithm scale на facecolors = z_list. Это связано с тем, что мои 200 значений в z_list очень близки друг к другу, поэтому, если вы просто применяете свой рецепт к моему делу, вы не видите большой разницы в интенсивности – johnhenry

Смежные вопросы