转自 小小蒲公英 原文用 Python可视化库

现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策。那么数据有什么价值呢?用什么样的手段才能把数据的价值直观而清晰的表达出来?
答案是要提供像人眼一样的直觉的、交互的和反应灵敏的可视化环境。数据可视化将技术与艺术完美结合,借助图形化的手段,清晰有效地传达与沟通信息,直观、形象地显示海量的数据和信息,并进行交互处理。
数据可视化的应用十分广泛,几乎可以应用于自然科学、工程技术、金融、通信和商业等各种领域。下面我们基于Python,简单地介绍一下适用于各个领域的几个实用的可视化库,快速带你入门!!

1.matplotlib

Matplotlib是一个Python 2维绘图库,已经成为python中公认的数据可视化工具,通过Matplotlib你可以很轻松地画一些或简单或复杂地图形,几行代码即可生成线图、直方图、功率谱、条形图、错误图、散点图等等。
对于一些简单的绘图,特别是与IPython结合使用时,pyplot模块提供了一个matlab接口。你可以通过面向对象的接口或通过一些MATLAB的函数来更改控制行样式、字体属性、轴属性等。

  • linux系统
  • 先下载对应的安装包 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系统
  • 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',

    运行结果:

    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')

    运行结果:

    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()

    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()

    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')

    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()

    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)

    # 取样.

    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()

    运行结果(其实是动态的很炫,就是文件太大了)

            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将会是一大福音,它提供了大量图表集可供你选择与使用。