Python学习for数据可视化项目(一)

Python学习for数据可视化项目(一)

图片后续添加

文章目录

  • Python学习for数据可视化项目(一)
    • 1 绘制简单的折线图
    • 2.绘制折线图与散点图
      • 2.1 修改标签文字和线条粗细
      • 2.3 校正图形
      • 2.3 使用scatter()绘制散点图并设置其样式
      • 2.4 使用scatter()绘制一系列点
      • 2.5 自动计算数据
      • 2.6 删除数据点的轮廓
      • 2.7 自定义颜色
      • 2.8 使用颜色映射
      • 2.9 自动保存图标
    • 3 随机漫步
      • 3.1 创建RandomWalk()类
      • 3.2 选择方向
      • 3.3 绘制随机漫步图
      • 3.4 模拟多次随机漫步
      • 3.5 给点着色
      • 3.6 重新绘制起点和终点
      • 3.7 隐藏坐标轴
      • 3.8 增加点数
      • 3.9 调整尺寸以适合屏幕
    • 4 使用Pygal模拟掷骰子
      • 4.1 创建Die类
      • 4.2 掷骰子
      • 4.3 分析结果
      • 4.4 绘制直方图
      • 4.5 同时掷两个骰子
      • 4.6 同时掷两个面数不同的骰子

1 绘制简单的折线图

使用matplotlib绘制简单的折线图,再对其进行定制,以实现信息更丰富的数据可视化。

注:matplotlib库可通过安装在anaconda3,然后在pycharm中切换annconda编辑器调用。

import matplotlib.pyplot as plt
#导入matplotlib中的pyplt模块,并指定别名plt
squares=[1,4,9,16,25]
#用pyplt模块中的plot方法对列表进行处理
plt.plot(squares)
#打开matplotlib查看器,显示绘制图像
plt.show()

显示图为

2.绘制折线图与散点图

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

可以通过一些定制来改变显示图形的样式,提高可读性。

plot():可以用**linewidth**指定线条的粗细。

title():第一个参数为图表标题内容,可用**fontsize**指定文字大小。

xlabel():第一个参数为x轴标题,可用**fontsize**指定文字大小。

ylabel():设置y轴,同上。

tick_params():设置刻度的样式,如**axis选‘x’,’y’,‘both’来指定轴,labelsize**指定刻度数字大小。

import matplotlib.pyplot as plt

squares=[1,4,9,16,25]

plt.plot(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='x',labelsize=14)
plt.show()

2.3 校正图形

当向**plot()**提供一系列数字时,其默认第一个数据点对应的x坐标值为0。

对照上例,0对应到了1,而4对应到了25,可通过为**plot()**同时提供输入值和输出值来解决。

import matplotlib.pyplot as plt

input_value=[1,2,3,4,5]
squares=[1,4,9,16,25]

plt.plot(input_value,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='x',labelsize=14)
plt.show()

此时图表变为下图

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

绘制单个点,可使用函数**scatter(),向其传递一对x,y坐标,将在指定位置绘制一个点,实参s**设置绘制图形时使用点的尺寸:

import matplotlib.pyplot as plt

plt.scatter(2,4,s=200)
plt.title('Square 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()

2.4 使用scatter()绘制一系列点

向**scatter()**传递两个分别包含x值和y值的列表即可。

import matplotlib.pyplot as plt

x_value=[1,2,3,4,5]
y_value=[1,4,9,16,25]

plt.scatter(x_value,y_value,s=200)
plt.title('Square 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()

对应图为

2.5 自动计算数据

使用循环来生成点的坐标即可。

import matplotlib.pyplot as plt
x_value=list(range(1,1001))
y_value=[x**2 for x in x_value]

plt.scatter(x_value,y_value,s=20)
plt.title('Square 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.axis([0,1100,0,1100000])#设置每个坐标轴的取值范围
plt.show()

其中**axis()**方法要求提供四个值:x和y轴的最小值和最大值。

此时图标为

2.6 删除数据点的轮廓

matplotlib默认散点图为蓝色点和黑色轮廓。

可在scatter()方法中传递实参**edgecolor=‘color’**来消除轮廓。

plt.scatter(x_value,y_value,edgecolors='none',s=20)

2.7 自定义颜色

在**scatter()中传递参数c**,来设置使用的颜色,如:

plt.scatter(x_value,y_value,c='red',edgecolor='none',s=20)

c参数也可以用RGB颜色模式来自定义颜色。向其传递一个有3个元素的元组。元素值在0~1之间,分别表示红色、绿色、蓝色的分量,值越接近0颜色越深,反之越浅。

plt.scatter(x_value,y_value,c=(0,0,0.8),edgecolor='none',s=20)

2.8 使用颜色映射

**颜色映射(colormap)**是一系列颜色,它们从其实颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律。如可以用较浅的颜色来显示较小的值,用较深的颜色来显示较大的值。

模块pyplot内置了一组颜色映射。下面演示如何根据每个y的值来设置其颜色。

#将c设置成一个y值列表,参数cmap设置映射的颜色
plt.scatter(x_values,y_value,c=y_value,cmap=plt.cm.Blues,edgecolor='none',s=20)

将此行代码替换2.5小节中的相应代码,图标变化为:

注:可访问此处,单机Examples,向下滚动到Color Examples,选择colormaps_reference来了解所有颜色映射。

2.9 自动保存图标

使用**plt.savefig()来替代plt.show()**,即可让程序自动将图表保存到文件中。

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

第一个参数为图表的文件名,第二个实参指定将图表的空白部分裁剪,若不需要可省略。

注意:若依然要使用**plt.show()**程序显示图表,必须将_show()_放在_savefig()_语句之后。反之,保存的图片将会是一张空图片。

3 随机漫步

本节中,先生成随机漫步数据,再使用matplotlib将这些数据呈现出来。在自然界、物理、生物、化学和经济领域,随机漫步都有实际用途。

3.1 创建RandomWalk()类

在此先创建一个名为RandomWalk的类,用于生成随机漫步数据。这个类将有三个属性:随机漫步的次数,每次随机漫步的x和y坐标;还将有两个方法:__init__fill_walk(),后者用于计算随机漫步经过的所有点。

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]

3.2 选择方向

在此为类设计**fill_walk()**方法来随机生成漫步的点,需要生成:漫步的方向(上下左右),每次沿生成方向走多远。

    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
               #下一步将从上一步出发,所以将步长加上列表的最后一个值 
            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.3 绘制随机漫步图

下面使用这个类,并绘制所有点。

import matplotlib.pyplot as plt
from random_walk import RandomWalk

rw=RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
plt.show()

3.4 模拟多次随机漫步

设计一个while循环使程序可以多次运行即可。

import matplotlib.pyplot as plt
from random_walk import RandomWalk

while True:
    rw=RandomWalk()
    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

3.5 给点着色

使用颜色映射来支出漫步中点的先后顺序:传递参数**c**设置其为一个包含点顺序的列表。

并删除每个点的黑色轮廓:同前文,参数**edgecolor=‘none’**。

import matplotlib.pyplot as plt
from random_walk import RandomWalk

while True:
    rw=RandomWalk()
    rw.fill_walk()
    #使用list生成一个与点总数相同的列表
    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=15)
    plt.show()

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

3.6 重新绘制起点和终点

在这里,我们另外使用两个**scatter()**方法来重新绘制起点和终点,并将其设置得更大,显示不同颜色,以突出它们。

--sinp--
#突出起点和重点
plt.scatter(0,0,c='green',edgecolor='none',s=100)
plt.scatter(rw.x_value[-1],rw.y_value[-1],c='red',edgecolor='none',s=100)
--sinp--

3.7 隐藏坐标轴

可使用**axes()**中的来设置坐标轴的可见性,具体代码如下:

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

再将原程序加上3.7小节中的代码,此时图表为:

3.8 增加点数

在创建RandomWalk实例时增大num_points的值即可。

此时应该根据增加的数量来调整每个点的大小,使图表更加清晰。

--sinp--
#设置50000个点
rw=RandomWalk(50000)
--Sinp--
#每个点大小调整为1
plt.scatter(rw.x_value,rw.y_value,c=points_numbers,
           cmap=plt.cm.Blues,edgecolor='none',s=1)
--sinp--

此时图表如下,说实话有点酷。

3.9 调整尺寸以适合屏幕

**figure()用于指定图表的宽度、高度、分辨率和背景色。可为其形参figsize**指定一个元组,来设定绘图窗口的大小,单位为英寸。

plt.figure(figsize=(10,6))

默认屏幕分辨率为80像素/英寸。可使用形参**dpi**传递分辨率。

plt.figure(dpi=28,figsize=(10,6))

4 使用Pygal模拟掷骰子

可视化包Pygal可以生成可缩放的矢量图形文件,以方便在尺寸不同的屏幕上显示。

特别是以在线方式使用图表,可考虑用Pygal来生成,以满足在任何设备上的显示。

注:anaconda3,Python3.7版本的环境没找到这个包,切换pycharm的Python3.6编译器,安装即可。

4.1 创建Die类

一个用于模拟掷骰子的类。

from random import randint

class Die():
    #将骰子默认设为6面
    def __init__(self,num_sides=6):
        self.num_sides=num_sides
    #模拟掷骰子,随机生成1~6中的数	
    def roll(self):
        return  randint(1,self.num_sides)

4.2 掷骰子

用上小节的类创建一个6面的实例,将结果显示,并检查结果是否合理。

from die import Die

D6=Die()
results=[]
for roll_num in range(100):
    result=D6.roll()
    results.append(result)
    
print(results)

结果为

[1, 5, 4, 4, 6, 3, 6, 5, 2, 1, 1, 3, 1, 3, 2, 6, 5, 2, 3, 2, 1, 5, 3, 5, 4, 4, 4, 1, 3, 4, 1, 4, 3, 4, 6, 3, 6, 1, 1, 2, 4, 5, 3, 3, 3, 5, 3, 5, 1, 1, 5, 6, 5, 2, 5, 4, 2, 2, 1, 1, 6, 5, 1, 4, 5, 3, 6, 5, 5, 5, 5, 4, 3, 1, 1, 3, 6, 5, 4, 4, 6, 6, 1, 2, 3, 6, 6, 2, 4, 5, 6, 2, 2, 5, 3, 6, 5, 3, 6, 2]

结果中未出现1~6以外的数,无明显规律,合理。

4.3 分析结果

计算每个点数出现的次数。

#此部分与上相同,可将掷骰子次数提升到1000
#这里的die是骰子类的模块名,后文不表
from die import Die

D6=Die()
results=[]
for roll_num in range(1000):
    result=D6.roll()
    results.append(result)
print(results)
#创建一个列表来统计1~6出现的次数
frequencies=[]
for value in range(1,D6.num_sides+1):
    frequencie=results.count(value)
    frequencies.append(frequencie)

print(frequencies)

4.4 绘制直方图

用直方图来将掷骰子的结果可视化。

这里使用到pygal模块中的**Bar()**类。

import pygal

--接上小节代码--

hist=pygal.Bar()
#指定直方图标题
hist.title='Results of rolling one D6 1000 times.'
#指定直方图x轴标签
hist.x_labels=['1','2','3','4','5','6']
#指定直方图x方向标题
hist.x_title='Results'
#指定直方图y方向标题
hist.y_title='Frequency of Result'

#指定直方图的数据名称,和数据组成的列表
hist.add('D6',frequencies)
#保存直方图文件,并以参数的字符串命名
hist.render_to_file('die_visual.svg')

4.5 同时掷两个骰子

创建两个D6骰子实例,每次掷两个骰子,并将点数相加,存在列表results中。

import pygal
from die import Die
#创建两个骰子实例
d6_1=Die()
d6_2=Die()
results=[]
for roll_num in range(1000):
    #点数相加
    result=d6_1.roll()+d6_2.roll()
    results.append(result)

print(results)

frequencies=[]
max_result=d6_1.num_sides+d6_2.num_sides
#修改总点数范围
for value in range(2,max_result+1):
    frequencie=results.count(value)
    frequencies.append(frequencie)

print(frequencies)

hist=pygal.Bar()
hist.title='Results of rolling one D6 1000 times.'
#修改直方图横坐标标签
hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12']
hist.x_title='Results'
hist.y_title='Frequency of Result'
#修改直方图数据名称
hist.add('D6+D6',frequencies)
#修改直方图文件保存名称,否则会覆盖原图
hist.render_to_file('dice_visual.svg')

4.6 同时掷两个面数不同的骰子

创建一个6面骰子实例和一个10面的骰子实例,然后同时掷50000次。

import pygal
from die import Die

d6_1=Die()
#将第二个骰子面数设为10
d10=Die(10)
results=[]
#掷50000次
for roll_num in range(50000):
    result=d6_1.roll()+d10.roll()
    results.append(result)

print(results)

frequencies=[]
max_result=d6_1.num_sides+d10.num_sides
for value in range(2,max_result+1):
    frequencie=results.count(value)
    frequencies.append(frequencie)

print(frequencies)
#在以下代码中做出相应修改
hist=pygal.Bar()
hist.title='Results of rolling one D6 and one D10 50000 times.'
hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
hist.x_title='Results'
hist.y_title='Frequency of Result'

hist.add('D6+D10',frequencies)
hist.render_to_file('different_dice.svg')

你可能感兴趣的:(学习笔记)