python下绘制动态bar图

房间里有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')

 

你可能感兴趣的:(杂)