Python視覺化庫 python視覺化--matplotlib
轉自小小蒲公英原文用Python視覺化庫
現如今大資料已人盡皆知,但在這個資訊大爆炸的時代裡,空有海量資料是無實際使用價值,更不要說幫助管理者進行業務決策。那麼資料有什麼價值呢?用什麼樣的手段才能把資料的價值直觀而清晰的表達出來?
答案是要提供像人眼一樣的直覺的、互動的和反應靈敏的視覺化環境。資料視覺化將技術與藝術完美結合,藉助圖形化的手段,清晰有效地傳達與溝通訊息,直觀、形象地顯示海量的資料和資訊,並進行互動處理。
資料視覺化的應用十分廣泛,幾乎可以應用於自然科學、工程技術、金融、通訊和商業等各種領域。下面我們基於Python,簡單地介紹一下適用於各個領域的幾個實用的視覺化庫,快速帶你入門!!
1.matplotlib
Matplotlib是一個Python 2維繪相簿,已經成為python中公認的資料視覺化工具,通過Matplotlib你可以很輕鬆地畫一些或簡單或複雜地圖形,幾行程式碼即可生成線圖、直方圖、功率譜、條形圖、錯誤圖、散點圖等等。
對於一些簡單的繪圖,特別是與IPython結合使用時,pyplot模組提供了一個matlab介面。你可以通過面向物件的介面或通過一些MATLAB的函式來更改控制行樣式、字型屬性、軸屬性等。
安裝:
- linux系統
方法一:
sudo apt-get install python-dev
sudo apt-get install python-matplotlib
方法二:
pip install matplotlib
- windows系統
先下載對應的安裝包pyproj和matplotlib
開啟Anaconda Prompt,輸入安裝包所在路徑,然後分別輸入
pip install pyproj 1.9.5.1 cp36 cp36m win_amd64.whl #輸入下載的pyproj檔名
pip install matplotlib_tests‑2.1.0‑py2.py3‑none‑any.whl
- mac os系統
方法一:
pip install matplotlib
方法二:
sudo curl -O https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
快速入門
import numpy as np import matplotlib.mlab as mlab import matplotlib.pyplot as plt #產生隨機數 np.random.seed(19680801) # 定義資料的分佈特徵 mu = 100 sigma = 15 x = mu + sigma * np.random.randn(437) num_bins = 50 fig, ax = plt.subplots() n, bins, patches = ax.hist(x, num_bins, normed=1) # 新增圖表元素 y = mlab.normpdf(bins, mu, sigma) ax.plot(bins, y, '--') ax.set_xlabel('Smarts') ax.set_ylabel('Probability density') ax.set_title(r'Histogram of IQ: $\mu=100$, $\sigma=15$') # 圖片展示與儲存 fig.tight_layout() plt.savefig("Histogram.png") plt.show()
執行結果
更多matplotlib的基礎語法,可參考python視覺化--matplotlib。
2.Seaborn
Seaborn是基於matplotlib產生的一個模組,專攻於統計視覺化,可以和pandas進行無縫連結,使初學者更容易上手。相對於matplotlib,Seaborn語法更簡潔,兩者關係類似於numpy和pandas之間的關係。
安裝:
linux系統:
sudo pip install seaborn
window系統:
pip install seaborn
快速入門
import seaborn as sns sns.set(style="ticks") from matplotlib import pyplot # 載入資料集 tips = sns.load_dataset("tips") # 繪圖 sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="PRGn") sns.despine(offset=10, trim=True) #圖片展示與儲存 pyplot.savefig("GroupedBoxplots.png") pyplot.show()
執行結果:
3.HoloViews
HoloViews是一個開源的Python庫,可以用非常少的程式碼行中完成資料分析和視覺化,除了預設的matplotlib後端外,還添加了一個Bokeh後端。Bokeh提供了一個強大的平臺,通過結合Bokeh提供的互動式小部件,可以使用HTML5 canvas和WebGL快速生成互動性和高維視覺化,非常適合於資料的互動式探索。
安裝:
方法一:
pip install HoloViews
方法二:
conda install -c ioam/label/dev holoviews
方法三:
git clone git://github.com/ioam/holoviews.git
cd holoviews
pip install -e
方法四:
下載安裝(https://pypi.python.org/pypi/holoviews)
快速入門
import numpy as np
import holoviews as hv
#呼叫bokeh
hv.extension('bokeh')
#資料輸入
frequencies = [0.5, 0.75, 1.0, 1.25]
#定義曲線
def sine_curve(phase, freq):
xvals = [0.1* i for i in range(100)]
return hv.Curve((xvals, [np.sin(phase+freq*x) for x in xvals]))
# 呼叫函式,輸出影象
dmap = hv.DynamicMap(sine_curve, kdims=['phase', 'frequency'])
dmap.redim.range(phase=(0.5,1)).redim.range(frequency=(0.5,1.25))
執行結果:
4.Altair
Altair是Python的一個公認的統計視覺化庫。它的API簡單、友好、一致,並建立在強大的vega - lite(互動式圖形語法)之上。Altair API不包含實際的視覺化呈現程式碼,而是按照vega - lite規範發出JSON資料結構。由此產生的資料可以在使用者介面中呈現,這種優雅的簡單性產生了漂亮且有效的視覺化效果,且只需很少的程式碼。
資料來源是一個DataFrame,它由不同資料型別的列組成。DataFrame是一種整潔的格式,其中的行與樣本相對應,而列與觀察到的變數相對應。資料通過資料轉換對映到使用組的視覺屬性(位置、顏色、大小、形狀、面板等)。
安裝
方法一:
pip install Altair
方法二:
conda install altair --channel conda-forge
快速入門
import altair as alt
# 載入資料集
cars = alt.load_dataset('cars')
#繪圖
alt.Chart(cars).mark_point().encode(
x='Horsepower',
y='Miles_per_Gallon',
color='Origin',
)
執行結果:
5.PyQtGraph
PyQtGraph是在PyQt4 / PySide和numpy上構建的純 python的GUI圖形庫。它主要用於數學,科學,工程領域。儘管PyQtGraph完全是在python中編寫的,但它本身就是一個非常有能力的圖形系統,可以進行大量的資料處理,數字運算;使用了Qt的GraphicsView框架優化和簡化了工作流程,實現以最少的工作量完成資料視覺化,且速度也非常快。
卡片的背景色需要調出佈局工具欄來設定
每個卡片都可以巢狀插入圖片或其它模板
安裝
方法一
pip install PyQtGraph
方法二
下載安裝(http://www.pyqtgraph.org/)
快速入門
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
#建立一個繪圖區
win = pg.plot()
win.setWindowTitle('pyqtgraph example: FillBetweenItem')
win.setXRange(-10, 10)
win.setYRange(-10, 10)
#曲線
N = 200
x = np.linspace(-10, 10, N)
gauss = np.exp(-x**2 / 20.)
mn = mx = np.zeros(len(x))
curves = [win.plot(x=x, y=np.zeros(len(x)), pen='k') for i in range(4)]
brushes = [0.5, (100, 100, 255), 0.5]
fills = [pg.FillBetweenItem(curves[i], curves[i+1], brushes[i]) for i in range(3)]
for f in fills:
win.addItem(f)
def update():
global mx, mn, curves, gauss, x
a = 5 / abs(np.random.normal(loc=1, scale=0.2))
y1 = -np.abs(a*gauss + np.random.normal(size=len(x)))
y2 = np.abs(a*gauss + np.random.normal(size=len(x)))
s = 0.01
mn = np.where(y1<mn, y1, mn) * (1-s) + y1 * s
mx = np.where(y2>mx, y2, mx) * (1-s) + y2 * s
curves[0].setData(x, mn)
curves[1].setData(x, y1)
curves[2].setData(x, y2)
curves[3].setData(x, mx)
#時間軸
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(30)
#啟動Qt
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
執行結果:
6.ggplot
ggplot是基於R的ggplot2和圖形語法的Python的繪圖系統,實現了更少的程式碼繪製更專業的圖形。
它使用一個高階且富有表現力的API來實現線,點等元素的新增,顏色的更改等不同型別的視覺化元件的組合或新增,而不需要重複使用相同的程式碼,然而這對那些試圖進行高度定製的的來說,ggplot並不是最好的選擇,儘管它也可以製作一些非常複雜、好看的圖形。
ggplot與pandas緊密聯絡。如果你打算使用ggplot,最好將資料儲存在DataFrames中。
安裝:
linux系統
pip install numpy
pip install scipy
pip install statsmodels
pip install ggplot
window系統
下載ggplot安裝包(https://www.lfd.uci.edu/~gohlke/pythonlibs/#ggplot)
然後執行
pip install ggplot‑0.11.5‑py2.py3‑none‑any.whl
快速入門
from ggplot import *
ggplot(aes(x='date', y='beef', ymin='beef - 1000', ymax='beef + 1000'), data=meat) + \
geom_area() + \
geom_point(color='coral')
執行結果:
7.Bokeh
Bokeh是一個Python互動式視覺化庫,支援現代化web瀏覽器展示(圖表可以輸出為JSON物件,HTML文件或者可互動的網路應用)。它提供風格優雅、簡潔的D3.js的圖形化樣式,並將此功能擴充套件到高效能互動的資料集,資料流上。使用Bokeh可以快速便捷地建立互動式繪圖、儀表板和資料應用程式等。
Bokeh能與NumPy,Pandas,Blaze等大部分陣列或表格式的資料結構完美結合。
安裝:
方法一:如果有配置anaconda的話使用以下命令(推薦)
conda install bokeh
方法二:
pip install numpy
pip install pandas
pip install redis
pip install bokeh
快速入門
from bokeh.plotting import figure, output_file, show
# 建立圖
p = figure(plot_width=300, plot_height=300, tools="pan,reset,save")
# 畫圓
p.circle([1, 2.5, 3, 2], [2, 3, 1, 1.5], radius=0.3, alpha=0.5)
# 定義輸出檔案格式
output_file("foo.html")
# 圖片展示
show(p)
執行結果:
8.pygal
pygal是一種開放標準的向量圖形語言,它基於XML(Extensible Markup Language),可以生成多個輸出格式的高解析度Web圖形頁面,還支援給定資料的html表匯出。使用者可以直接用程式碼來描繪影象,可以用任何文書處理工具開啟SVG影象,通過改變部分程式碼來使影象具有互動功能,並且可以插入到HTML中通過瀏覽器來觀看。
安裝:
linux系統
pip install pygal
window系統
命令類似於
python -m pip install --user pygal==1.7
mac os系統
命令類似於
方法一:
pip install --user pygal==1.7
方法二:
pip install git+https://github.com/vispy/vispy.git
快速入門
import pygal
#宣告圖表型別
bar_chart = pygal.StackedBar()
#繪圖
bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
bar_chart.add('Padovan', [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12])
#儲存圖片
bar_chart.render_to_png('bar1.png')
執行結果:
9.VisPy
VisPy是一個用於互動式科學視覺化的Python庫,快速、可伸縮、且易於使用,是一個高效能的互動式2維, 3維資料視覺化庫,利用了現代圖形處理單元(gpu)的計算能力,通過OpenGL庫來顯示非常大的資料集。
安裝
pip install VisPy
快速入門
from vispy.plot import Fig
#呼叫類(Fig)
fig = Fig()
#建立PlotWidget
ax_left = fig[0, 0]
ax_right = fig[0, 1]
#繪圖
import numpy as np
data = np.random.randn(2, 3)
ax_left.plot(data)
ax_right.histogram(data[1])
執行結果
10.NetworkX
NetworkX是一個Python包,用於建立、操縱和研究複雜網路的結構、以及學習複雜網路的結構、功能及其動力學。
NetworkX提供了適合各種資料結構的圖表、二合字母和多重圖,還有大量標準的圖演算法,網路結構和分析措施,可以產生隨機網路、合成網路或經典網路,且節點可以是文字、影象、XML記錄等,並提供了一些示例資料(如權重,時間序列)。
NetworkX測試的程式碼覆蓋率超過90%,是一個多樣化,易於教學,能快速生成圖形的Python平臺。
安裝
方法一:
pip install networkx
方法二:
下載安裝(https://pypi.python.org/pypi/networkx/2.0)
快速入門
import matplotlib.pyplot as plt
import networkx as nx
import numpy.linalg
#生成隨機數
n = 1000
m = 5000
G = nx.gnm_random_graph(n, m)
#定義資料分佈特徵
L = nx.normalized_laplacian_matrix(G)
e = numpy.linalg.eigvals(L.A)
#繪圖並顯示
plt.hist(e, bins=100)
plt.xlim(0, 2)
plt.show()
執行結果
11.Plotly
Plotly的Python graphing library在網上提供了互動式的、公開的,高質量的圖表集,可與R、python、matlab等軟體對接。它擁有在別的庫中很難找到的幾種圖表型別,如等值線圖,樹形圖和三維圖表等,圖示型別也十分豐富,申請了API金鑰後,可以一鍵將統計圖形同步到雲端。但美中不足的是,開啟國外網站會比較費時,且一個賬號只能建立25個圖表,除非你升級或刪除一些圖表。
安裝:
pip install plotly
簡單入門
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[1.5, 1, 1.3, 0.7, 0.8, 0.9]
)
trace2 = go.Bar(
x=[0, 1, 2, 3, 4, 5],
y=[1, 0.5, 0.7, -1.2, 0.3, 0.4]
)
data = [trace1, trace2]
py.iplot(data, filename='bar-line')
執行結果
12.geoplotlib
Basemap和Cartopy包支援多個地理投影,並提供一些視覺化效果,包括點圖、熱圖、等高線圖和形狀檔案。PySAL是一個由Python編寫的空間分析函式的開源庫,它提供了許多基本的工具,主要用於形狀檔案。但是,這些庫不允許使用者繪製地圖貼圖,並且對自定義視覺化、互動性和動畫的支援有限。
geoplotlib是python的一個用於地理資料視覺化和繪製地圖的工具箱,並提供了一個原始資料和所有視覺化之間的基本介面,支援在純python中開發硬體加速的互動式視覺化,並提供點對映、核心密度估計、空間圖、泰森多邊形圖、形狀檔案和許多更常見的空間視覺化的實現。除了為常用的地理資料視覺化提供內建的視覺化功能外,geoplotlib還允許通過定義定製層來定義複雜的資料視覺化(繪製OpenGL,如分數、行和具有高效能的多邊形),建立動畫。
安裝:
pip install geoplotlib
快速入門
from geoplotlib.layers import DelaunayLayer
import geoplotlib
from geoplotlib.utils import read_csv, BoundingBox
data = read_csv('data/bus.csv')
geoplotlib.delaunay(data, cmap='hot_r')
geoplotlib.set_bbox(BoundingBox.DK)
geoplotlib.set_smoothing(True)
geoplotlib.show()
執行結果
13.folium
folium是一個建立在Python系統之上的js庫,可以很輕鬆地將在Python中操作的資料視覺化為互動式的單張地圖,且將緊密地將資料與地圖聯絡在一起,可自定義箭頭,網格等HTML格式的地圖示記。該庫還附有一些內建的地形資料。
安裝
方法一:
pip install folium
方法二:
conda install folium
方法三:
下載安裝(https://pypi.python.org/pypi/folium/0.5.0)
快速入門
import folium
#確定經緯度
m = folium.Map(location=[45.5236, -122.6750])
m
執行結果
14.Gleam
Gleam允許你只利用Python構建資料的互動式,生成視覺化的網路應用。無需具備HTML CSS或JaveScript知識,就能使用任一種Python視覺化庫控制輸入。當你建立一個圖表的時候,你可以在上面加上一個域,讓任何人都可以實時地玩轉你的資料,讓你的資料更通俗易懂。
安裝:
pip install Gleam
快速入門
from wtforms import fields
from ggplot import *
from gleam import Page, panels
#定義繪圖函式
class ScatterInput(panels.InputPanel):
title = fields.StringField(label="Title of plot:")
yvar = fields.SelectField(label="Y axis",
choices=[("beef", "Beef"),
("pork", "Pork")])
smoother = fields.BooleanField(label="Smoothing Curve")
class ScatterPlot(panels.PlotPanel):
name = "Scatter"
def plot(self, inputs):
p = ggplot(meat, aes(x='date', y=inputs.yvar))
if inputs.smoother:
p = p + stat_smooth(color="blue")
p = p + geom_point() + ggtitle(inputs.title)
return p
class ScatterPage(Page):
input = ScatterInput()
output = ScatterPlot()
#執行
ScatterPage.run()
執行結果
15.vincent
Vincent是一個很酷的視覺化工具,它以Python資料結構作為資料來源,然後把它翻譯成Vega視覺化語法,並且能夠在d3js上執行。這讓你可以使用Python指令碼來建立漂亮的3D圖形來展示你的資料。Vincent底層使用Pandas和DataFrames資料,並且支援大量的圖表—-條形圖、線圖、散點圖、熱力圖、堆條圖、分組條形圖、餅圖、圈圖、地圖等等。
安裝
pip install Vincent
快速入門
import vincent
bar = vincent.Bar(multi_iter1['y1'])
bar.axis_titles(x='Index', y='Value')
bar.to_json('vega.json')
執行結果
16.mpld3
mpld3基於python的graphing library和D3js,彙集了Matplotlib流行的專案的JavaScript庫,用於建立web互動式資料視覺化。通過一個簡單的API,將matplotlib圖形匯出為HTML程式碼,這些HTML程式碼可以在瀏覽器內使用。
安裝
方法一:
pip install mpld3
方法二:
下載安裝(https://pypi.python.org/pypi/mpld3)
快速入門
import matplotlib.pyplot as plt
import numpy as np
import mpld3
from mpld3 import plugins
fig, ax = plt.subplots()
x = np.linspace(-2, 2, 20)
y = x[:, None]
X = np.zeros((20, 20, 4))
X[:, :, 0] = np.exp(- (x - 1) ** 2 - (y) ** 2)
X[:, :, 1] = np.exp(- (x + 0.71) ** 2 - (y - 0.71) ** 2)
X[:, :, 2] = np.exp(- (x + 0.71) ** 2 - (y + 0.71) ** 2)
X[:, :, 3] = np.exp(-0.25 * (x ** 2 + y ** 2))
im = ax.imshow(X, extent=(10, 20, 10, 20),
origin='lower', zorder=1, interpolation='nearest')
fig.colorbar(im, ax=ax)
ax.set_title('An Image', size=20)
plugins.connect(fig, plugins.MousePosition(fontsize=14))
mpld3.show()
執行結果
17.python-igraph
Python介面的igraph高效能圖形庫,主要針對複雜的網路研究和分析。
安裝
方法一:
pip install python-igraph
方法二:
下載安裝(https://pypi.python.org/pypi/python-igraph)
快速入門
from igraph import *
layout = g.layout("kk")
plot(g, layout = layout)
執行結果
18.missingno
沒有高質量的資料,就沒有高質量的資料探勘結果,當我們做監督學習演算法,難免會碰到混亂的資料集,缺失的值,當缺失比例很小時,可直接對缺失記錄進行捨棄或進行手工處理,missingno提供了一個小型的靈活的、易於使用的資料視覺化和實用工具集,用影象的方式讓你能夠快速評估資料缺失的情況,而不是在資料表裡面步履維艱。你可以根據資料的完整度對資料進行排序或過濾,或者根據熱度圖或樹狀圖來考慮對資料進行修正。
missingno 是基於matplotlib建造的一個模組,所以它出圖速度很快,並且能夠靈活的處理pandas資料。
安裝:
方法一:
pip install missingno
方法二:
下載安裝(https://pypi.python.org/pypi/missingno/)
快速入門
import missingno as msno
import pandas as pd
import pandas_datareader.data as web
import numpy as np
p=print
save_loc = '/YOUR/PROJECT/LOCATION/'
logo_loc = '/YOUR/WATERMARK/LOCATION/'
# get index and fed data
f1 = 'USREC' # recession data from FRED
start = pd.to_datetime('1999-01-01')
end = pd.datetime.today()
mkt = '^GSPC'
MKT = (web.DataReader([mkt,'^VIX'], 'yahoo', start, end)['Adj Close']
.resample('MS') # month start b/c FED data is month start
.mean()
.rename(columns={mkt:'SPX','^VIX':'VIX'})
.assign(SPX_returns=lambda x: np.log(x['SPX']/x['SPX'].shift(1)))
.assign(VIX_returns=lambda x: np.log(x['VIX']/x['VIX'].shift(1)))
)
data = (web.DataReader([f1], 'fred', start, end)
.join(MKT, how='outer')
.dropna())
p(data.head())
p(data.info())
msno.matrix(data)
執行結果
19.Mayavi2
Mayavi2是一個通用的、跨平臺的三維科學資料視覺化工具。可以在二維和三維空間中顯示標量、向量和張量資料。可通過自定義源、模組和資料過濾器輕鬆擴充套件。Mayavi2也可以作為一個繪圖引擎,生成matplotlib或gnuplot指令碼,也可以作為其他應用程式的互動式視覺化的庫,將生成的圖片嵌入到其他應用程式中。
安裝
pip install mayavi
快速入門
import numpy
from mayavi import mlab
def lorenz(x, y, z, s=10., r=28., b=8. / 3.):
"""The Lorenz system."""
u = s * (y - x)
v = r * x - y - x * z
w = x * y - b * z
return u, v, w
# 取樣.
x, y, z = numpy.mgrid[-50:50:100j, -50:50:100j, -10:60:70j]
u, v, w = lorenz(x, y, z)
fig = mlab.figure(size=(400, 300), bgcolor=(0, 0, 0))
# 用合適的引數畫出軌跡的流動.
f = mlab.flow(x, y, z, u, v, w, line_width=3, colormap='Paired')
f.module_manager.scalar_lut_manager.reverse_lut = True
f.stream_tracer.integration_direction = 'both'
f.stream_tracer.maximum_propagation = 200
# 提取特徵並繪製
src = f.mlab_source.m_data
e = mlab.pipeline.extract_vector_components(src)
e.component = 'z-component'
zc = mlab.pipeline.iso_surface(e, opacity=0.5, contours=[0, ],
color=(0.6, 1, 0.2))
# 背景設定
zc.actor.property.backface_culling = True
# 圖片展示
mlab.view(140, 120, 113, [0.65, 1.5, 27])
mlab.show()
執行結果(其實是動態的很炫,就是檔案太大了)
20.Leather
Leather一種可讀且使用者介面友好的API,新手也能快速掌握。影象成品非常基礎,適用於所有的資料型別,針對探索性圖表進行了優化,產生與比例無關的SVG圖,這樣在你調整影象大小的時候就不會損失影象質量
安裝
方法一:
pip install leather
方法二:
下載安裝(http://leather.readthedocs.io/en/latest/index.html)
快速入門
import csv
import leather
with open('gii.csv') as f:
reader = csv.reader(f)
next(reader)
data = list(reader)[:10]
for row in data:
row[1] = float(row[1]) if row[1] is not None else None
chart = leather.Chart('Data from CSV reader')
chart.add_bars(data, x=1, y=0)
chart.to_svg('csv_reader.svg')
執行結果:
結論
在 Python 中,將資料視覺化有多種選擇,因此何時選用何種方案才變得極具挑戰性。
如果你想做一些專業的統計圖表,我推薦你使用Seaborn,Altair;
數學,科學,工程領域的學者就選擇PyQtGraph,VisPy,Mayavi2;
網路研究和分析方面,NetworkX,python-igraph會是一個不錯的選擇。
地理投影就選geoplotlib,folium;
評估資料缺失就選missingno;
有了HoloViews再也不用為高維圖形犯愁;
如果你不喜歡花俏的修飾,那就選擇Leather。
如果你是一名新手但有MATLAB基礎,matplotlib會很好上手;有R基礎的就選ggplot;
如果你是新手或懶癌晚期者,Plotly將會是一大福音,它提供了大量圖表集可供你選擇與使用。