基於Python Plotly 對 MySQL 儲存資料的視覺化初步
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中,新建圖表和資料已上傳。