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

python编程之数据可视化1--生成数据

程序员文章站 2022-07-14 10:46:12
...

本文将对笔者学习的python的数据可视化方面的知识进行一个总结、梳理。本文的主要内容包括:

1.如何生成数据集以及如何对其进行可视化

2.如何使用matplotlib创建简单的图表以及如何使用散点图探索随机漫步的过程

3.如何使用Pygal来创建直方图以及如何使用直方图探索同时投掷两个六面骰子的不同结果

生成数据

1 安装matplotlib(Windows)

在Windows系统中需要先安装 Visual Studio。

接下来,需要下载matplotlib安装程序,访问http://pypi.python.org/pypi/matplotlib/,并查找与你使用的Python版本匹配的wheel文件(扩展名为.whl的文件)。

如果找不到,也可以去http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib看看,这个网站发布安装程序时间通常比matplotlib官网早。

将这个.whl文件复制到你的项目文件夹,打开一个命令窗口,并切换到该项目文件夹,在使用pip来安装matplotlib:

例如:

>cd work
python_work>python-m pip install --user matplotlib-1.43.3-cp35-none-win32.whl

随后进行测试matplotlib

C:\Users\DGQ>python
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>>

如果没有出现任何错误,就说明你的系统安装了matplotlib,可以继续啦!

2 绘制简单的折线图

使用平方序列1、4、9、16、25绘制这个图表

mpl_squares.py


import matplotlib.pyplot as plt

squares = [1,4,9,16,25]
plt.plot(squares)
#打开matplotlib查看器,并显示绘制的图形
plt.show()
python编程之数据可视化1--生成数据
图1 简单的折线图

2.1 修改标签文字和线条粗细

import matplotlib.pyplot as plt

squares = [1,4,9,16,25]
plt.plot(squares,linewidth = 5)

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

#设置刻度标记的大小
plt.tick_params(axis='both',labelsize = 14)
plt.show()
python编程之数据可视化1--生成数据
图2 修改标签文字和线条粗细

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("Squares Number",fontsize = 24)
plt.xlabel("Value",fontsize = 14)
plt.ylabel("Square of Value",fontsize = 14)

#设置刻度标记的大小
plt.tick_params(axis='both',labelsize = 14)
plt.show()
python编程之数据可视化1--生成数据
图3 校正图形

2.3 scatter()绘制散点图并设置其样式

scatter_suqares.py


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 = 10)

#设置图标标题,并给坐标轴加上标签
plt.title("Squares 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.show()
python编程之数据可视化1--生成数据
图4 多个点组成的散点图

2.5 自动计算数据

import matplotlib.pyplot as plt

x_values = list(range(1,1001))
y_values = [x**2 for x in x_values]
#edgcolor='none' 去除数据点的轮廓
plt.scatter(x_values,y_values,s = 5,edgecolor='none')

#设置图标标题,并给坐标轴加上标签
plt.title("Squares 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,1000,0,1100000])
plt.show()
python编程之数据可视化1--生成数据
图5 绘制1000个点

2.6 自定义颜色

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

plt.scatter(x_values,y_values,c='red',edgcolor='none',s=5)

或者

 

plt.scatter(x_values,y_values,c=(0,0,0.8),edgcolor='none',s=5)

值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅 

python编程之数据可视化1--生成数据
图6 修改数据点颜色

2.7 自动保存图标

将plt.show()替换为plt.savefig()

plt.savefig('squares_plot.png',bbox_inches='tight')

3 随机漫步

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

3.1 创建RandomWalk()类

random_walk.py


from  random import choice

class RandomWalk():#一个生成随机漫步数据的类
    def __init__(self,num_points=500):#初始化随机漫步的属性
        self.num_points = num_points
        #所有的随机漫步都始于(0,0)
        self.x_values = [0]
        self.y_values = [0]
    def get_step(self):
        #决定前进方向以及沿着个方向前进的距离
        x_direction = choice([1,-1])
        x_distance = choice([1,2,3,4])
        step = x_direction*x_distance
        return step

    def fill_walk(self):#计算随机漫步包含的所有点
        #不断漫步,直到列表到达指定长度
        while len(self.x_values) < self.num_points:
            x_step = self.get_step()
            y_step = self.get_step()
            #拒绝原地踏步
            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)

3.2 绘制随机漫步图

rw_visual.py


import matplotlib.pyplot as plt 

from random_work import RandomWalk
#只要程序处于活动状态,就不断的模拟随机漫步
while True:
    #创建一个RandomWalk实例,并将其包含的点绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    point_numbers = list(range(rw.num_points))
    plt.scatter(rw.x_values,rw.y_values,c =point_numbers,cmap = plt.cm.Blues,edgecolors='none' ,s =1)
    # plt.plot(rw.x_values,rw.y_values,linewidth = 1)
    #突出终点和起点
    plt.scatter(0,0,c='green',edgecolors='none',s=10)
    plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s =10)

    #隐藏坐标轴
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    plt.show()

    active = input('是否继续?(y/n)')
    if active =='n':
        break
python编程之数据可视化1--生成数据
图7 随机漫步图
python编程之数据可视化1--生成数据
图8 询问是否继续生成随机漫步

4 使用Pygal模拟掷骰子

Pygal可以生成可缩放的矢量图形文件,如果你打算以在线的方式使用图表,请考虑用Pygal生成它们,这样在任何设备上都很美观。

4.1 安装Pygal

Windows系统:

pip -m pip install --user pygal==1.7

你可能需要使用命令pip3,而不是pip,如果这还是不管用,你可能需要删除标志 --user

4.2 创建Die类

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)

4.3 掷骰子并分析结果,绘制直方图

die_visual.py


from die import Die
import pygal
#创建一个六个面的骰子
die  = Die()

#投掷几次骰子,并将结果存储在一个列表中
results = []
roll_num = 0

for roll_num in range(1,100000):
    result = die.roll()
    results.append(result)
#分析结果
frequencies = []
for value in range(1,die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)
    
#对数据可视化
hist = pygal.Bar()

hist.title = "results of rolling one D6 10000000 times"
hist.x_labels = ['1','2','3','4','5','6']
hist.x_title = 'Result'
hist.y_title = 'Frequency of Result'

hist.add('D6',frequencies)

hist.render_to_file('die_visual.svg')

python编程之数据可视化1--生成数据
图9 模拟掷骰子结果分析

注意: pygal 版本低了,会出现如下错误:

Traceback (most recent call last):
  File "d:\pythoy_lianxi\pygal\die_visual.py", line 28, in <module>
    hist.render_to_file('die_visual.svg')
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 165, in render_to_file
    f.write(self.render(is_unicode=True, **kwargs))
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 121, in render
    return (self
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 114, in make_instance
    self._last__inst = self.cls(
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\graph\bar.py", line 37, in __init__
    super(Bar, self).__init__(*args, **kwargs)
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\graph\base.py", line 47, in __init__
    self.svg = Svg(self)
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\svg.py", line 49, in __init__
    etree.ProcessingInstruction(
  File "src\lxml\etree.pyx", line 3063, in lxml.etree.ProcessingInstruction
ValueError: Invalid PI name 'b'xml''
PS D:\pythoy_lianxi\pygal>  cd 'd:\pythoy_lianxi\pygal'; & 'python' 'c:\Users\DGQ\.vscode\extensions\ms-python.python-2020.7.94776\pythonFiles\lib\python\debugpy\launcher' '58622' '--' 'd:\pythoy_lianxi\pygal\die_visual.py'
Traceback (most recent call last):
  File "d:\pythoy_lianxi\pygal\die_visual.py", line 28, in <module>
    hist.render_to_file('die_visual.svg')
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 165, in render_to_file
    f.write(self.render(is_unicode=True, **kwargs))
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 121, in render
    return (self
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\ghost.py", line 114, in make_instance
    self._last__inst = self.cls(
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\graph\bar.py", line 37, in __init__
    super(Bar, self).__init__(*args, **kwargs)
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\graph\base.py", line 47, in __init__
    self.svg = Svg(self)
  File "C:\Users\DGQ\AppData\Roaming\Python\Python38\site-packages\pygal\svg.py", line 49, in __init__
    etree.ProcessingInstruction(
  File "src\lxml\etree.pyx", line 3063, in lxml.etree.ProcessingInstruction
ValueError: Invalid PI name 'b'xml''

先卸载原来的低版本
pip uninstall pygal

安装2.4的版本
pip install --user pygal==2.4

如果是python3.6以上,或者多个python版本,将pip改为pip3

4.4 投掷两个投掷

以上掷骰子也可以试着同时掷两个骰子,下面演示投掷两个面数相同的骰子

dice_visual.py


from die import Die
import pygal
#创建2个六个面的骰子
die_1 = Die()
die_2 = Die()

#投掷几次骰子,并将结果存储在一个列表中

results = []

for roll_num in range(1,100000):
    result = die_1.roll() + die_2.roll() 
    results.append(result)

# print(results)

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 100000 times"
hist.x_labels = [str(value) for value in range(2,12)]

hist.x_title = 'Result'
hist.y_title = 'Frequency of Result'

hist.add('D6+D6',frequencies)

hist.render_to_file('dice_visual_D6.svg')

python编程之数据可视化1--生成数据
图10 两个骰子结果分析