美文网首页
Python数据可视化day03|Pygal画廊

Python数据可视化day03|Pygal画廊

作者: 习惯芥末味 | 来源:发表于2018-04-19 21:28 被阅读0次

    创建Die 类

    如果指定了实参num_sides=6,这个值将用于设置骰子的面数。骰子是根据面 数命名的,6面的骰子名为D6,8面的骰子名为D8,以此类推。
    方法roll() 使用函数randint()来返回一个1和面数之间的随机数。这个函数可能返回起始值1终止值num_sides 或这两个值之间的任何整数。

    ➜ die.py
    from random import randint
    
    class Die():
        """表示骰子的类"""
        def __init__(self,num_sides=6):
            """骰子默认为6面"""
            self.num_sides = num_sides
    
        def roll(self):
            """"返回一个位于1和骰子面数之间的随机值"""
            return randint(1, self.num_sides)
    

    掷骰子

    ➜  die_visual.py
    from die import Die
    
    #创建一个D6
    die = Die()
    
    # 掷几次骰子,并将结果存储在一个列表中
    results = []
    for roll_num in range(100):
        result = die.roll()
        results.append(result)
    
    print(results)
    

    掷骰子100次的打印结构:

    [5, 1, 1, 3, 6, 6, 3, 2, 3, 4, 5, 6, 1, 1, 5, 5, 5, 6, 6, 6, 3, 1, 5, 1, 5, 5, 3, 1, 2, 5, 2, 5, 5, 5, 6, 5, 6, 4, 3, 3, 1, 6, 5, 3, 6, 1, 5, 5, 6, 4, 1, 5, 3, 6, 2, 5, 2, 2, 2, 4, 5, 5, 5, 3, 6, 2, 3, 1, 1, 5, 3, 5, 6, 2, 5, 1, 4, 5, 5, 4, 4, 2, 2, 1, 6, 5, 3, 1, 2, 4, 4, 1, 2, 2, 4, 6, 3, 1, 1, 5]
    

    为分析掷一个D6骰子的结果,我们计算每个点数出现的次数:

    ➜  die_visual.py
    from die import Die
    
    #创建一个D6
    die = Die()
    
    #掷几次骰子,并将结果存储在一个列表中
    results = []
    for roll_num in range(100):
        result = die.roll() 
        results.append(result)
    
    #分析结果
    frequencies = []  #存储每种点数出现的次数
    for value in range(1, die.num_sides+1):   #遍历可能的点数
        frequency = results.count(value)  #计算每种点数在result中出现的次数
        frequencies.append(frequency)
    
    print(frequencies)
    

    绘制直方图

    根据上面计算出来的频率,绘制直方图。直方图就是一种条形图,指出了各种结果出现的频率。
    pygal是用来绘制直方图的,如果系统中没有要安装一下:
    方法与安装matplotlib类似,详见安装matplotlib

    ➜  die_visual.py
    import pygal 
    --snip--
    #分析结果
    frequencies = []
    for value in range(1, die.num_sides+1): 
        frequency = results.count(value)
        frequencies.append(frequency)
    
    
    #对结果进行可视化
    hist = pygal.Bar()
    hist.title = "Results of rolling one D6 1000 times." 
    hist.x_labels = ['1', '2', '3', '4', '5', '6']
    hist.x_title = "Result" hist.y_title = "Frequency of Result"
    
    
    hist.add('D6', frequencies) 
    hist.render_to_file('die_visual.svg')
    

    保存后,我们将这个图表渲染为一个SVG文件,这种文件的扩展名必须为.svg。要查看生成的直方图,最简单的方式是使用Web浏览器,那么把文件直接拖拽到浏览器就能打开,如下图:

    die_visual.svg直方图

    同时掷两个骰子

    复制die_visual.py文件,修改为dice_visual.py,在做如下内容修改:

    ➜  dice_visual.py
    import pygal
    
    from die import Die
    
    #创建两个D6骰子
    die_1 = Die()
    die_2 = Die()
    
    #掷几次骰子,并将结果存储在一个列表中
    results = []
    for roll_num in range(100):
        result = die_1.roll() + die_2.roll()
        results.append(result)
    
    #分析结果
    frequencies = []
    max_result = die_1.num_sides + die_2.num_sides
    for value in range(2, max_result+1): 
        frequency = results.count(value)
        frequencies.append(frequency)
    
    
    #对结果进行可视化
    hist = pygal.Bar()
    
    hist.title = "Results of rolling one D6 1000 times." 
    hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] 
    hist.x_title = "Result" 
    hist.y_title = "Frequency of Result"
    
    hist.add('D6 + D6', frequencies) 
    hist.render_to_file('die_visual.svg')
    
    同时掷两个骰子的直方图

    同时掷两个面数不同的骰子

    创建一个6面骰子和一个10面骰子,同时掷这两个骰子50 000次的结果:

    ➜ different_dice.py
    from die import Die 
    import pygal
    # 创建一个D6和一个D10
    die_1 = Die()
    die_2 = Die(10)
    
    # 掷骰子多次,并将结果存储在一个列表中 
    results = []
    for roll_num in range(50000):
        result = die_1.roll() + die_2.roll() 
        results.append(result)
    
    #分析结果
    frequencies = []
    max_result = die_1.num_sides + die_2.num_sides
    for value in range(2, max_result+1): 
        frequency = results.count(value)
        frequencies.append(frequency)
    
    # 可视化结果
    hist = pygal.Bar()
    hist.title = "Results of rolling a D6 and a D10 50,000 times." 
    hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12',
    '13', '14', '15', '16'] 
    hist.x_title = "Result" 
    hist.y_title = "Frequency of Result"
    hist.add('D6 + D10', frequencies) 
    hist.render_to_file('dice_visual.svg')
    
    同时掷两个面数不同的骰子的直方图

    相关文章

      网友评论

          本文标题:Python数据可视化day03|Pygal画廊

          本文链接:https://www.haomeiwen.com/subject/qvgbkftx.html