Pyhon提供强大的可视化工具,除matplotlib外,pandas、seaborn、ggplot、bokeh、pygal、plotly都具有强大的可视功能(http://www.thebigdata.cn/YeJieDongTai/30555.html),根据不同的数据、平台要求选择适当的工具进行可视化能较大程度地展示python的强大功能。个人认为plotly功能强大,且其适合web端的展现,并提供js库,能生产具有交互性的图表,非常值得学习。并且,笔者近日入了MySQL的坑,对于一众diaosi来说,MySQL大部分功能免费,相比于Oracle的昂贵价格和MS SQL Server根植于MS的特性,MySQL不仅免费,而且开源,模块的改进简单,而且在千万级别数据量时性能并不太亚于MS SQL Server,是一款值得入手的开源数据库软件。本文的目的,就是希望通过Plotly的Python接口,对MySQL数据库中的数据进行可视化。
第一部分: MySQL 与 Python 之间的连接
MySQL 与 Python 之间的连接通过MySQL-python实现。笔者假定终端已经安装好Python2.7及以上,并能基于easy_install 或pip进行第三方库的安装。打开cmd,定位到D:\Program Files(x86)\python2_7_11\Scripts(笔者电脑安装的为python2.7.11),命令行输入pip install MySQL-python,即可安装这个包。不过,可能会出现一点安装问题,尽管baidu、Stackoverflow、oschina、csdn搜索了一大堆资料,还是未能解决。因此,采用第二大杀器——Python第三方库安装文件集锦(http://www.lfd.uci.edu/~gohlke/pythonlibs/),搜索MySQL-python,根据电脑系统选择对应的安装文件(后缀为.whl)下载,笔者下载的是MySQL_python-1.2.5-cp27-none-win32.whl。在cmd中输入pip install C:\Users\Liuph\Desktop\MySQL_python-1.2.5-cp27-none-win32.whl,后者为文件路径和文件名。
安装好之后通过import MySQLdb即可实现连接。
第二部分:在Python中调用Plotly包
同理,pip install plotly。安装好之后,需要前往plotly官网(https://plot.ly)注册一个账号并获取秘钥。
在Python中引用,import plotly。当然,可以将plotly的三个模块都加载:
import plotly.plotly as py
import plotly.graph_objs as go
import plot.tools as tls
第三部分:向MySQL中存储数据
本文以简单的数据为例,介绍MySQL创建数据库、数据表和插入数据的方法:
打开cmd,输入mysql -uroot -p,再输入密码,表示以root用户名登录数据库。
创建名为t 的数据库
CREATE DATABESE t;
SHOW CREATE DATABASE t;可查看数据库t的属性,可以修改数据库的编码,例如ALTER DATABASE t CHARACTER SET utf8;
创建关系表
CREATE TABLE score(
id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL UNIQUE,
gender VARCHAR(10) NOT NULL,
grade SMALLINT UNSIGNED NOT NULL,
ratio FLOAT UNSIGNED NOT NULL
);
SHOW COLUMNS FROM score;可以查看关系表的结构。
插入新的数据记录
INSERT score VALUES (1,'Alen','girl',85,0.68),(2,'Bob','boy',76,0.73),(3,'Cindy','girl',89,0.96),(4,'David','boy',63,0.35),(5,'Frank','boy',83,0.94);
SELECT * FROM score;
以上语句的执行结果如下图所示:
第四部分: 在Python中查询MySQL的数据并调用Plotly进行数据渲染
# -*- coding: utf-8 -*-
# Author: Liuph
# Date: 28 Jul, 2016
# Version: 1.1
import plotly
import plotly.graph_objs
import MySQLdb
#print py.get_credentials()
#tls.set_credentials_file(username='liuph', api_key='jmvqrktxw9')
try:
#连接数据库t
conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="t", charset="utf8")
print "Conection success!\n"
cur = conn.cursor()
cur.execute('SELECT gender, grade, ratio FROM score')
rows = cur.fetchall()
x_data = []
y_data = []
gender = []
colors = []
for row in rows:
gender.append(row[0]) #性别
x_data.append(row[1]) #成绩
y_data.append(row[2]) #出席率
if(row[0] == 'boy'): #根据性别设置scatter的颜色
colors.append('rgb(93, 164, 214)')
else:
colors.append('rgb(255, 65, 54)')
data = [
{
'x': x_data,
'y': y_data,
'mode': 'markers',
'marker': {
'color':colors,
'size': x_data
}
}
]
plotly.offline.plot(data, filename='grade_ratio.html') #本地
plotly.plotly.iplot(data, filename='g_r') #上传至web
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
结果图:
同时,在http://plot.ly的my chart中,新建图表和数据已上传。