Контуры плотности чисел в Python - PullRequest
5 голосов
/ 15 июля 2011

Я пытаюсь воспроизвести этот график на python без особой удачи:

enter image description here

Это простой контур плотности чисел, который в настоящее время выполняется в SuperMongo.Я хотел бы отказаться от него в пользу Python, но самое близкое, что я могу получить:

enter image description here

, что с помощью hexbin ().Как я могу добиться того, чтобы сюжет питона напоминал сюжет SuperMongo?У меня недостаточно репутации для публикации изображений, извините за ссылки.Спасибо за ваше время!

Ответы [ 4 ]

3 голосов
/ 12 апреля 2016

Пример простого контурного графика от товарища SuperMongo => Python страдалец:

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

plt.interactive(True)
fig=plt.figure(1)
plt.clf()

# generate input data; you already have that
x1 = np.random.normal(0,10,100000)
y1 = np.random.normal(0,7,100000)/10.
x2 = np.random.normal(-15,7,100000)
y2 = np.random.normal(-10,10,100000)/10.
x=np.concatenate([x1,x2])
y=np.concatenate([y1,y2])

# calculate the 2D density of the data given
counts,xbins,ybins=np.histogram2d(x,y,bins=100,normed=LogNorm())
# make the contour plot
plt.contour(counts.transpose(),extent=[xbins.min(),xbins.max(),
    ybins.min(),ybins.max()],linewidths=3,colors='black',
    linestyles='solid')
plt.show()

производит хороший контурный сюжет.

Функция контура предлагает множество необычных настроек, например, давайте установим уровни вручную:

plt.clf()
mylevels=[1.e-4, 1.e-3, 1.e-2]
plt.contour(counts.transpose(),mylevels,extent=[xbins.min(),xbins.max(),
    ybins.min(),ybins.max()],linewidths=3,colors='black',
    linestyles='solid')
plt.show()

производит этот участок: contour plot with adjusted levels

И, наконец, в SM можно создавать контурные графики в линейном и логарифмическом масштабах, поэтому я потратил немного времени, пытаясь понять, как это сделать в matplotlib. Вот пример, когда точки y необходимо построить в логарифмическом масштабе, а точки x по-прежнему в линейном масштабе:

plt.clf()
# this is our new data which ought to be plotted on the log scale
ynew=10**y
# but the binning needs to be done in linear space
counts,xbins,ybins=np.histogram2d(x,y,bins=100,normed=LogNorm())
mylevels=[1.e-4,1.e-3,1.e-2]
# and the plotting needs to be done in the data (i.e., exponential) space
plt.contour(xbins[:-1],10**ybins[:-1],counts.transpose(),mylevels,
    extent=[xbins.min(),xbins.max(),ybins.min(),ybins.max()],
    linewidths=3,colors='black',linestyles='solid')
plt.yscale('log')
plt.show()

Это дает график, который очень похож на линейный, но с хорошей вертикальной осью бревна, что и было задумано: contour plot with log axis

2 голосов
/ 15 июля 2011
0 голосов
/ 24 мая 2012

Вы можете использовать numpy.histogram2d, чтобы получить распределение плотности числа вашего массива. Попробуйте этот пример: http://micropore.wordpress.com/2011/10/01/2d-density-plot-or-2d-histogram/

0 голосов
/ 04 сентября 2011

К сожалению, я не смог просмотреть ваши изображения. Вы имеете в виду что-то вроде это ? Это было сделано MathGL - библиотекой графиков GPL, которая также имеет интерфейс Python. И вы можете использовать произвольные массивы данных в качестве входных данных (в том числе Numpy's).

...