未正确绘制python中的图形

时间:2017-07-19 12:56:37

标签: python-2.7 matplotlib plot

我有一段代码,应该使用数组和pylab的imshow()函数在双变量数据上绘制高斯分布。我的代码如下:

from pylab import *
x = zeros((101,101))
mean_i = 50
mean_j = 50
sigma = 10
max_ = 100
for i in range(101):
    for j in range(101):
        x[i,j] = max_*exp(((-(i-mean_i)**2)-(j-mean_j)**2)/(2*(sigma**2)))
for i in range(101):
    plot(i,x[i,50], 'rx')
show()
imshow(x)
show()

其中x[i,j]的等式是ij的高斯的乘积。

如果您运行代码,您将看到生成了两个图表;一个是i/j数组的颜色图,它应该在中心有一个亮点并且像高斯那样衰减,另一个是j = 50的i值的图,所以应该是规则的高斯曲线。

这不是发生的事情。当我运行代码时,有一些步骤,就像我觉得它应该是数据不连续。为什么是这样?我的等式或我的绘图技术是一个问题吗?

1 个答案:

答案 0 :(得分:1)

你显然正在使用python 2并遇到integer division

的常见问题

最简单的方法是让sigma成为浮动,

sigma = 10.0

你也可以将分母投射到浮动

x[i,j] = max_*exp(((-(i-mean_i)**2)-(j-mean_j)**2)/float(2*(sigma**2)))

或者您可以在脚本开头导入python 3除法行为:

from __future__ import division

并保持其余部分相同。

我还建议调整你的代码以摆脱for循环。此外,导入pylab的所有内容均为not recommended

import numpy as np
import matplotlib.pyplot as plt

mean_i = 50
mean_j = 50
sigma = 10.
max_ = 100
X,Y = np.meshgrid(np.arange(101), np.arange(101))
x = max_*np.exp(((-(X-mean_i)**2)-(Y-mean_j)**2)/(2*(sigma**2)))

plt.plot(np.arange(101),x[:,50], 'rx')
plt.show()
plt.imshow(x)
plt.show()