Advertisement

python数据可视化之绘制直方图

阅读量:

python数据可视化之绘制直方图

使用SVG图表库pygal。 SVG 是一种矢量图格式。全称Scalable Vector Graphics – 可缩放矢量图形。用浏览器打开svg,可以方便的与之交互。
1. die.py类
复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2020-11-19 09:38:27
    # @Author  : EricRay
    # @Email   : ericray.tech@outlook.com
    # @Link    : 
    # @Description : File's name is 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)
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
2. 一只骰子
复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2020-11-19 09:41:50
    # @Author  : EricRay
    # @Email   : ericray.tech@outlook.com
    # @Link    : 
    # @Description:掷骰子,一枚,6面或者多面。文件名die_visual.py
    
    
    import pygal
    from die import Die
    
    # die = Die()
    # 输入任意边点数的骰子
    die_nums = input("Please inupt the die num_sides:\n")
    die = Die(int(die_nums))
    
    # 掷几次骰子, 并将结果存储在一个列表中
    results = []
    for roll_num in range(1000):
    result = die.roll()
    results.append(result)
    
    
    # 分析结果
    """
    frequencies = []
    for value in range(1, die.num_sides + 1):
    # print("The value is: " + str(value))
    frequency = results.count(value)    # 统计列表中数字出现的次数
    # print("Then results_count_value is: " + str(frequency))
    frequencies.append(frequency)
    """
    # 使用列表解析
    frequencies = [results.count(value) for value in range(1, die.num_sides + 1)]
    
    # 打印随机结果
    print(results)
    
    # 分析出现次数
    print(frequencies)
    
    # 绘制直方图
    hist = pygal.Bar()
    
    hist.title = "Results of rolling one D6 1000 times."
    # hist.x_labels = ['1', '2', '3', '4', '5', '6']
    hist.x_labels = [i for i in range(1, die.num_sides + 1)]  # 列表解析 设置x_labels
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    
    hist.add('D6', frequencies)
    
    hist.render_to_file('die_visual.svg')   # 保存结果
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
输出结果为:die_visual.svg
在这里插入图片描述
两只骰子,可选面数,投掷次数:
复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2020-11-20 10:08:44
    # @Author  : EricRay
    # @Email   : ericray.tech@outlook.com
    # @Link    : 
    # @Description: 同时掷两个骰子,文件名dice_visual.py
    
    import pygal
    
    from die import Die
    
    # 创建两个D6骰子
    # die_1 = Die()
    # die_2 = Die()   # die_2 = Die(10) 可以设置两个不同面数的骰子
    
    die_nums1 = input("Please inupt the first die num_sides:\n")
    die_nums2 = input("Please inupt the second die num_sides:\n")
    throw_times = input("Please inupt the throw times:\n")
    die_1 = Die(int(die_nums1))
    die_2 = Die(int(die_nums2))
    
    # 掷骰子多次,将结果保存在一个列表中
    
    """
    results = []
    for roll_num in range(1000):
    result = die_1.roll() + die_2.roll()
    results.append(result)
    """
    # 改用列表解析
    # 相加
    results = [die_1.roll() + die_2.roll()
           for roll_num in range(int(throw_times))]
    
    
    # 分析结果
    """
    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)
    """
    # 列表解析
    max_result = die_1.num_sides + die_2.num_sides
    frequencies = [results.count(value) for value in range(2, max_result + 1)]
    
    print(frequencies)
    
    # 可视化结果
    hist = pygal.Bar()
    
    hist.title = "Results of rolling two D6 dice " + throw_times + " times."
    # hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
    hist.x_labels = [i for i in range(2, max_result + 1)]
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    # hist.add('D6 + D6', frequencies)
    hist.add('D' + die_nums1 + '+ D' + die_nums2, frequencies)
    hist.render_to_file('dice_visual.svg')
    
    """
    总点数为2或12的可能性最小,而总点数为7的可能性最大,
    这是因为在6种情况下得到的总点数都为7。这6种情况如下:
    1和6、 2和5、 3和4、 4和3、 5和2、 6和1
    """
    
    """
    10个面,2000次构图:
    Please inupt the first die num_sides:
    10
    Please inupt the second die num_sides:
    10
    Please inupt the throw times:
    2000
    [20, 43, 57, 73, 86, 117, 147, 152, 190, 188, 191, 160, 158, 111, 111, 73, 61, 35, 27]
    """
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

10个面,2000次构图:
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~