欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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')