Python學習之路14-生成數據

《Python編程:從入門到實踐》筆記。
從本篇起將用三篇的篇幅介紹如何用Python進行數據可視化。

1. 前言

從本篇開始,咱們將用三篇的篇幅來初步介紹如何使用Python來進行數據可視化操做。本篇的內容包括:python

  • 繪製簡單的折線圖;
  • 隨機漫步;
  • 使用Pygal模擬擲骰子。

在正式開始以前,須要安裝兩個擴展包:matplotlibpygal。Python中安裝第三方庫的方式已在上一個項目中介紹過了,這裏再也不贅述。編程

2. 繪製簡單的折線圖

2.1 簡單的折線圖

首先咱們繪製一個簡單的折線圖,代碼保存到mpl_squares.py文件中:瀏覽器

import matplotlib.pyplot as plt

# 輸入數據, x軸
input_values = [1, 2, 3, 4, 5]
# 輸出數據, y軸
squares = [1, 4, 9, 16, 25]
# linewidth表示線條的粗細
plt.plot(input_values, squares, linewidth=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.pyplot.plot()函數能夠只傳入一個squares參數,表示y軸的值,此時將從x軸0點處開始一一對應。有時這樣很簡便,但在此例中圖標將不正確,因此咱們傳入了input_values列表,將其與squares列表一一對應。微信

代碼從第10行到15行均可以省了,這些代碼只是讓圖表的信息更全。最終的結果以下:app

圖片描述

2.2 生成散點圖

咱們使用matplotlib.pyplot中的scatter()函數來生成散點圖,將代碼保存到scatter_squares.py文件中:dom

import matplotlib.pyplot as plt

x_values = list(range(1, 1001))
y_values = [x ** 2 for x in x_values]

# s表示點的大小,edgecolor表示點的輪廓的顏色,c表示數據點的顏色(可使用RGB顏色)
# plt.scatter(x_values, y_values, s=4, edgecolor="none", c="red")

# 使用漸變色, 給c賦值了一個y值列表,並使用參數cmap告訴pylot使用哪一個顏色來映射
plt.scatter(x_values, y_values, s=40, edgecolor="none", c=y_values, cmap=plt.cm.Blues)

# 設置圖表標題並給座標軸加上標籤
plt.title("Square Number", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

# 設置刻度的大小
plt.tick_params(axis="both", which="major", labelsize=14)

# 每一個座標軸的取值範圍
plt.axis([0, 1100, 0, 1100000])

# 第一個參數是路徑名,第二個參數指定將圖表多餘的空白區域裁減掉。
plt.savefig("squares.png", bbox_inches="tight")

plt.show()

咱們使用了列表生成式來生成y軸的數據,並使用漸變色來繪製圖像,matplotlib.pyplot.cm.Bluesmatplotlib自帶的漸變色,它和c的每個值對應。經過pyplotaxis()函數來設置每一個軸的取值範圍。最後將圖像保存到本地。生成的圖像以下:ide

圖片描述

3. 隨機漫步

隨機漫步指的是:每次行走都徹底隨機,沒有明確的方向,結果是由一系列隨機決策決定的。在天然界、物理學、生物學、化學和經濟領域,隨機漫步都有其實際用途。svg

使用Python生成隨機漫步數據,再使用matplotlib將這些數據繪製出來。首先建立RandomWalk類,代碼保存到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:
            # 決定前進方向以及沿這個方向前進的距離
            # 經過choice從給定值中隨機選取
            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

            # 計算下一個點的座標
            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)

下面的代碼用於生成隨機漫步圖像,代碼保存到rw_visual.py文件中:網站

import matplotlib.pyplot as plt
from random_walk import RandomWalk

while True:
    rw = RandomWalk(50000)
    rw.fill_walk()

    # 設置繪圖窗口的尺寸
    plt.figure(figsize=(10, 6))

    # 繪製隨機漫步的圖像
    point_number = list(range(rw.num_points))
    plt.scatter(rw.x_values, rw.y_values, s=1, c=point_number,
                edgecolors="none", cmap=plt.cm.Blues)

    # 突出起點和終點
    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()

    if input("Make another walk?(y/n)") == "n":
        break

程序經過一個循環類屢次繪製隨機漫步圖;經過pyplotfigure()函數來設置圖像的尺寸,figsize的單位是英寸;經過漸變色來繪製圖像的路徑,顏色由淺到深,而且咱們將起點(綠色)和終點(紅色)顯著標出;最後隱藏座標軸。最終的圖像以下(每次運行的效果都不一樣):

圖片描述

4. 使用Pygal模擬擲骰子

首先咱們須要建立一個骰子類Dice,將其保存到dice.py中:

from random import randint

class Dice:
    """表示一個骰子類"""
    def __init__(self, num_sides=6):
        """骰子默認爲6面"""
        self.num_sides = num_sides

    def roll(self):
        """返回一個位於1和骰子面數之間的隨機值"""
        return randint(1, self.num_sides)

能夠自行設定骰子的面數。下面是擲兩個骰子50000次,統計倆骰子點數之和的分佈的模擬,最後生成了一個矢量文件.svg文件,它能在瀏覽器中打開,代碼以下:

import pygal
from dice import Dice

dice_1 = Dice()
dice_2 = Dice(10)

# 擲骰子屢次,並將結果存儲在一個列表中
results = []
for roll_num in range(50000):
    results.append(dice_1.roll() + dice_2.roll())

# 分析結果
frequences = []
# 可以模擬擲任何雙骰子的狀況,無論這些骰子有多少面
max_result = dice_1.num_sides + dice_2.num_sides
for value in range(2, max_result + 1):
    # 統計每一個結果的頻數
    frequences.append(results.count(value))

# 對結果進行可視化
# 建立條形圖
hist = pygal.Bar()

hist.title = "Result of rolling a D6 and a D10 50000 times."
# 建立x軸上的刻度
hist.x_labels = [str(value) for value in range(2, max_result + 1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

# 給這組數據起個名字,並加到圖表中
hist.add("D6 + D10", frequences)
# 將圖像渲染爲svg文件,矢量圖
hist.render_to_file("dice_visual.svg")

注意,frequences中的數據依次與hist.x_labels對應。下面是最終結果:

圖片描述

Pygal讓這個圖表具備交互性:若是你將鼠標指向該圖中的任何數據條,將看到它的具體數據。

5. 小結

本篇主要講述了:

  • 如何生成數據集以及如何對其進行可視化;
  • 如何使用matplotlib建立簡單的圖表;
  • 若是使用散點圖來探索隨機漫步過程;
  • 如何使用Pygal建立直方圖,以及如何使用直方圖來探索同時擲兩個面數不一樣的骰子的結果。


迎你們關注個人微信公衆號"代碼港" & 我的網站 www.vpointer.net ~

相關文章
相關標籤/搜索