谈谈Python实战数据可视化之matplotlib模块(基础篇)

前沿

Python提供了不少模块用于数据可视化,其中matplotlib、pygal等模块。我参考网上热门书籍《Python编程从入门到实战》,在测试与学习过程当中遇到的些许问题加以解决,才写下这一项目实战的心得,对于Python基础部分就不细讲,主要是项目核心要点和解决方案的描述。本小节先讲述pyplot模块的基本使用。编程

新手的建议

针对新手,真心以为不要直接使用Python下载来的IDLE来开发,由于功能太少了,也很差使用。个人建议是对于Python初学者,先安装Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多很是有用的第三方库,咱们装上Anaconda,就至关于把数十个第三方模块自动安装好了,很是简单易用,在安装界面添加Anaconda到PATH环境变量中勾上,这样就会自动添加环境变量了。Anaconda 自带了一个编辑器-Spyder,可使用Spyder编写代码,知道有这个编辑器就好。而后再安装一个PyCharm,它是一种Python IDE,带有一整套能够帮助用户在使用Python语言开发时提升其效率的工具。
Anaconda和PyCharm安装过程和方法文档连接,我是摘抄网上有用的资料再总结出来的:连接:https://pan.baidu.com/s/10KcfLLvI9omIRSJ6JMK9Uw 密码:cgf8app

利用pyplot模块的plot函数绘制折线图

咱们先导入模块pyplot,而后使用该模块的plot函数来绘制折线图,接着调用该模块的相关函数来调整、设置图表的标题、横纵标签、刻度标记内容或大小。注意, pyplot模块的plot函数能够接收输入参数和输出参数,还有线条粗细等参数,可是若plot函数只指定输出参数(列表),那么输入参数默认由0开始。
(1)plot函数指定输出参数(1,2,3,4,5的平方数列表)dom

import matplotlib.pyplot as plt
# pyplot模块的plot函数能够接收输入参数和输出参数,还有线条粗细等参数,,例以下方的示例
squares = [1, 4, 9, 16, 25]
plt.plot(squares, linewidth=5)  # 这里只指定了一个列表,那么就看成是输出参数,输入参数从0开始,就会发现没有正确绘制数据
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.tick_params(axis='both', labelsize=14)  # 参数axis值为both,表明要设置横纵的刻度标记,标记大小为14
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(2)plot函数指定输入参数和输出参数
咱们知道,上面并无按照咱们的意愿来绘制图形,Y轴指定为[1,4,9,16,25],上面采用默认输入参数处理X轴变成[0,1,2,3,4]。X轴应该对应值为[1,2,3,4,5]才是咱们的目的,因此咱们必须同时指定输入参数和输出参数才行。观察运行结果图的X轴变化了。编辑器

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)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.tick_params(axis='both', labelsize=14)  # 参数axis值为both,表明要设置横纵的刻度标记,标记大小为14
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)ide

利用pyplot模块的scatter函数绘制散点图

绘制散点图只不过是绘制函数不一样,从上面的plot变为scatter,其余设置标题、横纵标签等的方式同样。
(1)scatter函数绘制单个点函数

import matplotlib.pyplot as plt
plt.scatter(2, 4, s=200)  # 传递一对x和y坐标。它将在指定位置绘制一个点,参数s是设置绘制图形时使用的点的尺寸
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.tick_params(axis='both', labelsize=14)  # 参数axis值为both,表明要设置横纵的刻度标记,标记大小为14
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(2)scatter函数绘制一系列点工具

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)  # 传入两个列表,列表x_values的元素做为x坐标,列表y_values的元素做为y坐标,两个组合成一个点的坐标,因此一共有5个点
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.tick_params(axis='both', labelsize=14)  # 参数axis值为both,表明要设置横纵的刻度标记,标记大小为14
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(3)自动计算Y轴的数据
前面个两个实例挺简单,但也只是咱们本身定义的短列表,若是要绘制的点有不少,那么还手动写固然不实际,因此咱们写一个根据咱们指定的X轴的数据,自动计算Y轴的数据就省事不少了。学习

import matplotlib.pyplot as plt
x_values = list(range(1, 1001))  # 咱们是利用range函数生成一个从1到1000的可迭代对象(不包括1001),而后强制转换为列表
y_values = [x ** 2 for x in x_values]  # 这个语法是列表推导式,将x_values每一个元素的值进行平方再逐一放入列表,最后这个列表推导式返回整个列表
plt.scatter(x_values, y_values, s=40)  # 在2.0.0版本后的matplotlib中,scatter()函数的实参edgecolor(数据点的轮廓)默认为'none',则删除轮廓。
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.axis([0, 1100, 0, 1100000])  # 设置每一个坐标轴的取值范围。其实最右侧就是1100,可是没有显示标签而已
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
注意, 在2.0.0版本后的matplotlib中scatter()函数的实参edgecolor(数据点的轮廓)不写则默认为'none',表明删除轮廓。也能够经过如下修改代码:测试

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

上述修改后的代码指定数据点轮廓的颜色为红色,因为默认点的颜色为蓝色,因此你将会看到下面这样,只有右上角是蓝色,其余都是红色,这是由于绘制不少点,红色轮廓都粘连在一块儿了,因此看不出来。
修改代码后运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
上面说了默认数据点的颜色为蓝色,咱们也能够经过参数c修改数据点的颜色,至于颜色值能够采用直接写颜色英文如'red'、'black'等,或者使用RGB颜色模式自定义颜色,这个自定义颜色设置为一个元组,其中包含三个0~1之间的小数值,它们分别表示红色、绿色和蓝色份量,如(0,0,0.8)。能够经过下面这样修改代码:字体

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=(0, 0.8, 0), s=40)  # 指定了c参数,使用的是RGB颜色值方式
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.axis([0, 1100, 0, 1100000])  # 设置每一个坐标轴的取值范围。其实最右侧就是1100,可是没有显示标签而已
plt.show()  # 打开matplotlib查看器,并显示绘制的图形

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(4)使用颜色映射和自动保存图表
照书上P294页的使用颜色映射小节的描述对于初学者可能有点模棱两可,这里采用我本身的代码来理解什么是颜色映射,原理是什么。
测试代码以下:

import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]  # 含x值的列表
y_values = [1, 4, 2, 6, 5]  # 含y值的列表
#  咱们知道根据上面两个列表,咱们调用scatter能够绘制一系列的点
# 模块pyplot内置了一组颜色映射,经过设置c参数为y列表的值(这个y列表的是[1,2,3,4,5])而后利用参数cmap根据y列表的大小映射到由x_values和y_values组成的五个点从浅到深的颜色,能够看出y列表[1,2,3,4,5]分别映射到(1,1),(2,4),(3,2),(4,6),(5,5)五个点,其中(1,1)点颜色最浅,(5,5)点颜色最深。
plt.scatter(x_values, y_values, c=[1, 2, 3, 4, 5], cmap=plt.cm.Blues, s=100)
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.savefig("3.png", bbox_inches='tight')  # 打开matplotlib查看器,并显示绘制的图形
# 值的注意的是,要让程序自动将图表保存到文件中,可将对plt.show()的调用替换为对plt.savefig()的调用。
# 若是指定了bbox_inches='tight'将图表多余的空白区域裁剪掉,明显更符合用户需求,若是没指定,生成的图片显示不出Y轴的标签。

运行结果以下(须要注意,其实(1,1)点的位置还有一个很是浅蓝色的点,只是浅到看不到而已):
谈谈Python实战数据可视化之matplotlib模块(基础篇)
若是还不理解,那么你就修改如下测试代码来运行观察:

plt.scatter(x_values, y_values, c=[1, 5, 3, 4, 5], cmap=plt.cm.Blues, s=100)

运行结果以下(能够发现(2,4)点的颜色也变成深蓝色了哦):
谈谈Python实战数据可视化之matplotlib模块(基础篇)
有了上面的理解基础,咱们能够修改成书本源代码,来观察一下蓝色彗星的残影,哈哈O(∩_∩)O
书本源代码:

import matplotlib.pyplot as plt
x_values = list(range(1,1001)) # 含x值的列表
y_values = [x ** 2 for x in x_values]  # 含y值的列表
#  咱们知道根据上面两个列表,咱们调用scatter能够绘制一系列的点
# 根据y列表的值大小进行颜色映射的,值大的颜色深,值小的颜色浅。若是y列表的值按顺序,而且映射到按顺序的点,那么天然颜色也是从浅到深。
# 模块pyplot内置了一组颜色映射,经过设置c参数为y列表的值(这个y列表的是[1,2,3,4,5])而后利用参数cmap根据y列表的大小映射到由x_values和y_values组成的五个点从浅到深的颜色,能够看出y列表[1,2,3,4,5]分别映射到(1,1),(2,4),(3,2),(4,6),(5,5)五个点,其中(1,1)点颜色最浅,(5,5)点颜色最深。
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=40)
plt.title("Square Numbers", fontsize=24)  # 指定标题,并设置标题字体大小
plt.xlabel("Value", fontsize=14)  # 指定X坐标轴的标签,并设置标签字体大小
plt.ylabel("Square of Value", fontsize=14)  # 指定Y坐标轴的标签,并设置标签字体大小
plt.savefig("3.png", bbox_inches='tight')  # 打开matplotlib查看器,并显示绘制的图形

运行结果图以下(蓝色彗星残影):
谈谈Python实战数据可视化之matplotlib模块(基础篇)

利用pyplot模块的scatter函数绘制随机漫步图

套用书本原话来讲,随机漫步:每次行走都彻底是随机的,没有明确的方向,结果是由一系列随机决策决定的。
为了实现随机漫步,须要作如下几步就能够完成:
1.建立RandomWalk类来生成随机漫步数据
2.利用获取的随机漫步数据绘制随机漫步图
3.模拟屡次随机漫步
4.设置随机漫步图的样式
(1)建立RandomWalk类来生成随机漫步数据
在项目里建立一个random_walk.py文件,该文件代码以下:

from random import choice

# 一个生成随机漫步数据的类
class RandomWalk:
    # 默认为5000个点,表明5000步
    def __init__(self, num_points=5000):
        self.num_points = num_points
        self.x_values = [0]
        self.y_values = [0]

        # 获取随机方向和步数的乘积
    def get_step(self):
        return choice([1, -1]) * choice([0, 1, 2, 3, 4])

    def fill_walk(self):
        while len(self.x_values) < self.num_points:
                    # 获取往哪一个方向走几步
            x_step = self.get_step()
            y_step = self.get_step()

                        # 若是原地踏步则continue处理
            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)

(2)利用获取的随机漫步数据绘制随机漫步图
在项目里建立一个rw_visual.py文件,该文件代码以下:

import matplotlib.pyplot as plt
from random_walk import RandomWalk

# 建立一个RandomWalk实例,并指定走5000步
rw = RandomWalk(5000)
rw.fill_walk()  # 开始获取随机漫步数据,其实获取的是两个包含x和y值的数据点列表
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()

运行结果以下:
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(3)模拟屡次随机漫步
在rw_visual.py文件代码上加以修改,修改代码以下:

import matplotlib.pyplot as plt
from random_walk import RandomWalk

while True:
    rw = RandomWalk(5000)
    rw.fill_walk()
    plt.scatter(rw.x_values, rw.y_values,s=15)
    plt.show()

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

运行结果以下(你点击右上角关闭按钮,在PyCharm下方会弹出询问是否继续漫步):
谈谈Python实战数据可视化之matplotlib模块(基础篇)
(4)设置随机漫步图的样式
咱们将设置随机漫步图的样式,定制一个好看的随机漫步图,有给点着色、从新绘制起点和终点、隐藏坐标轴、调整尺寸以适合屏幕。

import matplotlib.pyplot as plt
from random_walk import RandomWalk

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

    plt.figure(figsize=(20, 6))
    # 颜色映射就是用列表赋值给c,而这个列表的值能够随意,大的表明颜色深,小的表明颜色浅。
    point_number = list(range(rw.num_points))  # [0-4999]
    plt.scatter(rw.x_values, rw.y_values, c=point_number, cmap=plt.cm.Blues, s=4)
    # 突出起点和终点,点变大,用不一样颜色来显示起点和终点
    plt.scatter(0, 0, c='green', s=100)
    plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', 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实战数据可视化之matplotlib模块(基础篇)

相关文章
相关标签/搜索