动画制作蒙特卡洛方法Pi的色点不同 [英] Animating Monte Carlo Method Pi color dots diferently

查看:109
本文介绍了动画制作蒙特卡洛方法Pi的色点不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想让我对计算pi的mc方法结果的情节进行动画处理;但内圆点的颜色与其他圆点不同.我怎样才能做到这一点?到目前为止,这是我的代码:

I want to have an animation of my plot of my results of the mc method calculating pi; but having the inner circle dots colored differently than the others. How can I do that? This is my code so far:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

def punkt_im_quadrat(a,N): #a is length of square, N number of dots
"""generates random point in [0,a)x[0,a)"""
    x = a * np.random.random_sample((N,2))
    return x #[x,y]

def kreis(radius):
    return np.sqrt(radius - x**2)
x = np.linspace(0,1,100)

#create array of N=10 dots
punkte = punkt_im_quadrat(1,10) #a=1, so radius of circle is one


treffer = [i for i in punkte if i[1] <= np.sqrt(1 - i[0]**2)] #dots in circle
treffer = np.array(treffer)

außerhalb = [i for i in punkte if i not in treffer] #dots not in circle
außerhalb = np.array(außerhalb)


pi = 4 * len(treffer) / np.shape(punkte)[0] 

fig = plt.figure()
fig, ax = plt.subplots()
ax.plot(x,kreis(1))
ax.set_xlim(0,1)
ax.set_ylim(0,1)
ax.set(title=r"MC Sampling for $\pi$", 
      ylabel="y-axis",
      xlabel="x-axis")
#colors = ["r" if [punkte[i][0],punkte[i][1]] in treffer else "b"]
graph, = ax.plot([],[], "ro")

def animate(i):
    graph.set_data((punkte[:i,0],), (punkte[:i,1],))
    return graph,


animation = FuncAnimation(fig, func=animate, frames = range(np.shape(punkte)[0]), interval=20, repeat = False)
plt.show()

如您所见,我试图通过使用注释的颜色if语句来更改颜色;但随后会说
IndexError:用作索引的数组必须为整数(或布尔值)类型

As you can see, I have tried to change the colors by using the commented color if statement; but it then says
IndexError: arrays used as indices must be of integer (or boolean) type

然后我以为我可以在动画函数中执行if语句,以确定点在哪里.但是,当使用 graph.set_color 时,它将更改所有点的颜色.

I then thought I could do an if statement in the animated-function, to determine where the dot is. But when using graph.set_color it changes all dots color.

如果有人可以帮助我,我会感到非常高兴.
预先感谢!

I'd be really happy if someone can help me.
Thanks in advance!

推荐答案

plot 中的所有标记均具有相同的颜色,因此无法使用.如果要为不同的点使用不同的颜色,则需要使用 scatter()

All the markers in a plot have the same color, so that cannot work. If you want different colors for different points, you need to use scatter()

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

def punkt_im_quadrat(a,N): #a is length of square, N number of dots
    """generates random point in [0,a)x[0,a)"""
    x = a * np.random.random_sample((N,2))
    return x #[x,y]

def kreis(radius):
    return np.sqrt(radius - x**2)
x = np.linspace(0,1,100)

#create array of N=10 dots
punkte = punkt_im_quadrat(1,10) #a=1, so radius of circle is one


treffer = [i for i in punkte if i[1] <= np.sqrt(1 - i[0]**2)] #dots in circle
treffer = np.array(treffer)

außerhalb = [i for i in punkte if i not in treffer] #dots not in circle
außerhalb = np.array(außerhalb)

colors = np.array(["r" if i[1] <= np.sqrt(1 - i[0]**2) else "b" for i in punkte])


pi = 4 * len(treffer) / np.shape(punkte)[0] 

fig, ax = plt.subplots()
ax.plot(x,kreis(1))
ax.set_xlim(0,1)
ax.set_ylim(0,1)
ax.set(title=r"MC Sampling for $\pi$", 
      ylabel="y-axis",
      xlabel="x-axis")
graph = ax.scatter([],[], marker='o', s=30)

def animate(i):
    graph.set_offsets(punkte[:i,:])
    graph.set_facecolor(colors[:i])
    return graph,


animation = FuncAnimation(fig, func=animate, frames = range(np.shape(punkte)[0]), interval=20, repeat = False)

这篇关于动画制作蒙特卡洛方法Pi的色点不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆