Python学习之路(12)生成数据【项目2 数据可视化】

茴香豆 Lv5

数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表,也可以是数以G字节的数据。

1.绘制简单的折线图

下面来使用matplotlib绘制一个简单的折线图,再对其进行定制,以实现信息更丰富的数据可视化。查看使用matplotlib可制作的各种图表,请访问http://matplotlib.org/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5]#输入值
squares = [1, 4, 9, 16, 25]#输出值
#plt.plot()这个函数尝试根据这些数字绘制出有意义的图形
plt.plot(input_values, squares, linewidth=5)#线条宽度5
#设置图表标题,并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
#设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14)
#plt.show()打开matplotlib查看器,并显示绘制的图形
plt.show()
#plt.scatter()这个函数根据数字绘制一系列点
#s设置点的大小,c设置点的颜色,edgecolor设置点的轮廓颜色
#c可以通过RGB来自定颜色 c=(0, 0, 0)
plt.scatter(input_values, squares, s=100, c='red', edgecolor='none')
plt.show()

1.1自动计算数据

手工计算列表要包含的值可能效率低下,需要绘制的点很多时尤其如此。可以不必手工计算包含点坐标的列表,而让Python循环来替我们完成这种计算。

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
#使用循环来帮我们从输入映射到输出
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s=10, c='red', edgecolor='none')

plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
#设置每个坐标轴的取值范围 [x_min, x_max, y_min, y_max]
plt.axis([0, 1100, 0, 1100000])
plt.show()

1.2使用颜色映射

颜色映射 (colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。 在可视化中,颜色映射用于突出数据的规律,例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
#将参数c设置成了一个y值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。
#代码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色
plt.scatter(x_values, y_values, s=10, c=y_values, cmap=plt.cm.Blues, edgecolor='none')
#绘制图表
--snip--

1.3自动保存图表

要让程序自动将图表保存到文件中,可将对plt.show() 的调用替换为对 plt.savefig() 的调用。

1
2
3
#第一个实参设置文件名
#第二个实参指定将图表多余的空白区域裁剪掉
plt.savefig('squares_plot.png', bbox_inches='tight')

2.随机漫步

随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策决定的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from random import choice
class RandomWalk():
"""一个生成随机漫步数据的类"""
def __init__(self, num_points=5000):
"""初始化随机漫步的属性"""
self.num_points = num_points
#所有随机漫步都始于(0, 0)
self.x_values = [0]
self.y_values = [0]
def fill_walk(self):
"""计算随机漫步包含的所有点"""
#不断漫步,直到列表达到指定的长度
while len(self.x_values) < self.num_points:
#决定前进方向以及沿这个方向前进的距离
x_direction = choice([1, -1])
x_distance = choice([0, 1, 2, 3, 4])
x_step = x_direction * x_distance

y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
#拒绝原地踏步
if x_step == 0 and y_step == 0:
continue
#计算下一个点的x和y值
next_x = self.x_values[-1] + x_step
next_y = self.y_values[-1] + y_step

self.x_values.append(next_x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
#from random_walk import RandomWalk

rw = RandomWalk(50000)#设置点数为50000
rw.fill_walk()
point_numbers = list(range(rw.num_points))#获取点数
#设置绘图窗口尺寸
#figure 用于指定图表的宽度、高度、分辨率和背景色
plt.figure(figsize=(10, 6))
#隐藏坐标轴,此段代码必须位于scatter之前,并且赋值一个变量
current_axes = plt.axes()
current_axes.get_xaxis().set_visible(False)
current_axes.get_yaxis().set_visible(False)

plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolor='none', s=15)
#突出显示起点,终点
plt.scatter(0, 0, c='green', edgecolors='none', s=100)
plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
plt.show()

3.使用Pygal模拟掷骰子

使用Python可视化包Pygal来生成可缩放的矢量图形文件。对于需要在尺寸不同的屏幕上显示的图表,这很有用,因为它们将自动缩放,以适合观看者的屏幕。如果你打算以在线方式使用图表,请考虑使用Pygal来生成它们,这样它们在任何设备上显示时都会很美观。

要了解使用Pygal可创建什么样的图表,请查看图表类型画廊:访问 http://www.pygal.org/ ,单击Documentation,再单击Chart types。

3.1掷骰子

下面的类模拟掷一个骰子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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)
#创建一个D6
die = Die()
#掷几次骰子,并将结果存储在一个列表中
results = []
for roll_num in range(1000):
result = die.roll()
results.append(result)
print(results)
#output:[3, 5, 5, 1, 1, 6, 3, 3, 2, 6, 1, 2, ...]
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)
#output:[185, 175, 160, 172, 152, 156]
import pygal
#对结果可视化
hist = pygal.Bar()#Bar 条形图
hist.title = "Result 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文件,可用浏览器打开

掷两个骰子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 = "Result of rolling two D6 dice 1000 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('die_visual.svg')
  • Title: Python学习之路(12)生成数据【项目2 数据可视化】
  • Author: 茴香豆
  • Created at : 2022-10-09 14:52:56
  • Updated at : 2022-10-11 10:26:44
  • Link: https://hxiangdou.github.io/2022/10/09/Python_12/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments