Python数据可视化:基于Bokeh的可视化绘图(txt+pdf+epub+mobi电子书下载)


发布时间:2021-03-03 04:16:49

点击下载

作者:屈希峰

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python数据可视化:基于Bokeh的可视化绘图

Python数据可视化:基于Bokeh的可视化绘图试读:

前言

为何写作本书

2019年5月,PYPL(编程语言流行指数,基于Google搜索频率而定)出炉了编程语言排行榜,Python位列第一,成为当下最流行的编程语言之一。TIOBE排行榜也显示,Python的流行度屡创新高,目前排名第四,并保持高速增长。作为大数据和人工智能时代的必备语言,Python具有语言简洁、开发效率高、可移植性强等优点,经过多年的生态建设,Python有了大量的函数库,尤其在数据分析和科学计算领域。另外,函数在Python中是一等公民,所以Python同时也是一种函数式编程语言。

互联网的快速发展为我们积累了庞大的数据,计算机硬件的创新为存储与分析这些数据创造了硬件条件,编程语言的发展为分析这些数据创造了软件条件。在数据分析这个领域,Python有着自身独特的优势,简单易用的特性与强大的开源模块的支持使其成为数据分析领域方便好用的利器。

Python在数据分析领域的广泛应用离不开强大的开源模块的支持,大名鼎鼎的NumPy、Scipy、Statsmodels、Pandas等模块的建立与发展奠定了Python在数据分析领域的重要地位。这些模块简单又好用,提供的解决方案能够满足绝大部分业务需求。在人工智能领域,Python也有非常棒的解决方案,如Sklearn、XGBoost、TensorFlow、MXNet、Theano、Caffe等都是非常好的开源模块。尤其在人工智能中前沿的深度学习领域,Python几乎占据了霸主的地位。Python借助在数据分析领域中开源模块的优势,在量化投资领域逐渐占据了领头羊的地位。

对数据的分析离不开数据的可视化,相对于在数据分析、人工智能、量化投资等领域中的发展,Python在数据可视化方面的发展有些滞后。最经典的Python可视化绘图库莫过于Matplotlib。Matplotlib就是MATLAB+Plot+Library,即模仿MATLAB的绘图库,其绘图风格与MATLAB类似。由于MATLAB的绘图风格偏古典,为了绘出更漂亮的图像,Python开源社区开发出了Seaborn绘图模块,它本质上是对Matplotlib的封装,绘图效果更符合现代人的审美。尽管如此,由于Matplotlib是基于GUI的绘图模块,所以也存在特有的缺陷。

就笔者的使用经验而言,Matplotlib主要存在两大缺陷:首先,Matplotlib是一个静态的绘图模块,其绘制的图像都是静态的,就像用软件打开图片一样,无法实现Web绘图的交互效果;其次,Matplotlib绘图结果分享极其不便,只能以图片的方式分享,读者看到的绘图结果完全是静态的,分享体验较差。至于Python其他绘图模块,诸如GGplot2、Plotly、Pyecharts等都比较小众,而Bokeh集成在Anaconda中,在笔者创作本书的过程中,Bokeh在GitHub上的Stars已经超过了Matplotlib。

Bokeh是一个基于D3.js的绘图库,所以其绘图结果可以与Web应用无缝衔接,在实现与读者交互的同时,便于分享、传播。其次,Bokeh有着自己强大又丰富的绘图库,提供了优雅、简洁的多功能图形绘制方法,在超大数据集或流式数据集上具有高性能的交互性,且与Python(或其他语言)的交互快速而简单。

笔者从2014年开始学习Python,主要将其用于传统行业数据分析,2016年初尝Bokeh便被其深深吸引。然而,Bokeh官方的文档为英文,且不符合国人的绘图习惯,因此我希望尽自己的微薄之力,将近年所知、所学进行归纳、整理,若读者能从中感悟一二,并将其用于工作实践,将是本书和本人之福!读者对象(1)大数据分析人员

毫无疑问,大数据分析人员是本书的核心受众群体之一,本书与其他可视化的书籍不同,本着“Talk is cheap,show me your code”的原则,尽可能言简意赅、深入浅出,以代码实现各种图表。数据可视化作为整个数据分析过程的最后一环,好的数据展示效果,往往会让数据分析结果更为生动、更具说服力。

另外,本书中代码未过多涉及复杂的数据预处理和分析技巧,着重讲述不同图表的绘制方法,以便于大数据分析人员进行重构,书中代码基本上可以即拿即用,从而节约宝贵时间用在数据清洗和分析探索上。(2)企业管理运营人员

市面上各式各样的BI系统都非常成熟,如数据分析、图表的拖拽等,即使零编程基础的用户都可以做出像模像样的可视化图表或数据看板。然而,如果涉及产品、市场等核心敏感数据时,则不得不招兵买马,组建团队,以期实现企业专属的数据可视化系统,如业务中台、数据中台、营销中台等。此时,不可避免地要考虑到开发成本问题,Bokeh可以与Flask、Django等完美结合,用最小的成本实现企业数据全网实时、动态展示;在中小型公司中,如果无须联网仅内部使用,则无须服务器建站,可直接使用Bokeh sever展示,并通过局域网实现内部分享。(3)IT转型人员

随着互联网的发展,数据分析团队的成员分工也变得更细,专精于数据可视化系统开发的人才也会愈加受到重视。而且,在Bokeh数据可视化领域没有复杂的算法,仅需具备一些Web前端和Python编程基础知识即可。(4)大中专院校学生及科研人员

本书符合国内读者的阅读习惯,书中的可视化图表也可供大中专院校学生及科研人员进行论文写作、实际工作时使用。主要内容

本书共分为5章,各章主要内容如下:

第1章介绍一些准备工作,包括Anaconda的安装方法、运行环境,以及绘图的主要方法。

第2章主要介绍基本图形的绘制,即对Bokeh中一些常见的基础图形,如线形图、柱状图、饼图、气泡图和直方图等进行介绍。

第3章主要介绍数据类型与转换,包括对Bokeh所需的常见数据类型进行的介绍。

第4章主要介绍视图属性,包括Bokeh图形配色、画布属性及绘图工具,图形显示方式和输出方式,用控件进行数据交互的方法。

第5章主要介绍Web动态可视化。熟悉Web开发的读者可以在任意前端框架下嵌入图形。

如果仅对Bokeh的基础绘图感兴趣,那么前4章的内容就能满足你的需求;如果你有一定的Web开发基础,那么可以参考第5章的内容,实现Web数据可视化。

本书代码下载:https://github.com/yeayee/bokeh。致谢

感谢机械工业出版社华章公司的编辑杨福川、张锡鹏对本书出版所付出的努力。同时,感谢妻子及女儿对我的包容,使我在工作之余,有精力完成本书的整理、撰写工作。

谨以此书献给和我一样仍在前沿技术中摸索前行的朋友们!屈希峰第1章 准备工作

Python的编译器有十余种,可以用在不同的开发项目中,如Pycharm多用于Web开发,Anaconda多用于数据分析,其集成的Jupyter Notebook更是Windows平台下数据分析者的不二之选。本章将简要介绍Anaconda的安装以及Bokeh的一些基本概念,最后通过一个散点图说明Bokeh绘图的基本流程。1.1 安装Anaconda

Anaconda是跨平台的,有Windows、MacOS、Linux多个版本,在官网www.anaconda.com下载与电脑系统对应版本,一路默认安装即可。以Win10对应版本为例,安装过程如图1-1所示。图1-1 Anaconda安装

较新版本的Anaconda已经集成了Bokeh库,按Win+R运行CMD,执行:conda list

如果没有Bokeh库或者Bokeh的版本低于1.1.0,则需要重装或更新。为Anaconda添加国内镜像源,以便快速下载安装:conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

安装库(可覆盖更新),按Win+R运行CMD,执行:conda install bokeh=1.1.01.2 运行Jupyter Notebook

Win+R运行CMD,执行:jupyter notebook --notebook-dir=工作文件夹绝对路径

推荐扩展,nb_conda用来管理虚拟环境,如图1-2所示;jupyter_contrib_nbextensions包含各种NB的插件,如图1-3所示。conda install nb_conda图1-2 Anaconda nb_conda扩展安装conda install -c conda-forge jupyter_contrib_nbextensions

Jupyter notebook的使用技巧以及上述插件的说明可以自行搜索,如使用“*?”及“?”等魔法命令可以事半功倍。图1-3 Jupyter_contrib_nbextensions扩展安装1.3 基本概念

1.词条说明

为了更好地使用Bokeh,先了解几个基本的词条用途,如表1-1所示。表1-1 Bokeh的基本词条用途

2.主要接口

Bokeh的主要功能接口及其用途如表1-2所示,如果读者对Photoshop了解,那么Bokeh中的layouts、plotting、palettes、io、settings就可以与Photoshop的图层、画笔、调色板、保存、设置相对应,而models接口则是实现不同形状画笔的原始方法。表1-2 Bokeh的主要接口及其用途【注】 Bokeh.charts高阶接口,快速绘图。该接口在0.12.3版本后取消。

3.bokeh.models绘图

bokeh.models是实现基本绘制图形的基础,如下所示。“bokeh.models.glyphs.Line”是glyphs(父类)下面的一个子类(Python类的继承),这些子类在实践过程中很少用到,仅在实现一些较为复杂的图形时才可能用到。* :class:`~bokeh.models.glyphs.AnnularWedge` * :class:`~bokeh.models.glyphs.Oval`* :class:`~bokeh.models.glyphs.Annulus` * :class:`~bokeh.models.glyphs.Patch`* :class:`~bokeh.models.glyphs.Arc` * :class:`~bokeh.models.glyphs.Patches`* :class:`~bokeh.models.glyphs.Bezier` * :class:`~bokeh.models.glyphs.Quad`* :class:`~bokeh.models.glyphs.Ellipse` * :class:`~bokeh.models.glyphs.Quadratic`* :class:`~bokeh.models.glyphs.HBar` * :class:`~bokeh.models.glyphs.Ray`* :class:`~bokeh.models.glyphs.HexTile` * :class:`~bokeh.models.glyphs.Rect`* :class:`~bokeh.models.glyphs.Image` * :class:`~bokeh.models.glyphs.Segment`* :class:`~bokeh.models.glyphs.ImageRGBA` * :class:`~bokeh.models.glyphs.Step`* :class:`~bokeh.models.glyphs.ImageURL` * :class:`~bokeh.models.glyphs.Text`* :class:`~bokeh.models.glyphs.Line` * :class:`~bokeh.models.glyphs.VBar`* :class:`~bokeh.models.glyphs.MultiLine` * :class:`~bokeh.models.glyphs.Wedge`* :class:`~bokeh.models.glyphs.MultiPolygons`

4.bokeh.plotting绘图

与bokeh.models不同,bokeh.plotting类中的figure()类在实例化后,提供了各种基本图形的绘制方法,虽然在Python中“万法皆对象”,但是建议对Python不太熟悉的读者先要清楚类与方法调用的基本方式,本书中的代码示例未用到类的继承等。(1)figure(**kwargs)方法(函数)*`~bokeh.plotting.figure.Figure.annular_wedge` ~bokeh.plotting.figure.Figure.multi_polygons`*:func:`~bokeh.plotting.figure.Figure.annulus` *:func:`~bokeh.plotting.figure.Figure.oval`*:func:`~bokeh.plotting.figure.Figure.arc` *:func:`~bokeh.plotting.figure.Figure.patch`*:func:`~bokeh.plotting.figure.Figure.asterisk` *:func:`~bokeh.plotting.figure.Figure.patches`*:func:`~bokeh.plotting.figure.Figure.bezier` *:func:`~bokeh.plotting.figure.Figure.quad`*:func:`~bokeh.plotting.figure.Figure.circle` *:func:`~bokeh.plotting.figure.Figure.quadratic`*:func:`~bokeh.plotting.figure.Figure.circle_cross` *:func:`~bokeh.plotting.figure.Figure.ray`*:func:`~bokeh.plotting.figure.Figure.circle_x` *:func:`~bokeh.plotting.figure.Figure.rect`*:func:`~bokeh.plotting.figure.Figure.cross` *:func:`~bokeh.plotting.figure.Figure.segment`*:func:`~bokeh.plotting.figure.Figure.dash` *:func:`~bokeh.plotting.figure.Figure.square`*:func:`~bokeh.plotting.figure.Figure.diamond` `~bokeh.plotting.figure.Figure.square_cross`~bokeh.plotting.figure.Figure.diamond_cross` *:func:`~bokeh.plotting.figure.Figure.square_x`*:func:`~bokeh.plotting.figure.Figure.ellipse` *:func:`~bokeh.plotting.figure.Figure.step`*:func:`~bokeh.plotting.figure.Figure.hbar` *:func:`~bokeh.plotting.figure.Figure.text`*:func:`~bokeh.plotting.figure.Figure.hex` *:func:`~bokeh.plotting.figure.Figure.triangle`*:func:`~bokeh.plotting.figure.Figure.hex_tile` *:func:`~bokeh.plotting.figure.Figure.vbar`*:func:`~bokeh.plotting.figure.Figure.image` *:func:`~bokeh.plotting.figure.Figure.wedge`*:func:`~bokeh.plotting.figure.Figure.image_rgba` *:func:`~bokeh.plotting.figure.Figure.x`*:func:`~bokeh.plotting.figure.Figure.image_url` *:func:`~bokeh.plotting.figure.Figure.scatter``~bokeh.plotting.figure.Figure.inverted_triangle` *:func:`~bokeh.plotting.figure.Figure.hbar_stack`*:func:`~bokeh.plotting.figure.Figure.line` *:func:`~bokeh.plotting.figure.Figure.vbar_stack`*:func:`~bokeh.plotting.figure.Figure.multi_line` *:func:`~bokeh.plotting.figure.Figure.hexbin`(2)figure(**kwargs)属性

figure()类在实例化后,除了上述方法之外,还有下面这些属性。这些属性既可以在figure类实例化过程中作为参数进行预定义,也可以在实例化之后,直接对实例的属性进行赋值。'above' 'left' 'outline_line_join''align' 'lod_factor' 'outline_line_width''aspect_ratio' 'lod_interval' 'output_backend''aspect_scale' 'lod_threshold' 'plot_height''background' 'lod_timeout' 'plot_width''background_fill_alpha' 'margin' 'renderers''background_fill_color' 'match_aspect' 'right''below' 'max_height' 'sizing_mode''border_fill_alpha' 'max_width' 'subscribed_events''border_fill_color' 'min_border' 'tags''center' 'min_border_bottom' 'title''css_classes' 'min_border_left' 'title_location''disabled' 'min_border_right' 'toolbar''extra_x_ranges' 'min_border_top' 'toolbar_location''extra_y_ranges' 'min_height' 'toolbar_sticky''frame_height' 'min_width' 'visible''frame_width' 'name' 'width''height' 'outer_height' 'width_policy''height_policy' 'outer_width' 'x_range''hidpi' 'outline_line_alpha' 'x_scale''inner_height' 'outline_line_cap' 'y_range''inner_width' 'outline_line_color' 'y_scale''js_event_callbacks' 'outline_line_dash''js_property_callbacks' 'outline_line_dash_offset'

5.下载数据集

可通过以下代码下载数据集。1. import bokeh2. bokeh.sampledata.download()

下载本书源码,将“bokeh_database\data”文件夹中的数据复制到上面命令Bokeh默认的下载文件夹中,如果是Windows系统则一般在“C:\Users\用户名\.bokeh\data\”。

6.绘图步骤

本书代码展示部分尽可能简明扼要,需要解释的地方都会在代码中注释。使用Bokeh进行绘图的一般步骤如下:

·展示方式

·准备数据

·画布基本属性

·绘图

·画布其他属性(可选)

·显示或保存

代码示例如下所示。1. # 导入库 2. from bokeh.plotting import figure, output_notebook, show3. output_notebook() # 在notebook中显示4. # 数据 5. x = [1, 2, 3, 4, 5]6. y = [6, 7, 2, 4, 5]7. # 画布:尺寸8. p = figure(plot_width=400, plot_height=400)9. # 绘图:设定点的坐标、大小、颜色、透明度 10. p.circle(x, y, size=20, color="navy", alpha=0.5) # 圆11. # 显示12. show(p)

运行结果如图1-4所示。图1-4 上述代码运行结果

上述代码包含了图形(散点图)的基本绘制流程,读者在下面章节的学习代码时,需要着重学习绘图方法,如第10行代码;至于绘图的其他属性和显示方式,随着代码学习量的增加,自然可以掌握。第2章 绘制基本图形

Bokeh的绘图类似于Photoshop,由基本的图形、图层组成复杂的可视化图形。本章将从易到难循序渐进讲述这些基本的图形绘制方法,其中,部分视图属性、交互式展示的方法可提前进行了解,后续章节会进一步讲述。2.1 绘图方法

figure(**kwargs)对象提供多种绘图方法(见1.3节),而这些方法的实现大都基于Bokeh.models接口。本节将展示些基本图形的绘制方法。代码示例 2-11. import numpy as np 2. from bokeh.layouts import gridplot 3. # 数据 4. N = 9 5. x = np.linspace(-2, 2, N) 6. y = x**2 7. sizes = np.linspace(10, 20, N) 8. xpts = np.array([-.09, -.12, .0, .12, .09]) 9. ypts = np.array([-.1, .02, .1, .02, -.1]) 10. # 画布列表 11. figures = [] 12. p = figure(title="annular_wedge") 13. p.annular_wedge(x, y, 10, 20, 0.6, 4.1, color="#8888ee", 14. inner_radius_units="screen", outer_radius_units="screen") 15. figures.append(p) 16. p = figure(title="annulus") 17. p.annulus(x, y, 10, 20, color="#7FC97F", 18. inner_radius_units="screen", outer_radius_units = "screen") 19. figures.append(p) 20. p = figure(title="arc") 21. p.arc(x, y, 20, 0.6, 4.1, 22. radius_units="screen", color="#BEAED4", line_width=3) 23. figures.append(p) 24. p = figure(title="bezier") 25. p.bezier(x, y, x+0.2, y, x+0.1, y+0.1, x-0.1, y-0.1, 26. color="#D95F02", line_width=2) 27. figures.append(p) 28. p = figure(title="circle") 29. p.circle(x, y, radius=0.1, color="#3288BD") 30. figures.append(p) 31. p = figure(title="ellipse") 32. p.ellipse(x, y, 15, 25, angle=-0.7, color="#1D91C0", 33. width_units="screen", height_units="screen") 34. figures.append(p) 35. p = figure(title="line") 36. p.line(x, y, color="#F46D43") 37. figures.append(p) 38. p = figure(title="multi_line") 39. p.multi_line([xpts+xx for xx in x], [ypts+yy for yy in y], color="#8073AC", line_width=2) 40. figures.append(p) 41. p = figure(title="multi_polygons") 42. p.multi_polygons([[[xpts*2+xx, xpts+xx]] for xx in x], [[[ypts*3+yy, ypts+yy]] for yy in y], color="#FB9A99") 43. figures.append(p) 44. p = figure(title="oval") 45. p.oval(x, y, 15, 25, angle=-0.7, color="#1D91C0", 46. width_units="screen", height_units="screen") 47. figures.append(p) 48. p = figure(title="patch") 49. p.patch(x, y, color="#A6CEE3") 50. figures.append(p) 51. p = figure(title="patches") 52. p.patches([xpts+xx for xx in x], [ypts+yy for yy in y], color="#FB9A99") 53. figures.append(p) 54. p = figure(title="quad") 55. p.quad(x, x-0.1, y, y-0.1, color="#B3DE69") 56. figures.append(p) 57. p = figure(title="quadratic") 58. p.quadratic(x, y, x+0.2, y, x+0.1, y+0.1, color="#4DAF4A", line_width=3) 59. figures.append(p) 60. p = figure(title="ray") 61. p.ray(x, y, 45, -0.7, color="#FB8072", line_width=2) 62. figures.append(p) 63. p = figure(title="rect") 64. p.rect(x, y, 10, 20, color="#CAB2D6", width_units="screen", height_units="screen") 65. figures.append(p) 66. p = figure(title="segment") 67. p.segment(x, y, x-0.1, y-0.1, color="#F4A582", line_width=3) 68. figures.append(p) 69. p = figure(title="square") 70. p.square(x, y, size=sizes, color="#74ADD1") 71. figures.append(p) 72. p = figure(title="wedge") 73. p.wedge(x, y, 15, 0.6, 4.1, radius_units="screen", color="#B3DE69") 74. figures.append(p) 75. p = figure(title="circle_x") 76. p.scatter(x, y, marker="circle_x", size=sizes, color="#DD1C77", fill_ color=None) 77. figures.append(p) 78. p = figure(title="triangle") 79. p.scatter(x, y, marker="triangle", size=sizes, color="#99D594", line_width=2) 80. figures.append(p) 81. p = figure(title="circle") 82. p.scatter(x, y, marker="o", size=sizes, color="#80B1D3", line_width=3) 83. figures.append(p) 84. p = figure(title="cross") 85. p.scatter(x, y, marker="cross", size=sizes, color="#E6550D", line_width=2) 86. figures.append(p) 87. p = figure(title="diamond") 88. p.scatter(x, y, marker="diamond", size=sizes, color="#1C9099", line_width=2) 89. figures.append(p) 90. p = figure(title="inverted_triangle") 91. p.scatter(x, y, marker="inverted_triangle", size=sizes, color="#DE2D26") 92. figures.append(p) 93. p = figure(title="square_x") 94. p.scatter(x, y, marker="square_x", size=sizes, color="#FDAE6B", 95. fill_color=None, line_width=2) 96. figures.append(p) 97. p = figure(title="asterisk") 98. p.scatter(x, y, marker="asterisk", size=sizes, color="#F0027F", 99. line_width=2) 100. figures.append(p) 101. p = figure(title="square_cross") 102. p.scatter(x, y, marker="square_cross", size=sizes, color="#7FC97F", 103. fill_color=None, line_width=2) 104. figures.append(p) 105. p = figure(title="diamond_cross") 106. p.scatter(x, y, marker="diamond_cross", size=sizes, color="#386CB0", 107. fill_color=None, line_width=2) 108. figures.append(p) 109. p = figure(title="circle_cross") 110. p.scatter(x, y, marker="circle_cross", size=sizes, color="#FB8072", 111. fill_color=None, line_width=2) 112. figures.append(p) 113. # 网格展示 114. show(gridplot(figures, ncols=4, plot_width=200, plot_height=200))

运行结果如图2-1和图2-2所示。图2-1 代码示例2-1运行结果(1)图2-2 代码示例2-1运行结果(2)

代码示例2-1展示了Bokeh figure()类的30种基本图元绘制方法,灵活地使用这些方法,可以绘制出各式各样的复杂图形,其中,有些图形可以用不同的基本图元实现,读者在学习过程中可以做不同的尝试。代码示例 2-21. from bokeh.sampledata.iris import flowers 2. from bokeh.transform import factor_cmap, factor_mark 3. # 鸢尾花品种及分类标记 4. SPECIES = ['setosa', 'versicolor', 'virginica'] 5. MARKERS = ['hex', 'circle_x', 'triangle'] 6. # 画布 7. p = figure(title = "Iris Morphology", background_fill_color="#fafafa") 8. # 绘图 9. p.scatter("petal_length", "sepal_width", source=flowers, legend="species", fill_alpha=0.4, size=12, 10. marker=factor_mark('species', MARKERS, SPECIES), 11. color=factor_cmap('species', 'Category10_3', SPECIES)) 12. # 其他 13. p.xaxis.axis_label = 'Petal Length' 14. p.yaxis.axis_label = 'Sepal Width' 15. # 显示 16. show(p)

运行结果如图2-3所示。图2-3 代码示例2-2运行结果

代码示例2-2以散点图展示了机器学习中大名鼎鼎的鸢尾花数据集的分类结果。在2.2节中,我们可以看到circle的方法和scatter方法均可以实现散点图的绘制。本节着重了解figure()类的常用基本属性。

figure(**kwargs)常用基本属性。

'plot_height':400(画布高度<像素>,默认值400)

'plot_width':400

'renderers':[GlyphRenderer(id='1037',...)](自定义渲染数据)

'x_range':DataRange1d(id='1003',...)(x轴范围)

'x_scale':LinearScale(id='1007',...)(x轴刻度比例)

'y_range':DataRange1d(id='1005',...)(y轴范围)

'y_scale':LinearScale(id='1009',...)(y轴刻度比例)

'title':Title(id='1040',...)(标题)

'toolbar':Toolbar(id='1027',...)(工具栏)2.2 散点图

1.概述

散点图(Scatter)又称散点分布图,是以一个变量为横坐标,另一个变量为纵坐标,利用散点(坐标点)的分布形态反映变量统计关系的一种图形。特点是能直观表现出影响因素和预测对象之间的总体关系趋势。优点是能通过直观醒目的图形方式反映变量间关系的变化形态,以便决定用何种数学表达方式来模拟变量之间的关系。散点图不仅可传递变量间关系类型的信息,还能反映变量间关系的明确程度。

通过观察散点图数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。数据的相关关系大体上可以分为:正相关(两个变量值同时增长)、负相关(一个变量值增加,另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如图2-4所示。那些离点集群较远的点我们称之为离群点或者异常点。

在Python体系中,可使用Scipy、Statsmodels或Sklearn等对离散点进行回归分析,归纳现有数据并进行预测分析。对于那些变量之间存在密切关系,但是这些关系又不像数学公式和物理公式那样能够精确表达的,散点图是一种很好的图形工具,可以进行直观展示,如图2-5所示。但是在分析过程中需要注意,变量之间的相关性并不等同于确定的因果关系,仍需要考虑其他影响因素。图2-4 散点数据的相关性图2-5 散点数据拟合(线性)

2.实例

散点图代码示例如下所示。代码示例 2-31. # 数据 2. x = [1, 2, 3, 4, 5] 3. y = [6, 7, 2, 4, 5] 4. # 画布:尺寸 5. p = figure(plot_width=400, plot_height=400) 6. # 画图 7. p.scatter(x, y, 8. size=20, # screen units 显示器像素单位 9. # radius=1, # data-space units 坐标轴单位 10. marker="circle", color="navy", alpha=0.5) 11. # p.circle(x, y, size=20, color="navy", alpha=0.5) 12. # 显示 13. show(p)

运行结果如图2-6所示。图2-6 代码示例2-3运行结果

代码示例2-3中第7行使用scatter方法进行散点图绘制;第11行采用circle方法进行散点图绘制(推荐)。关于这两个方法的参数说明如下。

p.circle(x,y,**kwargs)参数说明。

x(str or seq[float]):离散点的x坐标,列名或列表

y(str or seq[float]):离散点的y坐标

size(str or list[float]):离散点的大小,屏幕像素单位

marker(str,or list[str]):离散点标记类型名称或名称列表

color(color value,optional):填充及轮廓线的颜色

source(`~bokeh.models.sources.ColumnDataSource`):Bokeh专属数据格式

**kwargs:其他自定义属性;其中标记点类型marker默认值为:“marker="circle"”,可以用“radius”定义圆的半径大小(单位为坐标轴单位)。这在Web数据化中非常有用,不同的方式,在不同的设备上的展示效果会有些许差异。

p.scatter(x,y,**kwargs)参数说明。

x(:class:`~bokeh.core.properties.NumberSpec`):x坐标

y(:class:`~bokeh.core.properties.NumberSpec`):y坐标

angle(:class:`~bokeh.core.properties.AngleSpec`):旋转角度

angle_units(:class:`~bokeh.core.enums.AngleUnits`):(default:'rad')默认:弧度,也可以采用度('degree')

fill_alpha(:class:`~bokeh.core.properties.NumberSpec`):(default:1.0)填充透明度,默认:不透明

fill_color(:class:`~bokeh.core.properties.ColorSpec`):(default:'gray')填充颜色,默认:灰色

line_alpha(:class:`~bokeh.core.properties.NumberSpec`):(default:1.0)轮廓线透明度,默认:不透明

line_cap:(:class:`~bokeh.core.enums.LineCap`):(default:'butt')线端(帽)

line_color(:class:`~bokeh.core.properties.ColorSpec`):(default:'black')轮廓线颜色,默认:黑色

line_dash(:class:`~bokeh.core.properties.DashPattern`):(default:[])虚线

line_dash_offset(:class:`~bokeh.core.properties.Int`):(default:0)虚线偏移

line_join(:class:`~bokeh.core.enums.LineJoin`):(default:'bevel')

line_width(:class:`~bokeh.core.properties.NumberSpec`):(default:1)线宽,默认:1

另外,Bokeh中的一些属性,如`~bokeh.core.properties.NumberSpec`、`~bokeh.core.properties.ColorSpec`可以在Jupyter notebook中通过`import bokeh.core.properties.NumberSpec`导入该属性,然后再查看其详细的使用说明。代码示例 2-41. # 数据 2. N = 4000 3. x = np.random.random(size=N) * 100 # 随机点x坐标 4. y = np.random.random(size=N) * 100 # 随机点y坐标 5. radii = np.random.random(size=N) * 1.5 # 随机半径 6. # 工具条 7. TOOLS="hover,crosshair,pan,wheel_zoom,box_zoom,reset,tap,save,box_select,poly_select,lasso_select" 8. # RGB颜色,画布1,绘图1 9. colors2 = ["#%02x%02x%02x" % (int(r), int(g), 150) for r, g in zip(50+2*x, 30+2*y)] 10. p1 = figure(width=300, height=300, tools=TOOLS) 11. p1.scatter(x,y, radius=radii, fill_color=colors2, fill_alpha=0.6, line_color=None) 12. # RGB颜色,画布2,绘图2 13. colors2 = ["#%02x%02x%02x" % (150, int(g), int(b)) for g, b in zip(50+2*x, 30+2*y)] 14. p2 = figure(width=300, height=300, tools=TOOLS) 15. p2.scatter(x,y, radius=radii, fill_color=colors2, fill_alpha=0.6, line_color=None) 16. # 直接显示 17. # show(p1) 18. # show(p2) 19. # 网格显示 20. from bokeh.layouts import gridplot 21. grid = gridplot([[p1, p2]]) 22. show(grid)

运行结果如图2-7所示。图2-7 代码示例2-4运行结果

代码示例2-4中第11行和第15行使用scatter方法进行散点图绘制。第7行工具条中的不同工具定义,第9行数据点的不同颜色定义,第20行和第21行采用网格显示图形,可以提前了解这些技巧,具体使用方法在下文中会专门进行介绍。代码示例 2-51. from bokeh.sampledata.iris import flowers 2. # 配色 3. colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'} 4. colors = [colormap[x] for x in flowers['species']] 5. # 画布 6. p = figure(title = "Iris Morphology") 7. # 绘图 8. p.circle(flowers["petal_length"], flowers["petal_width"], 9. color=colors, fill_alpha=0.2, size=10) 10. # 其他 11. p.xaxis.axis_label = 'Petal Length' 12. p.yaxis.axis_label = 'Petal Width' 13. # 显示 14. show(p)

运行结果如图2-8所示。

代码示例2-5再次对前面提到的鸢尾花的数据集进行分析,图2-8中x轴为花瓣长度,y轴为花瓣宽度,据此可以将该散点数据聚类为3类。同时,该段代码展示了常规图形的绘制流程,含x、y轴的标签。图2-8 代码示例2-5运行结果代码示例 2-61. from bokeh.layouts import column, gridplot 2. from bokeh.models import BoxSelectTool, Div 3. # 数据 4. x = np.linspace(0, 4*np.pi, 100) 5. y = np.sin(x) 6. # 工具条 7. TOOLS = "wheel_zoom,save,box_select,lasso_select,reset" 8. # HTML代码 9. div = Div(text=""" 10.

Bokeh中的画布可通过多种布局方式进行显示;

11.

通过配置参数BoxSelectTool,在图中用鼠标选择数据,采用不同方式进行交互。

12. """) # HTML代码直接作为一个图层显示,也可以作为整个HTML文档 13. # 视图属性 14. opts = dict(tools=TOOLS, plot_width=350, plot_height=350) 15. # 绘图1 16. p1 = figure(title="selection on mouseup", **opts) 17. p1.circle(x, y, color="navy", size=6, alpha=0.6) 18. # 绘图2 19. p2 = figure(title="selection on mousemove", **opts) 20. p2.square(x, y, color="olive", size=6, alpha=0.6) 21. p2.select_one(BoxSelectTool).select_every_mousemove = True 22. # 绘图3 23. p3 = figure(title="default highlight", **opts) 24. p3.circle(x, y, color="firebrick", alpha=0.5, size=6) 25. # 绘图4 26. p4 = figure(title="custom highlight", **opts) 27. p4.square(x, y, color="navy", size=6, alpha=0.6, 28. nonselection_color="orange", nonselection_alpha=0.6) 29. # 布局 30. layout = column(div, 31. gridplot([[p1, p2], [p3, p4]], toolbar_location="right"), 32. sizing_mode="scale_width") # sizing_mode 根据窗口宽度缩放图像 33. # 绘图 34. show(layout)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载