《Python编程从入门到实践》项目2 生成数据, 折线图, 随机漫步, pygal
第 15 章 生成数据
安装matplotlib
sudo apt-get install python3-matplotlib
15.2 绘制简单的折线图
plot and scatter
要查看使用matplotlib可制作的各种图表,请访问http://matplotlib.org/的示例画廊。单击画廊
中的图表,就可查看用于生成图表的代码。
15.2.1 修改标签文字和线条粗细
15.2.2 校正图形
import matplotlib.pyplot as plt
input_values = [1,2,3,4,5]
squares = [1, 4, 9 ,16, 25]
plt.plot(input_values, squares, linewidth = 5)
#设置图表标题, 并给坐标轴加上标签
plt.title("Square Numbers", fontsize = 24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Vaule", fontsize=14)
#设置刻度标记的大小
plt.tick_params(axis='both',labelsize=14)
plt.show()
15.2.3 使用 scatter() 绘制散点图并设置其样式
15.2.4 使用 scatter() 绘制一系列点
15.2.5 自动计算数据
15.2.6 删除数据点的轮廓
15.2.7 自定义颜色
15.2.8 使用颜色映射
15.2.9 自动保存图表
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, c=y_values, cmap=plt.cm.Blues, edgecolor='none', s=10)
#设置图表标题并给坐标轴加上标签
plt.title("Squre Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
#设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
#保存图标
plt.savefig('squares_plot.png', bbox_inches='tight')
15.3 随机漫步
15.3.1 创建 RandomWalk() 类
15.3.2 选择方向
15.3.3 绘制随机漫步图
15.3.4 模拟多次随机漫步
15.3.5 设置随机漫步图的样式
15.3.6 给点着色
15.3.7 重新绘制起点和终点
15.3.8 隐藏坐标轴
15.3.9 增加点数
15.3.10 调整尺寸以适合屏幕
随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向,
结果是由一系列随机决策决定的。
random_walk.py
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)
self.y_values.append(next_y)
import matplotlib.pyplot as plt
from random_walk import RandomWalk
#创建一个RandomWalk实例, 并将其包含的点都绘制出来
while True:
rw = RandomWalk(50000)
rw.fill_walk()
#设置绘图窗口的尺寸, dpi默认80 Python假定屏幕分辨率为80像素/英寸
#函数 figure() 用于指定图表的宽度、高度、分辨率和背景色
plt.figure(dpi = 128, figsize=(10,8))
#plt.scatter(rw.x_values, rw.y_values, s=5)
#映射点颜色
point_numbers = list(range(rw.num_points))
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolor='none', s=1)
#凸出起点和终点
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.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
keep_running = input("Make another walk? (y/n): ")
if keep_running == 'n':
break
15.4 使用 Pygal 模拟掷骰子
15.4.1 安装 Pygal
15.4.2 Pygal 画廊
15.4.3 创建 Die 类
15.4.4 掷骰子
15.4.5 分析结果
15.4.6 绘制直方图
15.4.7 同时掷两个骰子
15.4.8 同时掷两个面数不同的骰子
如果你打算以在线方式使用图表,请考虑使用Pygal来生成它们,这样它们在任何设备上显示时都会很美观
6面的常规骰子时,可能出现的结果为1~6点,且出现每种结果的可能性相同。然而,如果同时掷两个骰子,某些点数出现的可能性将
比其他点数大。为确定哪些点数出现的可能性最大,我们将生成一个表示掷骰子结果的数据集,
并根据结果绘制出一个图形。
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)
from die import Die
import pygal
#创建一个D6
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)
print(frequencies)
#对结果进行可视化--- 直方图
hist = pygal.Bar()
hist.title = "Results of rolling two D6 1000 times."
hist.x_labels = []
for i in range(2, max_result+1):
hist.x_labels.append(str(i))
print(hist.x_labels)
#hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
hist.x_title = "Results"
hist.y_title = "Frequency of Result"
#add() 将一系列值添加到图表中
#传递给添加的值指定的标签,还有一个列表,其中包含将出现在图表中的值
hist.add('D6 + D6', frequencies)
hist.render_to_file('die_visual.svg')