python下绘制动态bar图
程序员文章站
2022-03-09 20:17:32
...
房间里有100个人,每人都有100元钱。他们在玩一个游戏:每轮游戏中,每个人都要拿出一元钱随机给另一个人。最后这100个人的财富分布是怎样的?
用python模拟了一把,之前的思路是先产生数据,再保存成图片序列,最后将图片序列通过转视频(利用OpenCV)或转gif(利用imageio)的方式来展现动态的数据。
这两方法有个缺点:不能立马看可视化的结果,得先生成数据!
所以,有了下面的方法,没用animation,但仍然可以实现python动图,还能绘制bar图哦。
import numpy as np
import matplotlib.pyplot as plt
import os
'''
房间里有100个人,每人都有100元钱。
他们在玩一个游戏:每轮游戏中,每个人都要拿出一元钱随机给另一个人。
最后这100个人的财富分布是怎样的?
'''
def init_wealthy(person_total, init_money):
wealthy = []
for i in range(0, person_total):
wealthy.append(init_money)
return wealthy
def get_id_to(id_from, total_person):
id_to = np.random.randint(0, total_person)
if id_to == id_from: # 假设不能把钱给自己
id_to = get_id_to(id_from, total_person)
# print("%d give id_to %d" % (owner, id_to))
return id_to
def check_dir(dir):
if not os.path.exists(dir):
os.mkdir(dir)
print('mkdir: [%s]' % dir)
def draw_ax(ax, title, data):
ax.cla()
ax.set_ylabel('money')
ax.set_ylim(-300, 500)
ax.set_title('%s, round:%d' % (title,i_round))
ax.bar(range(len(data)), data)
total_person = 100 # 总人数
init_money = 100 # 初始money数
total_round = 501 # 分配轮数
show_per_round = 200 # 每多少轮显示一次结果
list_money = init_wealthy(total_person, init_money)
fig, [ax1, ax2] = plt.subplots(2, 1, figsize=(16, 8))
# fig.tight_layout()
# for i_round in range(1, total_round): # 分配
i_round = 0
while True:
i_round += 1
for id_from in range(0, total_person): # 对每个人进行操作
id_to = get_id_to(id_from, total_person)
# id_to = np.random.randint(0, total_person)
list_money[id_from] -= 1
list_money[id_to] += 1
if i_round % show_per_round == 0:
draw_ax(ax1, 'origin', list_money)
list_money_sorted = list_money.copy()
list_money_sorted.sort()
draw_ax(ax2, 'sorted', list_money_sorted)
plt.pause(0.1)
plt.pause(0) # 在这里暂停住
print('finished')
上一篇: python 绘制动态韦恩图
下一篇: 选择排序-直接选择排序