本教程的所有Python代碼可以在網上的IPython notebook中獲取。
考慮在公司里使用Plotly?可以看一下Plotly的on-premises企業版。(注:On-premises是指軟件運行在工作場所或公司內部,詳見維基百科)
注意操作系統:盡管Windows或Mac用戶也可以跟隨本文操作,但本文假定你使用的是Ubuntu系統(Ubuntu桌面版或Ubuntu服務器版)。如果你沒有Ubuntu Server,你可以通過Amazon的Web服務建立一個云平臺(閱讀這份教程的前半部分)。如果你用的是Mac,我們推薦你購買并下載VMware Fusion,在上面安裝Ubuntu桌面版。你也可以通過Zareason購買一臺便宜的預裝Ubuntu桌面版/服務器版的筆記本或服務器。
使用Python讀取MySQL的數據并繪圖很簡單,所有你需要的工具都可以免費下載。本文會展示怎么做。如果你遇到問題或者卡住了,可以給feedback@plot.ly發送郵件,也可以在本文下面評論,或者在tweeter上@plotlygraphs。
第1步:確保MySQL已安裝且在運行
首先,你需要有一臺安裝了MySQL的計算機或服務器。你可以通過以下方法檢查MySQL是否安裝:打開控制臺,輸入“mysql”,如果你收到MySQL無法連接的錯誤,這意味著MySQL安裝了,但是沒有運行。在命令行或“Terminal”中,嘗試輸入sudo /etc/init.d/mysql start并按回車來啟動MySQL。
如果MySQL沒有安裝,不要失望。在Ubuntu中下載并安裝只需一行命令:
1
|
shell> sudo apt - get install mysql - server - - fix - missing |
安裝過程中會讓你輸入一個密碼。安裝結束后,你可以在終端中鍵入以下命令進入MySQL控制臺:
1
|
shell> sudo mysql - uroot - p |
輸入“exit”就可以退出MySQL控制臺,。
本教程使用MySQL經典的“world”樣例數據庫。如果你想跟隨我們的步驟,可以在MySQL文檔中心下載world數據庫。你也可以在命令行中使用wget下載:
1
|
shell> wget http: / / downloads.mysql.com / docs / world.sql. zip |
然后解壓文件:
1
|
shell> unzip world.sql. zip |
(如果unzip沒有安裝,輸入sudo apt-get install unzip安裝)
現在需要把world數據庫導入到MySQL,啟動MySQL控制臺:
1
|
shell> sudo mysql - uroot - p |
進入控制臺后,通過以下MySQL命令使用world.sql文件創建world數據庫:
1
2
3
|
mysql> CREATE DATABASE world; mysql> USE world; mysql> SOURCE / home / ubuntu / world.sql; |
(在上面的SOURCE命令中,確保將路徑改為你自己world.sql所在目錄)。
上述操作說明摘自MySQL文檔中心。
第2步:使用Python連接MySQL
使用Python連接MySQL很簡單。關鍵得安裝python的MySQLdb包。首先需要安裝兩項依賴:
1
2
|
shell> sudo apt - get install python - dev shell> sudo apt - get install libmysqlclient - dev |
然后安裝Python的MySQLdb包:
1
|
shell> sudo pip install MySQL - python |
現在,啟動Python并導入MySQLdb。你可以在命令行或者IPython notebook中執行:
1
2
|
shell> python >>> import MySQLdb |
創建MySQL中world數據庫的連接:
1
|
>>> conn = MySQLdb.connect(host = "localhost" , user = "root" , passwd = "XXXX" , db = "world" ) |
cursor是用來創建MySQL請求的對象。
1
|
>>> cursor = conn.cursor() |
我們將在Country表中執行查詢。
第3步:Python中執行MySQL查詢
cursor對象使用MySQL查詢字符串執行查詢,返回一個包含多個元組的元組——每行對應一個元組。如果你剛接觸MySQL語法和命令,在線的MySQL參考手冊是一個很不錯的學習資源。
1
2
|
>>> cursor.execute( 'select Name, Continent, Population, LifeExpectancy, GNP from Country' ); >>> rows = cursor.fetchall() |
rows,也就是查詢的結果,是一個包含多個元組的元組,像下面這樣:
使用Pandas的DataFrame來處理每一行要比使用一個包含元組的元組方便。下面的Python代碼片段將所有行轉化為DataFrame實例:
1
2
3
4
|
>>> import pandas as pd >>> df = pd.DataFrame( [[ij for ij in i] for i in rows] ) >>> df.rename(columns = { 0 : 'Name' , 1 : 'Continent' , 2 : 'Population' , 3 : 'LifeExpectancy' , 4 : 'GNP' }, inplace = True ); >>> df = df.sort([ 'LifeExpectancy' ], ascending = [ 1 ]); |
完整的代碼可以參見IPython notebook
第4步:使用Plotly繪制MySQL數據
現在,MySQL的數據存放在Pandas的DataFrame中,可以輕松地繪圖。下面的代碼用來繪制國家GNP(國民生產總值)VS平均壽命的圖,鼠標懸停的點會顯示國家名稱。確保你已經下載了Plotly的Python庫。如果沒有,你可以參考一下它的入門指南。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import plotly.plotly as py from plotly.graph_objs import * trace1 = Scatter( x = df[ 'LifeExpectancy' ], y = df[ 'GNP' ], text = country_names, mode = 'markers' ) layout = Layout( xaxis = XAxis( title = 'Life Expectancy' ), yaxis = YAxis( type = 'log' , title = 'GNP' ) ) data = Data([trace1]) fig = Figure(data = data, layout = layout) py.iplot(fig, filename = 'world GNP vs life expectancy' ) |
完整的代碼在這份IPython notebook中。下面是作為一個iframe嵌入的結果圖:
利用Plotly的Python用戶指南中的氣泡圖教程,我們可以用相同的MySQL數據繪制一幅氣泡圖,氣泡大小表示人口的多少,氣泡的顏色代表不同的大洲,鼠標懸停會顯示國家名稱。下面顯示的是作為一個iframe嵌入的氣泡圖。
創建這個圖表以及這個博客中的所有python代碼都可以從這個IPython notebook中拷貝。