Python:简单数据可视化

1.绘制简单的折线图

下面来使用matplotlib绘制一个简单的折线图,使用平方数序列1、4、9、16和25来绘制这个图表。

import matplotlib.pyplot as plt 
squares = [1, 4, 9, 16, 25] 
plt.plot(squares) 
plt.show()

我们首先导入了模块pyplot ,并给它指定了别名plt ,以免反复输入pyplot。模块pyplot包含很多用于生成图表的函数。

我们创建了一个列表,在其中存储了前述平方数,再将这个列表传递给函数plot() ,这个函数尝试根据这些数字绘制出有意义的图形。plt.show() 打开matplotlib查看器,并显示绘制的图形。

图片的各个方面可以通过matploylib中的其他函数来进行改变。

import matplotlib.pyplot as plt 
# 列表中有5个点,所以横坐标为0,1,2,3,4
# 分别对应纵坐标1,4,9,16,25
squares = [1, 4, 9, 16, 25]

# linewidth设置线条的粗细,且关键词linewidth不可改变
plt.plot(squares, linewidth=5)

# 设置图表标题,并给坐标轴加上标签 
# 其中标题不能为中文,且关键词不能改变
plt.title("Square Numbers", fontsize=24) 
plt.xlabel("Value", fontsize=14) 
plt.ylabel("Square of Value", fontsize=14) 

# 设置刻度标记的大小 
# 参数axis= 'both'、'x'、'y'
plt.tick_params(axis='both', labelsize=14) 
plt.show()

参数linewidth 决定了plot() 绘制的线条的粗细。

函数title() 给图表指定标题。在设置标题代码中,出现了多次的参数fontsize指定了图表中文字的大小。

函数xlabel() 和ylabel() 让你能够为每条轴设置标题。

函数tick_params() 设置刻度的样式。其中指定的实参将影响x轴和y轴上的刻度(axes='both' ),并将刻度标记的字号设置为14(labelsize=14 )。

图形更容易阅读后,我们发现没有正确地绘制数据:折线图的终点指出4.0的平方为25!下面来修复这个问题。

当你向plot() 提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的 x 值为1。为改变这种默认行为,我们可以给plot() 同时提供输入值和输出值:

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)

# 设置3种标题
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()

其结果为:

从图中可以看出,横纵坐标一一对应。

2.绘制散点图

有时候,需要绘制散点图并设置各个数据点的样式。

要绘制单个点,可使用函数scatter() ,并向它传递一对x和y坐标,它将在指定位置绘制一个点:

import matplotlib.pyplot as plt 
plt.scatter(2, 4) 
plt.show()

下面来设置输出的样式,使其更有趣:添加标题,给轴加上标签,并确保所有文本都大到能够看清:

import matplotlib.pyplot as plt
# s控制的是点的大小,且关键词s不能改变
plt.scatter(2, 4, s=200) 

# 设置图表标题并给坐标轴加上标签 
plt.title("Square Numbers", fontsize=24) 
plt.xlabel("Value", fontsize=14) 
plt.ylabel("Square of Value", fontsize=14) 

# 设置刻度标记的大小
# 参数which的值为 'major'、'minor'、'both',分别代表设置主刻度线、副刻度线以及同时设置,默认值为'major'
plt.tick_params(axis='both', which='major', labelsize=14) 
plt.show()

要绘制一系列的点,可向scatter() 传递两个分别包含x值和y值的列表,如下所示:

import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5] 
y_values = [1, 4, 9, 16, 25] 
plt.scatter(x_values, y_values, s=100) 
# 设置图表标题并给坐标轴指定标签 
--snip--

其结果为:

当要输入大量的点时,可以用代码的循环来实现:

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=40) 
# 设置图表标题并给坐标轴加上标签 
--snip-- 
# 使用函数axis() 指定了每个坐标轴的取值范围
# 函数axis() 要求提供四个值:x 和 y 坐标轴的最小值和最大值。
plt.axis([0, 1100, 0, 1100000]) 
plt.show()

其结果为:

要删除数据点的轮廓,可在调用scatter() 时传递实参edgecolor='none' :

plt.scatter(x_values, y_values, edgecolor='none', s=40)

要修改数据点的颜色,可向scatter() 传递参数c ,并将其设置为要使用的颜色的名称,如下所示:

plt.scatter(x_values, y_values, c='red', edgecolor='none', s=40)

你还可以使用RGB颜色模式自定义颜色。要指定自定义颜色,可传递参数c ,并将其设置为一个元组,其中包含三个0~1之间的小数值,它们分别表示红色、绿色和蓝色分量。例如,下面的代码行创建一个由淡蓝色点组成的散点图:

# 分别代表红、绿、蓝,值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。
plt.scatter(x_values, y_values, c=(0, 0, 0.8), edgecolor='none', s=40)

颜色映射是是一系列颜色,它们从起始颜色渐变到结束颜色。射用于突出数据的规律。

模块pyplot内置了一组颜色映射。要使用这些颜色映射,你需要告诉pyplot该如何设置数据集中每个点的颜色。

import matplotlib.pyplot as plt 
x_values = list(range(1001)) 
y_values = [x**2 for x in x_values] 
# 'c=y_values'说明颜色随着y值的变化而变化
# 'cmap=plt.cm.Blues'说明改变的颜色是蓝色
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, 
            edgecolor='none', s=40) 
# 设置图表标题并给坐标轴加上标签 
--snip--

其结果为:

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

# 该图片将保存在当前.py文件所在的目录下
plt.savefig('squares_plot.png', bbox_inches='tight')

第一个实参指定要以什么样的文件名保存图表,这个文件将存储到scatter_squares.py所在的目录中;第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可省略这个实参。

3.随机漫步

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

为模拟随机漫步,我们将创建一个名为RandomWalk 的类,它随机地选择前进方向。这个类需要三个属性,其中一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的x和y坐标,其中只有两个函数。

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]) # 选择方向左(-1)、右(1)
            x_distance = choice([0, 1, 2, 3, 4]) # 选择方向上距离  
            x_step = x_direction * x_distance # x最终的移动
            
            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 # 移动后最终的x坐标
            next_y = self.y_values[-1] + y_step 
            
            self.x_values.append(next_x) # 将这一坐标添加到x列表中 
            self.y_values.append(next_y)

3.1绘制随机漫步图

RandomWalk类创建好后,下面将随机漫步图绘制出来:

import matplotlib.pyplot as plt
from random import choice 

class RandomWalk():
    --snip--
# 创建了一个RandomWalk 实例
rw = RandomWalk() 
rw.fill_walk() 
# 将随机漫步包含的 x 和 y 值传递给scatter() ,并选择了合适的点尺寸
plt.scatter(rw.x_values, rw.y_values, s=15) 
plt.show()

其结果为:

3.2设置随机漫步图的样式

import matplotlib.pyplot as plt

class RandomWalk():
    --snip--
    
while True: 
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来 
    rw = RandomWalk() 
    rw.fill_walk() 
    # 使用了range() 生成了一个数字列表,其中包含的数字个数与漫步包含的点数相同
    # 以便后面使用颜色映射
    point_numbers = list(range(rw.num_points)) 
    
    # 将参数c设置为point_numbers ,指定使用颜色映射Blues
    # 传递实参edgecolor=none 以删除每个点周围的轮廓
    plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, 
                edgecolor='none', s=15) 
    
    plt.show() 
    # 此时该程序是无限循环的,下面的语句将终止循环
    keep_running = input("Make another walk? (y/n): ")
    if keep_running =='n':
        break
    else:
        continue

上面的代码在原有的基础上增加了循环、终止循环、给点着色功能的实现,其结果为:

--snip-- 
while True: 
    --snip-- 
    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() 
    --snip--

上述代码在原有基础上增加了特别显示起点(绿色)和终点(红色),其结果为:

--snip-- 
while True: 
    --snip-- 
    plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', 
                edgecolors='none', s=100) 
    # 隐藏坐标轴 
    # 使用了函数plt.axes(),将每条坐标轴的可见性都设置为False
    plt.axes().get_xaxis().set_visible(False) 
    plt.axes().get_yaxis().set_visible(False) 
    plt.show() 
    --snip--

上述代码在原有基础上增加了隐藏横纵坐标轴,其结果为:

4.使用Pygal模拟掷骰子

在进行模拟前我们先创建一个骰子类。

from random import randint 

class Die(): 
    """表示一个骰子的类""" 
    def __init__(self, num_sides=6): 
        """骰子默认为6面""" 
        # 如果指定了实参,这个值将用于设置骰子的面数
        self.num_sides = num_sides 
        
    def roll(self): 
        """"返回一个位于1和骰子面数之间的随机值""" 
        # 函数randint() 来返回一个1和面数之间的随机数
        return randint(1, self.num_sides)

下面模拟掷100次骰子并计算每面出现的次数。

class Die():
    --sinp--
# 创建一个Die()类的实例    
die = Die()

#开始掷100次骰子,并将结果添加到results列表中
results = [] 
for roll_num in range(1000): 
    result = die.roll() 
    results.append(result)
    
# 统计每面出现的次数,并将其放到frequencies列表中
frequencies = [] 
# 从1开始遍历results,使用函数count(),将结果添加到列表中
for value in range(1, die.num_sides+1): 
    frequency = results.count(value)
    frequencies.append(frequency)
    
print(frequencies)

其结果为:

4.1绘制直方图

有了频率列表后,我们就可以绘制一个表示结果的直方图。直方图是一种条形图图,指出了各种结果出现的频率。

import Pygal 
--snip-- 
# 分析结果 
frequencies = [] 
for value in range(1, die.num_sides+1): 
    frequency = results.count(value) f
    requencies.append(frequency) 
    
# 对结果进行可视化 
# 为创建条形图,我们创建了一个pygal.Bar() 实例
hist = pygal.Bar() 
# 为直方图添加标题
hist.title = "Results 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"
# 使用add() 将一系列值添加到图表中
#(向它传递要给添加的值指定的标签,还有一个列表,其中包含将出现在图表中的值)
hist.add('D6', frequencies) 
# 将这个图表渲染为一个SVG文件,这种文件的扩展名必须为.svg。
hist.render_to_file('die_visual.svg')

你可能感兴趣的:(Python:简单数据可视化)