python编程之数据可视化1--生成数据
本文将对笔者学习的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()
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()
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()
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()
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()
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,指定的颜色越浅
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
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')
注意: 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数据可视化教程之Matplotlib实现各种图表实例
-
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
-
Python数据分析:手把手教你用Pandas生成可视化图表的教程
-
Python 读取CSV文件数据并生成可视化图形
-
Python 数据可视化生成词云 WordCloud
-
python编程之数据可视化1--生成数据
-
python数据可视化自制职位分析生成岗位分析数据报表
-
Python数据可视化教程之Matplotlib实现各种图表实例
-
Python数据可视化JupyterNotebook绘图生成高清图片
-
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)