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

У меня есть набор данных, созданный таким образом:

 aa = linspace(A - 5, A + 5, n_points)
 bb = linspace(B - 1.5, B + 1.5, n_points)
 z = []
 for a in aa:
     for b in bb:
         z.append(cost([a, b]))

Я хотел бы и карту головы, где z определяют цвет в точке (a, b) . Мне это нужно для анализа локального минимума.

Я использую matplotlib, но я точно не знаю, как действовать дальше.


person Donbeo    schedule 28.03.2014    source источник
comment
Вы пробовали искать в Google или SO? matplotlib.org/examples/pylab_examples/hist2d_log_demo.html и stackoverflow.com/questions/14391959/ и stackoverflow.com/ вопросы/2369492/ например   -  person Cory Kramer    schedule 28.03.2014


Ответы (2)


Обычно для этого используется imshow или pcolormesh.

Например:

import numpy as np
import matplotlib.pyplot as plt

n_points = 10
aa = np.linspace(-5, 5, n_points)
bb = np.linspace(-1.5, 1.5, n_points)

def cost(a, b):
    return a + b

z = []
for a in aa:
    for b in bb:
        z.append(cost(a, b))

z = np.reshape(z, [len(aa), len(bb)])

fig, ax = plt.subplots()
im = ax.pcolormesh(aa, bb, z)
fig.colorbar(im)

ax.axis('tight')
plt.show()

введите здесь описание изображения

Однако было бы лучше написать код примера так:

import numpy as np
import matplotlib.pyplot as plt

n_points = 10
a = np.linspace(-5, 5, n_points)
b = np.linspace(-1.5, 1.5, n_points)
a, b = np.meshgrid(b, a)

z = a + b # Vectorize your cost function

fig, ax = plt.subplots()
im = ax.pcolormesh(a, b, z)
fig.colorbar(im)

ax.axis('tight')
plt.show()

Или, еще более компактно:

import numpy as np
import matplotlib.pyplot as plt

npoints = 10
b, a = np.mgrid[-5:5:npoints*1j, -1.5:1.5:npoints*1j]

z = a + b

fig, ax = plt.subplots()
im = ax.pcolormesh(a, b, z)
fig.colorbar(im)

ax.axis('tight')
plt.show()
person Joe Kington    schedule 28.03.2014
comment
@ Джео, у меня есть сомнения. Если я не знаю координаты a и b, которые я должен получить из самого файла данных, как в этом случае мы можем их указать? Предположим, мне нужно установить данные с GPS-координатами распределенного города. - person ; 17.03.2015
comment
Зачем нужен ax.axis('tight')? Спасибо :) - person tommy.carstensen; 15.12.2015
comment
@tommy.carstensen — по умолчанию matplotlib выберет четные числа для пределов осей. (Примечание: в версии 2.0 это изменится на отступы в стиле margins.) ax.axis('tight') указывает, что пределы осей должны точно соответствовать ограничениям данных. В этом случае мы не хотим отображать регионы, по которым у нас нет данных, поэтому мы используем ax.axis('tight'). - person Joe Kington; 15.12.2015

Я только что сделал что-то подобное и использовал точечный график.

plt.scatter(x_vals, y_vals, s = 100,  c = z_vals, cmap = 'rainbow')
c = plt.colorbar()
person mauve    schedule 28.03.2014