Круговая интерполированная тепловая карта с использованием питона

У меня есть данные, которые представляют значения во внутренних точках внутри круга. Я хотел бы создать тепловую карту, аналогичную http://matplotlib.org/examples/pylab_examples/image_interp.html. Кто-нибудь знаком с методом для этого с кругом?

1 ответ

Решение

Вы можете сделать это, используя полярную проекцию на вашей оси. Обратите внимание, что это не будет работать с imshow, как в приведенном вами примере. (См.: http://en.it-usenet.org/thread/15998/715/) Однако вы все равно можете выполнить интерполяцию и затем построить тепловую карту. Ниже приведен простой пример:

from pylab import *
import numpy as np
from scipy.interpolate import griddata

#create 5000 Random points distributed within the circle radius 100
max_r = 100
max_theta = 2.0 * np.pi
number_points = 5000
points = np.random.rand(number_points,2)*[max_r,max_theta]

#Some function to generate values for these points, 
#this could be values = np.random.rand(number_points)
values = points[:,0] * np.sin(points[:,1])* np.cos(points[:,1])

#now we create a grid of values, interpolated from our random sample above
theta = np.linspace(0.0, max_theta, 100)
r = np.linspace(0, max_r, 200)
grid_r, grid_theta = np.meshgrid(r, theta)
data = griddata(points, values, (grid_r, grid_theta), method='cubic',fill_value=0)

#Create a polar projection
ax1 = plt.subplot(projection="polar")
ax1.pcolormesh(theta,r,data.T)
plt.show()

Обратите внимание, что я использовал fill_value 0, поэтому любые значения в сетке, которые выходят за пределы выпуклой формы случайных данных, будут иметь значение 0.

Interpolated Polar HeatmapЕсли вы хотите сделать то же самое, вам нужно преобразовать ваши данные в полярные координаты, прежде чем делать то же самое (при условии, что ваши показания в декартовых координатах). Для этого вы можете использовать:

def convert_to_polar(x, y):
    theta = np.arctan2(y, x)
    r = np.sqrt(x**2 + y**2)
    return theta, r 

Вам также могут быть полезны ответы на эти вопросы: информация об изображении в полярной системе координат Добавление цветовой шкалы в pcolormesh с полярной проекцией

Первый из них, в частности, имеет действительно подробный ответ.

Я ценю, что это старый вопрос, но, поскольку я воспользовался ответом Weir_Doe и разработал его немного по-другому, я решил внести свой метод в надежде, что он поможет кому-то еще.

Я пытался сделать что-то подобное, и систематически собирал результаты для r и theta, так что я получил сетку. Как только у вас есть сетка, вы можете использовать масштабирование, чтобы получить изображение более высокой четкости.

from pylab import *
import numpy as np
from scipy.ndimage import zoom
import pandas as pd

max_r = 100
max_theta = 2.5 * np.pi
number_points = 5

#Generate a grid 100 x 100 r x theta
r = np.arange(0, max_r,max_theta/number_points)
theta = np.arange(0,max_theta,max_theta/number_points)
grid_r, grid_theta = np.meshgrid(r, theta)

#Generate random numbers for each grid point
values = (np.sin(grid_r)+np.cos(grid_theta)).flatten()


#I always find it easier to put it in a dataframe
df = pd.DataFrame(grid_r.flatten()).rename(columns={0:'r'})
df['theta'] = grid_theta.flatten()
df['values'] = values
df = df.pivot(index='theta', columns='r')
#printing the dataframe at this point is very helpful conceptually

#Create a polar projection
ax1 = plt.subplot(projection="polar")
ax1.pcolormesh(df.index,r,df.values.T)
plt.show()

#Zoom in to the grid, this interpolates the results onto a finer grid
#Here I chose a 10x finer grid, this is more efficient than to interpolate onto specified points
zoom_factor=10

zoomed_df = zoom(df, zoom_factor)
zoomed_index = zoom(theta, zoom_factor)
zoomed_columns = zoom(r, zoom_factor)
high_def_grid = pd.DataFrame(zoomed_df, index=zoomed_index, columns=zoomed_columns)


#Create a polar projection
ax1 = plt.subplot(projection="polar")
ax1.pcolormesh(high_def_grid.index,high_def_grid.columns,high_def_grid.values.T)
plt.show()

Это приводит к 2 изображениям, предварительно интерполированное изображение:

Неполяризованный полярный график

И пост-интерполяционный сюжет:

Интерполированный полярный график

Как я уже сказал, это работает только в том случае, если данные собираются систематически, но в научных целях это будет иметь место.

Кроме того, использование pandas dataframe не является необходимым шагом, но я считаю, что концептуально намного проще, если делать это таким образом.

Надеюсь это поможет.

Другие вопросы по тегам