《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')

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值