欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《Python编程从入门到实践》项目2 生成数据, 折线图, 随机漫步, pygal

程序员文章站 2022-07-14 10:49:48
...

第 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

《Python编程从入门到实践》项目2 生成数据, 折线图, 随机漫步, pygal
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')

《Python编程从入门到实践》项目2 生成数据, 折线图, 随机漫步, pygal