#python #matplotlib
#python #matplotlib
Вопрос:
Мне нужно составить график интенсивности.
У меня есть три списка значений 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.
Комментарии:
1. Довольно очевидно, почему значения интерполируются, нет? f = interp2d(…, Z = f(…, plt.imshow(Z…
2. @tommy.carstensen да, но я не хочу интерполяции. Если это означает использование чего-то другого, а не plt.imshow, это нормально, но я не хочу интерполяции
3. Возможно, вы можете это сделать
Z = np.reshape(z_list, (max(x_list),max(y_list)))
. Пожалуйста, дайте мне знать, если это сработает. Спасибо.4. @tommy.carstensen спасибо, к сожалению, это не работает. В нем говорится, что ValueError: общий размер нового массива должен быть неизменным
Ответ №1:
Насколько я понимаю, вы хотите отобразить точки 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()
Комментарии:
1. Спасибо! Это работает, и это то, что я хочу. Теперь мне просто нужно выяснить, как использовать какую-то шкалу логарифмов для facecolors= z_list. Это связано с тем, что все мои 200 значений в z_list очень близки друг к другу, поэтому, если вы просто примените свой рецепт к моему случаю, вы не увидите большой разницы в интенсивности