2014-10-14 2 views
4

Я создал некоторые данные на Python, используя matplotlib.hist2d. Пример данных приведен ниже. dataПоверните вывод hist2d в контуры в matplotlib

Как вы можете видеть, эти данные содержат некоторые контуры, найденные путем отслеживания одного и того же цвета по всему участку. Я вижу, что распределение гаммы составляет около 0,015. Я хотел бы взять эти данные и собрать эти контуры, чтобы я мог видеть трассировку линии через каждый уровень цвета. Я попытался играть с контурной функцией, как здесь

counts, xedges, yedges, Image = hist2d(x, y, bins=bins, norm=LogNorm(), range=[[0, 1], [0, 400]]) 
contour(counts) 

но это, казалось, ничего не создавало.

Кто-нибудь знает лучший способ получить эти контуры? В идеале я хотел бы взять эти контуры и подобрать функцию (как функцию гаммы), а затем получить параметры функции.

Благодаря

ответ

8

Таким образом, проблема в том, что образ, созданный hist2d строится в координатах данных, но контуры, которые вы пытаетесь создать в пиксельных координатах. Простым способом этого является указание extent контуров (т. Е. Перемасштабирование/перемещение их по осям x и y).

Например:

from matplotlib.colors import LogNorm 
from matplotlib.pyplot import * 

x = np.random.normal(5,10,100000) 
y = np.random.normal(5,10,100000) 
counts,ybins,xbins,image = hist2d(x,y,bins=100,norm=LogNorm()) 
contour(counts,extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],linewidths=3) 

будет производить:

enter image description here

+1

Спасибо, это было именно то, что мне нужно было видеть. Единственная настройка, которую я должен был сделать, - это вместо вызова контура (counts, extent = [xbins.min(), xbins.max(), ybins.min(), ybins.max()], linewidths = 3), мне нужно было контур вызова (counts.transpose(), extent = [xbins.min(), xbins.max(), ybins.min(), ybins.max()], ширина линий = 3) – Jon

+0

@ebarr это приятно. Но если я получил трехмерный случайный набор данных (x, y, z), то как можно применить этот метод? – diffracteD

2

предпочел бы этот пост в качестве комментария, но не имеет репутации, так что ...

@ebarr имеет приятное решение с одной небольшой коррекцией: xbins и ybins, исходящие из графика 2d, должны быть отменены (см. Документацию matplotlib, https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist2d
)

Кроме того, лишь слегка раздражает, но контурные линии цвета не совпадают с цветами в 2d гистограммы, поскольку гистограмма colorscale превратило был журнал. Чтобы исправить это, вы можете вручную указать уровни для графика контура.

внесения этих изменений и разделение участков для урожайности ясности:

from matplotlib.colors import LogNorm 
import matplotlib.pyplot as plt 

x = np.random.normal(5,10,100000) 
y = np.random.normal(5,10,100000) 
plt.subplot(121) 
counts,xbins,ybins,image = plt.hist2d(x,y,bins=100 
             ,norm=LogNorm() 
             , cmap = plt.cm.rainbow) 
plt.colorbar() 
plt.subplot(122) 
plt.contour(counts.transpose(),extent=[xbins[0],xbins[-1],ybins[0],ybins[-1]], 
    linewidths=3, cmap = plt.cm.rainbow, levels = [1,5,10,25,50,70,80,100]) 

Это дает: Histogram and contour map

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