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)
还没有任何评论哟~
