我正在尝试在matplotlib图上绘制标准偏差,类似于http://en.wikipedia.org/wiki/File:Standard_deviation_diagram.svg
到目前为止,我已经画出了曲线:
mean = 0
variance = 1
rng = 4.
sigma = sqrt(variance)
x = np.linspace(-rng, rng, (rng * 10) * 2)
plt.plot(x, normpdf(x, mean, sigma))
plt.ylim(0, (rng / 10) + 0.05)
但是我很难将这个R函数重写为Python:
polysection <- function(a, b, col, n=11){
dx <- seq(a, b, length.out=n)
polygon(c(a, dx, b), c(0, dnorm(dx), 0), col=col, border=NA)
# draw a white vertical line on "inside" side to separate each section
segments(a, 0, a, dnorm(a), col="white")
}
# Build the four left and right portions of this bell curve
for(i in 0:3){
polysection( i, i+1, col=cols[i+1]) # Right side of 0
polysection(-i-1, -i, col=cols[i+1]) # Left right of 0
}
到目前为止,我已经知道了:
cols = np.array(["#2171B5", "#6BAED6", "#BDD7E7", "#EFF3FF"])
def polysection(a, b, col, n=11):
dx = np.linspace(a, b, n)
ax.add_patch(plt.Polygon(
np.hstack((np.array(a), dx, np.array(b))),
np.hstack((np.array(0), normpdf(dx, 0, 1), np.array(0)))))
plt.plot(
[a, 0],
[a, normpdf(a, 0, 1)],
color='blue')
for i in xrange(4):
polysection(i, i+1, col=cols[i + 1])
polysection(-i - 1, -i, col=cols[i + 1])
但是随着我的理解,我在
Polygon()
调用中弄错了坐标:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
最佳答案
问题在于plt.Polygon
的参数应该是2D元组的列表,因此请尝试以下操作:
xs = list(np.hstack((np.array(a), dx, np.array(b))))
ys = list(np.hstack((np.array(0), mlab.normpdf(dx, 0, 1), np.array(0))))
xy = zip(xs,ys)
ax.add_patch(plt.Polygon(xy))