Skip to content

Commit 82882d4

Browse files
committed
数据可视化_生成数据
数据可视化_生成数据
1 parent f91e1c6 commit 82882d4

File tree

8 files changed

+182
-0
lines changed

8 files changed

+182
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from random import randint
2+
3+
class Die():
4+
"""表示一个骰子的类"""
5+
6+
def __init__(self, num_sides=6):
7+
"""骰子默认6个面"""
8+
self.num_sides = num_sides
9+
10+
def roll(self):
11+
"""返回一个位于1和骰子面数之间的随机值"""
12+
return randint(1, self.num_sides)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import shutil
2+
import pygal
3+
4+
from die import Die
5+
6+
# 创建一个 D6 和 D10 [8面骰子]
7+
die_1 = Die()
8+
die_2 = Die(10)
9+
10+
# 抛几次骰子, 并将结果存储在一个数组中
11+
results = []
12+
for roll_num in range(100):
13+
result = die_1.roll() + die_2.roll()
14+
results.append(result)
15+
16+
print(results)
17+
18+
# 分析结果
19+
frequencies = []
20+
21+
for value in range(2, die_1.num_sides + die_2.num_sides):
22+
frequency = results.count(value)
23+
frequencies.append(frequency)
24+
25+
print(frequencies)
26+
27+
# 对结果进行可视化
28+
hist = pygal.Bar()
29+
30+
hist.title = "抛 D6 和 D10 骰子的和"
31+
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']
32+
hist.x_title = "结果"
33+
hist.y_title = "次数"
34+
35+
hist.add('D6 + D10', frequencies) # 柱状图注释及数值
36+
hist.render_to_file('die_visual.svg')
37+
38+
# 移动生成图片的位置
39+
shutil.move("die_visual.svg", 'images/die_visual.svg')

017_Data_Visualization/CreateData/images/die_visual.svg

Lines changed: 4 additions & 0 deletions
Loading
33.1 KB
Loading
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 折线图
2+
3+
import matplotlib.pyplot as plt
4+
5+
input_values = [1, 2, 3, 4, 5] # x
6+
squares = [1, 4, 9, 16, 25] # y
7+
8+
plt.plot(input_values, squares, linewidth=5) # 根据参数绘制图形, 设置线条宽度
9+
10+
# 设置图标标题, 并给坐标轴加上标签
11+
plt.title("Square Numbers", fontsize=24)
12+
plt.xlabel('值', fontsize=14)
13+
plt.ylabel('值的平方', fontsize=14)
14+
15+
# 设置刻度标记的大小
16+
plt.tick_params(axis='both', labelsize=14)
17+
18+
plt.show() # 打开 matplotlib 查看器, 并显示绘制的图形
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from random import choice
2+
3+
class RandomWalk():
4+
"""一个生成随机漫步数据的类"""
5+
6+
def __init__(self, num_points=5000):
7+
"""初始化随机漫步的属性"""
8+
self.num_points = num_points
9+
10+
# 所有随机漫步都始于(0, 0)
11+
self.x_values = [0]
12+
self.y_values = [0]
13+
14+
def fill_walk(self):
15+
"""不断漫步, 直到列达到指定的长度"""
16+
while len(self.x_values) < self.num_points: # 少于5000或自定义的步数
17+
# 决定前进方向以及沿这个方向前进的距离
18+
x_direction = choice([1, -1]) # 方向 [左, 右]
19+
x_distance = choice([0, 1, 2, 3, 4]) # 距离 [0, 1, 2, 3, 4]
20+
x_step = x_direction * x_distance
21+
22+
y_direction = choice([1, -1]) # 方向 [上, 下]
23+
y_distance = choice([0, 1, 2, 3, 4]) # 距离 [0, 1, 2, 3, 4]
24+
y_step = y_direction * y_distance
25+
26+
# 拒绝原地踏步
27+
if x_step == 0 and y_step == 0:
28+
continue
29+
30+
# 计算下一个点的 x 和 y 值
31+
next_x = self.x_values[-1] + x_step # x_values[-1] x_values 的最后一个元素
32+
next_y = self.y_values[-1] + y_step # y_values[-1] y_values
33+
34+
self.x_values.append(next_x)
35+
self.y_values.append(next_y)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import matplotlib.pyplot as plt
2+
3+
from random_walk import RandomWalk
4+
5+
# 创建一个 RandomWalk 实例, 并将其包含的点都绘制起来
6+
while True:
7+
rw = RandomWalk(50000)
8+
rw.fill_walk()
9+
10+
# 设置绘制窗口大小
11+
# figsize 单位为英寸
12+
# dpi: 像素/英寸 [Python 默认值80]
13+
plt.figure(dpi=128, figsize=(10, 6))
14+
15+
point_orders = list(range(rw.num_points))
16+
# c=point_numbers, cmap=plt.cm.Blues 根据点的先后顺序进行蓝色的映射
17+
plt.scatter(rw.x_values, rw.y_values, edgecolors='none', s=1, c=point_orders, cmap=plt.cm.Blues)
18+
19+
# 重绘起点终点从而突出
20+
plt.scatter(0, 0, c='green', edgecolors='none', s=20)
21+
plt.scatter(rw.x_values[-1], rw.y_values[-1], c='yellow', edgecolors='none', s=20)
22+
23+
# 隐藏坐标轴
24+
plt.axes().get_xaxis().set_visible(False)
25+
plt.axes().get_yaxis().set_visible(False)
26+
27+
plt.show()
28+
29+
# 关闭绘制的图片后, 询问是否再次绘制
30+
rw_again = input("是否再次绘制?(y/n):\n")
31+
if rw_again == 'n':
32+
break
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# 散点图
2+
# [scatter()]
3+
4+
import shutil
5+
6+
import matplotlib.pyplot as plt
7+
8+
x_values = list(range(1, 1001)) # [1, 2, 3, 4,..., 999, 1000]
9+
y_values = [x**2 for x in x_values] # [ 1, 4, 9, 16,..., 999*999, 1000*1000]
10+
11+
# 点默认为蓝色黑轮廓
12+
# s=40 设置点的大小
13+
# edgecolors='none' 删除数据点的轮廓
14+
# c='red' c=(0.1, 0.2, 0.3) 设置点的颜色 [c 可以是特定颜色的单词 或 0~1的三位数元组]
15+
# plt.scatter(x_values, y_values, edgecolors='none', s=40, c=(0.1, 0.5, 1))
16+
17+
# 使用颜色映射
18+
# c=y_values, cmap=plt.cm.Blues 根据 y_values 来设置蓝色的颜色映射. 值越大, 色越深
19+
plt.scatter(x_values, y_values, edgecolors='none', s=40, c=y_values, cmap=plt.cm.Blues)
20+
21+
# 设置图标标题, 并给坐标轴加上标签
22+
plt.title("Square Numbers", fontsize=24)
23+
plt.xlabel('值', fontsize=14)
24+
plt.ylabel('值的平方', fontsize=14)
25+
26+
# 设置刻度标记的大小
27+
plt.tick_params(axis='both', labelsize=14)
28+
29+
# 设置每个坐标轴的取值范围
30+
plt.axis([0, 1100, 0, 1100000])
31+
32+
# 保存生成的图标 [要放在 plt.show() 前面]
33+
# 保存路径为此 py 文件所在路径
34+
p_name = 'squares_plot.png'
35+
plt.savefig(p_name, bbox_inches='tight')
36+
37+
# 移动生成图片的位置
38+
shutil.move(p_name, 'images/' + p_name)
39+
print("a")
40+
41+
# 打开 matplotlib 查看器, 并显示绘制的图形
42+
plt.show()

0 commit comments

Comments
 (0)