Py学习  »  Python

强推这个绝美的交互式图表 Python 库 -- D3Blocks

数据STUDIO • 8 月前 • 280 次点击  


用 Python 创建交互式、独立、可共享且视觉美观的图表确实是一项挑战。解决方案是 D3blocks!它基于 D3 JavaScript 的图形处理引擎构建,但可使用 Python 进行配置,并且只需一行代码即可完成!

D3Blocks 中的交互式图表
D3Blocks 中的交互式图表

Python 是用于分析和可视化数据的最流行的编程语言之一。可视化是项目成功的关键,因为它可以揭示隐藏的见解并加深你的理解。快速理解和解释数据的最佳方法是使其具有交互性。然而,这同时也是一个真正的挑战,因为尽管 Python 中有许多可视化包,但创建美观、独立、可交互、可共享且可在外部运行的图表仍然很困难。一种解决方案是使用 JavaScript 创建 D3 图表,但这种方法也带来了一系列挑战。D3Blocks应运而生。

有了 D3Blocks,Python 终于与 D3.js 实现了融合,从而轻松构建令人惊叹的可视化效果。D3Blocks是一个轻量级的开源框架,包含 15 个精美的图表,你只需要 Python 即可最终输出是一个可在任何浏览器中运行的 HTML 文件,使共享和发布变得轻而易举在这文中,云朵君将介绍 D3Blocks,并通过实际示例向你讲解其核心模块。

为什么要使用 D3.js

近年来,Python 社区开发了一系列精美可视化库,例如Matplotlib[1]Seaborn[2]Bokeh[3]Plotly[4]Folium[5] 等等。一些库还允许图形具有交互性,但在这种情况下,它们仍然需要 Python 或其他 Web 服务才能保持运行。d3 的优势在于其高性能、可深度定制的图表,并且符合 Web 标准。名称“D3”是 Data-D rivenDocuments的缩写,它是一个用于生成动态交互式数据可视化的 JavaScript 库。它速度快、交互性强、外观精美,并且你可以完全根据自己的意愿进行自定义。

最后,最重要的是,除了浏览器之外,你不需要任何其他技术来绘制图形。这使得它易于在网站上共享,而且可共享。D3也称为D3.js或d3js。我将交替使用这些名称。

D3 采用 Web 标准,让你能够充分利用现代浏览器的功能,而无需依赖专有框架。它允许你将强大的可视化组件与数据驱动的方法相结合,并且只需使用 HTML、SVG 和 CSS 即可实现。—— d3js.org[6]

使用 D3Blocks 可以非常轻松地创建 D3.js 图表。

我刚才提到了 D3 的优点,但它也存在一些缺点。首先,要将你的创意转化为 D3.js 图表,你需要熟悉 SVG、HTML、CSS 和 JavaScript。但即使你熟悉这些,D3.js 图表也可能无法轻松地跨不同数据集进行推广。换句话说,D3.js 脚本通常是静态脚本,经过优化以显示特定数据集的结果。更改数据集通常需要更改各种参数,例如轴的最小/最大值、列名,以及很可能还需要更改图表的方向和位置。

所有图表都通过 D3Blocks 完整封装到单个 HTML 文件中。你只需一个网页浏览器即可轻松共享、发布和嵌入图表。

借助 D3Blocks,我们通过将数据处理成适合下游 D3.js 脚本的格式来克服这些挑战。此外,所有必需的参数(列)命名、格式、定位、方向等也都已传递。通过这种方式,我们可以充分利用两者的优势:Python 用于数据处理、预处理、分析和建模,D3.js 用于可视化。D3Blocks 中提供了多种图表供你使用。让我们跳到下一节,看看有哪些图表!

D3Blocks 的图表!

D3Blocks 中的每个图表都包含两个主要部分:Python 部分和 D3.js 部分。Python 部分用于开发人员加载数据集、设置配置以及指定图表参数。而 D3.js 部分则以自动处理不同数据集以及用户定义属性的方式开发。最终输出是由D3Blocks生成的 HTML 文件,其中自动封装了图表所需的D3库。D3Blocks图表涵盖以下类别,安装 pip 后即可使用,无需安装任何其他程序!

要创建交互式 d3.js 图表,只需 pip install D3Blocks 即可。无需安装任何其他程序!

# 从 Pypi 安装库
pip install d3blocks
  1. 关系可视化:五种图表可用于探索实体之间的连接、流程和关联。
  2. 层次关系:可视化层次关系。
  3. 基于时间的可视化:可视化随时间变化的趋势、变化和运动。
  4. 成像和比较:以交互方式比较或探索图像数据。
  5. 统计和分布可视化:了解数据中的模式、变化和分布。

五张图表呈现关系

关系定义为一个项目与一个或多个其他项目相连接。这使我们能够探索实体之间的连接、流动和关联。关系包含 源值目标值,并且在可用的情况下,可以赋予边强度的权重。请参阅下方代码块,了解带有权重的源-目标数据框的示例。

# 加载库
from d3blocks import D3Blocks 

# 导入示例
df = d3.import_example( 'energy' ) 

"""
+---------------------------+---------------------+--------+
|         Source            |        Target       | Weight |
+---------------------------+---------------------+--------+
| Agricultural 'waste'      | Bio-conversion      | 124.73 |
| Bio-conversion            | Liquid              |  0.597 |
| Bio-conversion            | Losses              | 26.862 |
| Bio-conversion            | Solid               | 280.32 |
| Bio-conversion            | Gas                 | 81.144 |
| ...                       | ...                 |  ...   |
| Thermal generation        | District heating    | 79.329 |
| Tidal                     | Electricity grid    |  9.452 |
| UK land based bioenergy   | Bio-conversion      | 182.01 |
| Wave                      | Electricity grid    | 19.013 |
| Wind                      | Electricity grid    | 289.37 |
+---------------------------+---------------------+--------+
"""

有很多方法可以在数据集中存储关系,例如邻接矩阵(一种对称的方阵)或关联矩阵[7](用于编码顶点对的关系)。无论矩阵的形式如何,绘制关系图都有助于更好地理解数据。例如,它可以揭示进化模式,其中节点在代表不同阶段的两个或多个组中重复出现。在这种情况下,弦图桑基图是理想的关系表示方法。或者,也可以存在源到端的模式,即从某个点开始,以可能的中间步骤结束。在这种情况下,网络图会很有用。另一方面,当交互数量很大并且诸如网络之类的图变得像巨大的毛球一样时, 热图就变得非常有用。对于所有这四种图表,输入数据保持一致,并且需要一个包含源、目标和权重列的数据框。D3Blocks 库可以创建以下关系图表:

  • 网络图(d3graph)→实体网络
  • 弹性图 →带集群的实体网络
  • 桑基图→流程图
  • 和弦→循环关系图
  • 热图→相关矩阵

在接下来的部分中,我将使用包含 68 个列关系(参见上面的代码块)的能源数据集[8]来创建图表。

1.网络图

借助D3Graph模块,我们可以使用 D3 力导向图绘制网络交互。在代码段 1中,我们加载能量数据集,然后使用 d3graph 模块分析数据。节点根据 Louvain 聚类启发式算法着色,边宽基于权重。现在可以以交互方式探索网络(图 1),其中可以根据边强度(使用位于顶部的滑块)断开边。这样可以保持最强的连接节点完好无损。

#加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 
# 导入示例
df = d3.import_example('energy'
# 使用默认
d3.d3graph(df, filepath='d3graph.html', color= 'cluster', showfig=True)
图 1. D3graph 图
图 1. D3graph 图

能源数据集的交互式网络图。节点采用 Louvain 算法聚类方法着色,边大小基于输入权重。可以使用顶部的滑块根据边权重拆分网络。

# 自定义图表

# 节点属性存储在此处:
d3.D3graph.node_properties 
# 节点属性存储在此处:
d3.D3graph.edge_properties 

# 像这样更改节点属性:
d3.D3graph.set_node_properties(color=None)
d3.D3graph.node_properties['Solar']['size']=30
d3.D3graph.node_properties['Solar']['color']='#FF0000'
d3.D3graph.node_properties['Solar']['edge_color']='#000000'
d3.D3graph.node_properties['Solar']['edge_size']=5

# 进行更改后,使用 show() 再次显示图表
d3.D3graph.show() 

# 像这样更改边属性:
d3.D3graph.set_edge_properties(directed= True , marker_end= 'arrow' ) 

# 进行更改后,使用 show() 再次显示图表
d3.D3graph.show()

网络图可以通过各种输入参数进行自定义。更多详情请参阅3graph文档页面[9]

2.弹性图表

弹性图表与网络图表类似,但更高级。它允许你使用 D3 力导向图和交互式聚类来绘制网络交互。当节点下有一个或多个子节点按层级结构排列时,每个节点都可以展开或折叠。

它分为两个步骤:第一次单击节点显示节点上的边数,第二次单击展开所有与其相连的子节点。这允许你快速放大特定区域并分解信息。请参阅下面的代码块来创建图表。同样,所有信息都封装在一个 HTML 文件中,你可以根据需要共享或嵌入。

# 加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 
# 导入示例
df = d3.import_example( 'energy' ) 
# 创建图表
d3.elasticgraph( df , filepath=  'elastic.html' )
图 2. 弹性图表
图 2. 弹性图表

使用弹性图表绘制的能源数据集交互式网络图。节点自动着色。网络可根据用户点击进行扩展和分组。

图表可以通过各种输入参数进行自定义。更多详情请参阅elasticgraph文档页面[10]

3.桑基图

桑基图是一种可视化图表,用于显示从一组值到另一组值的流动。矩形框表示节点,箭头的宽度与流速成正比。桑基图最适合用于显示多对多关系或发现贯穿一组阶段的多条路径。例如,流量如何从网站的起始页面流向其他页面。为了演示,我将使用能源数据集作为桑基图块的输入。

#加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 
# 导入示例
df = d3.import_example( 'energy' ) 
# 创建图表
d3.sankey(df, filepath= 'sankey.html' )
图 3. 使用默认参数的能源数据集桑基图
图 3. 使用默认参数的能源数据集桑基图

桑基图可以通过各种输入参数进行自定义。更多详情请参阅Sankey.文档页面[11]

4. 和弦图

弦图可以可视化多个实体或节点之间的流动或连接。每个实体由圆形布局外部的一个片段表示。然后,在每个实体之间绘制弧线。弧线的大小与流动的重要性成正比。

# 加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 
# 导入示例
df = d3.import_example('energy'
# 创建图表
d3.chord(df, filepath='chord.html')
图 4. 使用默认参数的能量数据集的弦图
图 4. 使用默认参数的能量数据集的弦图

和弦图可以通过各种输入参数进行自定义。更多详情请参阅Chord文档页面[12]

5.热图

热图能够更直观地呈现矩阵。要创建此图表,我们首先需要安装 clusteval 库,它可以自动处理聚类技术。我将使用stormofswords 数据集,因为它包含更复杂的连接。运行代码块后,我们可以交互式地查看热图。

# 需要安装 clusteval 来处理聚类方法。
!pip install clusteval
# 加载库
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 导入示例
df = d3.import_example('stormofswords'

# 创建图表
d3.heatmap(df, filepath='heatmap.html')

图 5. 使用默认参数的 Stormfords 数据集热图

图表可以通过各种输入参数进行自定义。更多详情请参阅Heatmap文档页面[13]

三个图表可视化嵌套关系

层级可视化用于表示具有嵌套关系的数据。在这种情况下,每个项目都连接到一个父级,形成树状结构。与基本关系图(上一节)中简单的一对一或多对一连接不同,层级图表注重深度,使用户能够探索类别或实体如何细分为子类别。

层次结构通常由父子关系定义,其中每个子节点只有一个父节点(根节点除外)。你可以选择为每个节点附加权重或大小, 以指示重要性、频率或量级。换句话说,其输入与网络图相同。这类图表在可视化复杂系统、组织结构或部分与整体关系方面特别有效。D3Blocks 中提供以下层次结构图表

  • 树状图层次结构图
  • 树形图分层嵌套矩形图
  • 圆形填充分层嵌套圆形图

这些可视化有助于揭示数据中的模式,例如优势、不平衡或隐藏的子结构。当你的目标不仅仅是探索关系,而是了解数据如何在多个层级上组织、分组和分布时,它们尤其有用。

6.树形图

树形图以经典的分支布局呈现层级结构。它非常适合表示分类法、家谱和组织结构。

#加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 

# 导入示例
df = d3.import_example( 'energy' ) 

# 创建图表
d3.tree(df, filepath= 'tree.html' )
图 6. 使用默认参数的 Energy 数据集树状图
图 6. 使用默认参数的 Energy 数据集树状图

图表可以通过各种输入参数进行自定义。更多详情请参阅Tree文档页面[14]

7. 树状图

树形图将分层数据可视化为一组嵌套的矩形,其中每个矩形的面积对应一个定量值。这种布局在比较部分与整体时尤其有用。

# 加载库
from d3blocks import D3Blocks
# 初始化
d3 = D3Blocks() 

# 导入示例
df = d3.import_example('energy' ) 

# 创建图表
d3.treemap(df, filepath='treemap.html')
图 7. 使用默认参数的能源数据集树状图
图 7. 使用默认参数的能源数据集树状图

图表可以通过各种输入参数进行自定义。更多详情请参阅 Treemap文档页面[15]

8. 圆环填充图

圆环填充图将层级数据显示为嵌套的圆圈,高效利用空间,同时在视觉上保留层级结构。它是一种视觉上引人入胜的树状图替代方案,通常用于需要更宽松结构的情况。

# 加载库
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 导入示例
df = d3.import_example('energy'

# 创建图表
d3.circlepacking(df, filepath='circlepacking.html')
图 8. 使用默认参数的能源数据集的 Circlepacking 图
图 8. 使用默认参数的能源数据集的 Circlepacking 图

图表可以通过各种输入参数进行自定义。更多详情请参阅Circlepacking文档页面[16]

基于时间的可视化图

基于时间的可视化使我们能够探索值或状态如何随时间演变。这些图表有助于揭示在静态数据集中难以解读的趋势、模式或序列。D3Blocks 提供了两种专门的可视化功能来捕捉时间数据的不同方面:TimeSeries MovingBubbles

每个数据集都datetime需要一个包含值的列。分析连续趋势时,请选择“TimeSeries”;可视化顺序状态或事件流时,请选择“MovingBubbles”。两者都能提供对时间相关数据的独特洞察,具体取决于你想要追踪值的变化还是动态变动。我们将在以下部分中了解它们的工作原理。

9.时间序列图

当你拥有连续的日期时间索引及其随时间变化的相应值时,TimeSeries图表是理想之选。股票市场价格就是一个典型的用例。这种图表非常出色,因为它能够轻松展现趋势、季节性模式或异常情况。例如,它可以用于可视化温度趋势、传感器输出或财务数据。

主要功能包括:1. 通过刷选和缩放功能聚焦特定时间范围;2. 切换感兴趣的列进行比较(例如,绘制多只股票的价格);3. 以交互和直观的方式探索大规模时间序列数据。数据要求:一列包含datetime数值,以及一列或多列包含连续数值的列,以便绘制时间序列图。

# 导入库
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 导入示例
df = d3.import_example( 'climate' ) 

"""
+------------+------------+-----------+-------------+---------------+
|    Date    | Mean Temp  | Humidity  | Wind Speed  | Mean Pressure |
+------------+------------+-----------+-------------+---------------+
| 2017-01-01 |   15.913   |   85.870  |     2.743   |      59.000   |
| 2017-01-02 |   18.500   |   77.222  |     2.894   |    1018.278   |
| 2017-01-03 |   17.111   |   81.889  |     4.017   |    1018.333   |
| 2017-01-04 |   18.700   |   70.050  |     4.545   |    1015.700   |
| 2017-01-05 |   18.389   |   74.944  |     3.300   |    1014.333   |
|    ...     |    ...     |    ...    |     ...     |      ...      |
| 2017-04-20 |   34.500   |   27.500  |     5.563   |     998.625   |
| 2017-04-21 |   34.250   |   39.375  |     6.963   |     999.875   |
| 2017-04-22 |   32.900   |   40.900  |     8.890   |    1001.600   |
| 2017-04-23 |   32.875   |   27.500  |     9.963   |    1002.125   |
| 2017-04-24 |   32.000   |   27.143  |    12.157   |    1004.143   |
+------------+------------+-----------+-------------+---------------+
"""


# 创建图表
d3.timeseries(df, datetime='date', dt_format='%Y-%m-%d', fontsize=10, figsize=[850500])

图 9. 使用默认参数的时间序列图。右侧面板用于选择(取消选择)可用的气候变量,底部面板用于绘制和缩放

图表可以通过各种输入参数进行自定义。更多详情请参阅Timeseries文档页面[17]

10. MovingBubbles 图

MovingBubbles图提供了一种动态方式,可以可视化实体如何随时间推移在不同状态之间转换。它不绘制连续值,而是关注离散事件。思考状态更新、流程步骤或行为变化,然后突出显示这些变化在特定时间点对不同实体(样本)的演变情况。

此图表对于揭示时间聚类(例如,许多实体在大约同一时间进入相似状态)和状态之间的运动模式特别有用。它当然不是最节省空间的可视化,但其视觉效果非常出色,由力导向物理和碰撞节点驱动,以保持气泡之间的清晰度和分离度。

此图表的主要特点是:

  1. 捕捉动作或状态随时间变化的时间和方式。
  2. 显示共享状态下的实体聚类。
  3. 使用力导向布局进行引人入胜的探索。
  4. 在状态数量、格式、颜色和方向方面灵活。

D3Blocks版本经过了大量定制和通用化,使其能够支持具有可自定义参数和时间分辨率的各种数据集。数据集要求如下:

  • datetime:指示特定状态发生时间的时间戳。
  • sample_id:每个被跟踪实体的唯一标识符。
  • state:分类标签代表条件或阶段。

每个状态sample_id可以出现多次(在不同的时间戳),但不能在同一时间点具有多个状态。为了帮助用户入门,D3Blocks 内置了一个随机示例数据集的生成器:

# 导入
from d3blocks import D3Blocks 
import random 

# 初始化
d3 = D3Blocks(chart= 'movingbubbles' ) 

# 导入示例
df = d3.import_example('random_time', n=10000 , c=300 , date_start="1-1-2000 00:10:05", date_stop="1-1-2000 23:59:59" ) 

"""
+---------------------+-----------+-----------+
|      Datetime       | Sample ID |   State   |
+---------------------+-----------+-----------+
| 2000-01-01 00:10:07 |     187   |   Sick    |
| 2000-01-01 00:10:14 |      59   |   Sick    |
| 2000-01-01 00:10:46 |     122   |   Sick    |
| 2000-01-01 00:10:57 |     112   |   Sick    |
| 2000-01-01 00:11:12 |     174   |   Work    |
|         ...         |    ...    |   ...     |
| 2000-01-01 23:59:56 |     183   |  Sport    |
| 2000-01-01 23:59:57 |       9   | Sleeping  |
| 2000-01-01 23:59:58 |     297   |  Travel   |
| 2000-01-01 23:59:58 |     297   | Sleeping  |
| 2000-01-01 23:59:58 |     261   | Sleeping  |
+---------------------+-----------+-----------+
"""


# 使用颜色和大小自定义状态:
color = { 1 : '#FF0000' , 3 : '#000FFF' } 
size = {i: random.randint( 5 , 20 ) for i in  range ( 1 , 50 )}

使用以下代码行创建移动气泡图:

# 创建图表
d3.movingbubbles( df , color=color, size=size, figsize=[775, 800])
图 10. 使用默认参数的 MovingBubbles 图表。左侧面板可用于选择时间移动的速度,而右侧面板中的实体会在特定时间点从一个状态移动到另一个状态
图 10. 使用默认参数的 MovingBubbles 图表。左侧面板可用于选择时间移动的速度,而右侧面板中的实体会在特定时间点从一个状态移动到另一个状态

图表可以通过各种输入参数进行自定义。更多详情请参阅MovingBubbles文档页面[18]

三个用于统计和分布可视化图

统计图表是理解数据模式、变化和分布的重要工具。这些图表通过 D3Blocks 展现超越原始数字的洞见。以下三个区块将为你的数据提供独特的视角,涵盖从分布模式到地理趋势的各个方面。

  • 散点图散点图。
  • 小提琴 分布小提琴图。
  • 地图用色彩创造世界。

11.散点图

散点图可能是绘制 (x, y) 坐标最著名的图表。这种基本图表很有用,尤其是具有刷涂和缩放功能。散点图可以按样本着色,并用于检测样本(组)之间的关系。输入是 x 和 y 坐标,但可以设置各种其他参数,例如类标签、大小、(边缘)颜色、工具提示信息等。散点图还可以在两组或三组坐标之间转换。这在比较不同的映射集时很有用。

为了演示,我将使用来自癌症基因组图谱项目 (TCGA) 的癌症数据集,该数据集为 34 种不同的癌组织提供了多种类型的分子数据。对分子数据进行处理,并导出表示患者间相似性的 t-SNE 坐标和主成分。通过散点图,我们可以可视化两组坐标(t-SNE 和 PC 并更深入地分析结果。

# 加载 d3blocks 
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 加载示例数据
df = d3.import_example( 'cancer' ) 

"""
+-----------+-----------+------+--------+------------+------------+
|  tsneX    |  tsneY    | Age  | Labx   |    PC1     |    PC2     |
+-----------+-----------+------+--------+------------+------------+
|  37.20430 |  24.16281 | 58.0 |  acc   |  49.23346  |  14.49651  |
|  37.09309 |  23.42356 | 44.0 |  acc   |  46.32799  |  14.46447  |
|  36.80630 |  23.44491 | 23.0 |  acc   |  46.56793  |  13.48013  |
|  38.06789 |  24.41177 | 30.0 |  acc   |  63.62468  |   1.87406  |
|  36.79120 |  21.71532 | 29.0 |  acc   |  41.74671  |  37.53362  |
|   ...     |    ...    | ...  |  ...   |    ...     |    ...     |
|   0.83938 |  -8.87078 | NaN  |  brca  | -15.38129  |  -8.25454  |
|  -5.84290 |   2.87760 | NaN  |  brca  | -19.16332  |  -6.42407  |
|  -9.39204 |   1.66335 | 71.0 |  brca  | -21.79413  |  -6.19291  |
|  -4.01639 |   6.26074 | NaN  |  brca  | -24.53614  |  -1.17167  |
|   0.22980 |  -8.22709 | NaN  |  brca  | -28.16274  |  -5.29207  |
+-----------+-----------+------+--------+------------+------------+
"""


# 设置大小和工具提示
size = df['survival_months'].fillna(1).values / 20
tooltip = df['labx'].values + '
Survival: '
 + df['survival_months'].astype(str).str[0:4].values
# 散点图
d3.scatter(df['tsneX'].values,
                       df['tsneY'].values,
                       size=size,
                       color=df['labx'].values,
                       stroke='#000000',
                       opacity=0.4,
                       tooltip=tooltip,
                       filepath='scatter_demo.html',
                       cmap='tab20')


图 11. 散点图。通过选择区域进行缩放。双击即可返回主屏幕

该图表可以通过各种输入参数进行自定义。更多详情请参阅catter文档页面[19]。如果你需要以定量的方式比较图表,我建议使用 K 最近邻排序得分。

12. 小提琴图

小提琴图可以可视化一个或多个组数值变量的分布。它是箱线图的替代方案,能够洞察大型数据集中某些信息,因为箱线图可能会隐藏部分信息。使用此模块,我们可以为一个或多个组配置图表,并更改图表中的各种元素,例如颜色、工具提示和箱体大小。为了演示,我们将癌症数据集用作小提琴模块的输入,结果如图 9 所示。原始代码是从D3.js 图库分叉[20]而来的,并进行了大量扩展,添加了新功能。

# 加载 d3blocks 
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 导入示例数据集
df = d3.import_example( 'cancer' ) 

"""
+-----------+-----------+------+--------+------------+------------+
|  tsneX    |  tsneY    | Age  | Labx   |    PC1     |    PC2     |
+-----------+-----------+------+--------+------------+------------+
|  37.20430 |  24.16281 | 58.0 |  acc   |  49.23346  |  14.49651  |
|  37.09309 |  23.42356 | 44.0 |  acc   |  46.32799  |  14.46447  |
|  36.80630 |  23.44491 | 23.0 |  acc   |  46.56793  |  13.48013  |
|  38.06789 |  24.41177 | 30.0 |  acc   |  63.62468  |   1.87406  |
|  36.79120 |  21.71532 | 29.0 |  acc   |  41.74671  |  37.53362  |
|   ...     |    ...    | ...  |  ...   |    ...     |    ...     |
|   0.83938 |  -8.87078 | NaN  |  brca  | -15.38129  |  -8.25454  |
|  -5.84290 |   2.87760 | NaN  |  brca  | -19.16332  |  -6.42407  |
|  -9.39204 |   1.66335 | 71.0 |  brca  | -21.79413  |  -6.19291  |
|  -4.01639 |   6.26074 | NaN  |  brca  | -24.53614  |  -1.17167  |
|   0.22980 |  -8.22709 | NaN  |  brca  | -28.16274  |  -5.29207  |
+-----------+-----------+------+--------+------------+------------+
"""


# 设置一些输入变量。
 tooltip = df[ 'labx' ].values + '
Survival: '
 + df[ 'survival_months' ].astype( str ).values 

# 创建图表
d3.violin(x=df['labx'].values, y=df['age'].values, tooltip=tooltip, bins=50, size=df['survival_months'].values/10, x_order=['acc','kich''brca','lgg','blca','coad','ov'], filepath='violine.html', figsize=[900None])
图 12. 小提琴图
图 12. 小提琴图

图表可以通过各种输入参数进行自定义。更多详情请参阅Violin文档页面[21]

13. 地图

地图可让你可视化世界地理并突出显示特定的国家/地区或区域。你可以根据数据值对国家/地区进行颜色编码,并可选地叠加气泡以标记兴趣点。其主要功能包括:突出显示区域:根据自定义数据为整个国家/地区着色;标记点:使用圆圈强调特定位置(例如,首都、热点)。D3blocks内置了"surfspots"用于演示的数据集。用例包括:显示全球指标、可视化地理空间分布或绘制特定地点的数据。

# 加载 d3blocks 
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 加载示例数据
df = d3.import_example( 'surfspots' ) 

"""
+--------+--------+----------------+------+
|  Lat   |  Lon   |     Label      | Size |
+--------+--------+----------------+------+
| -82.9  | 135.0  |  Antarctica    |   4  |
| -54.8  | -68.3  | South America  |   4  |
| -53.8  | -67.7  | South America  |   1  |
| -53.2  | -70.9  |      NaN       |   2  |
| -52.4  | -71.0  | South America  |   2  |
|  ...   |  ...   |      ...       |  ... |
|  69.6  |  19.0  |      NaN       |   1  |
|  70.0  |  23.3  |    Europe      |   1  |
|  70.4  |  29.5  |    Europe      |  13  |
|  76.3  | -100.1 | North America  |   1  |
|  78.2  |  15.6  |    Europe      |   3  |
+--------+--------+----------------+------+
"""


# 绘制
d3.maps(df)
图 13. 地图图表
图 13. 地图

图表可以通过各种输入参数进行自定义。更多详情请参阅Maps文档页面[22]

14. 图像滑块

当你想要比较两张图片时,ImageSlider 非常有用。尤其是在存在前后状态的情况下,它非常有用。JavaScript 代码是从JohnEdChristensen[23]分支出来的,然后经过 Python 化并嵌入到D3Blocks中。

# 安装 opencv 来读取图像。pip
 install opencv-python
# 加载 d3blocks 
from d3blocks import D3Blocks 
import cv2 
import requests 
import numpy as np 

# 初始化
d3 = D3Blocks() 
# 加载本地图片
img_before, img_after = d3.import_example( 'southern_nebula' ) 
# 读取数组中的图片
img_before = cv2.imread(img_before, - 1 ) 
img_after = cv2.imread(img_after, - 1 ) 
# 创建滑块
d3.imageslider(img_before, img_after) 

# 网络图片
url_before, url_after = d3.import_example( 'southern_nebula_internet' ) 
# 从网络导入图片
resp = request.get(url_before) 
image_data = np.asarray( bytearray (resp.content), dtype=np.uint8) 
img_before = cv2.imdecode(image_data, cv2.IMREAD_UNCHANGED) 
# 从互联网导入图像
resp = request.get(url_after) 
image_data = np.asarray( bytearray (resp.content), dtype=np.uint8) 
img_after = cv2.imdecode(image_data, cv2.IMREAD_UNCHANGED) 

# 创建滑块
d3.imageslider(img_before, img_after)
图 14. 带有两幅输入图像的 ImageSlider。将中心橙色球向左(之前)或向右(之后)移动后显示的图像
图 14. 带有两幅输入图像的 ImageSlider。将中心橙色球向左(之前)或向右(之后)移动后显示的图像

图表可以通过各种输入参数进行自定义。更多详情请参阅Imageslider文档页面[24]

15. 粒子块

使用粒子块,我们可以将任何单词转换为交互式粒子图表。鼠标移动或触摸文本会导致粒子弹跳,然后返回其原始位置。图表的行为可以更改各种属性,例如弹跳、粒子大小和颜色。代码部分展示了一个创建粒子图表的示例。原始 JavaScript 代码来自Ian Johnson[25],然后进行了 Python 化。

# 加载 d3blocks 
from d3blocks import D3Blocks 

# 初始化
d3 = D3Blocks() 

# 使用默认值创建图表
d3.particles( 'D3blocks' ) 

# 创建自定义图表
d3.particles( 'D3Blocks' , 
             filepath= 'D3Blocks.html' , 
             Collision= 0.05 , 
             Spacing= 7 , 
             figsize=[ 750 , 150 ], 
             Fontsize= 130 , 
             cmap= 'Turbo' , 
             color_background= '#ffffff' )

图 15. 粒子块

图表可以通过各种输入参数进行自定义。更多详情请参阅Particles文档页面[26]

写在最后

D3Blocks库包含 15 个交互式、独立且外观精美的图表,可使用 Python 进行配置,后端则使用 d3.js。D3Blocks 的输出将每个图表完全封装在一个 HTML 文件中,这样你就可以在网站上共享或发布图表,只需使用浏览器即可。

参考资料
[1] 

Matplotlib: https://mode.com/blog/python-data-visualization-libraries/#matplotlib

[2] 

Seaborn: https://mode.com/blog/python-data-visualization-libraries/#Seaborn

[3] 

Bokeh: https://mode.com/blog/python-data-visualization-libraries/#Bokeh

[4] 

Plotly: https://mode.com/blog/python-data-visualization-libraries/#Plotly

[5] 

Folium: https://mode.com/blog/python-data-visualization-libraries/#Folium

[6] 

d3js.org: https://d3js.org/

[7] 

关联矩阵: https://en.wikipedia.org/wiki/Incidence_matrix

[8] 

能源数据集: https://observablehq.com/@d3/sankey

[9] 

3graph: https://d3blocks.github.io/d3blocks/pages/html/d3graph.html

[10] 

elasticgraph: https://d3blocks.github.io/d3blocks/pages/html/elasticgraph.html

[11] 

Sankey:  https://d3blocks.github.io/d3blocks/pages/html/Sankey.html

[12] 

Chord: https://d3blocks.github.io/d3blocks/pages/html/Chord.html

[13] 

Heatmap: https://d3blocks.github.io/d3blocks/pages/html/Heatmap.html

[14] 

Tree: https://d3blocks.github.io/d3blocks/pages/html/Tree.html

[15] 

Treemap: https://d3blocks.github.io/d3blocks/pages/html/Treemap.html

[16] 

Circlepacking: https://d3blocks.github.io/d3blocks/pages/html/Circlepacking.html

[17] 

Timeseries: https://d3blocks.github.io/d3blocks/pages/html/Timeseries.html

[18] 

MovingBubbles: https://d3blocks.github.io/d3blocks/pages/html/MovingBubbles.html

[19] 

catter: https://d3blocks.github.io/d3blocks/pages/html/Scatter.html

[20] 

D3.js : https://d3-graph-gallery.com/graph/violin_jitter.html

[21] 

Violin: https://d3blocks.github.io/d3blocks/pages/html/Violin.html

[22] 

Maps: https://d3blocks.github.io/d3blocks/pages/html/Maps.html

[23] 

JohnEdChristensen: https://github.com/JohnEdChristensen/WebbCompare/

[24] 

Imageslider:  https://d3blocks.github.io/d3blocks/pages/html/Imageslider.html

[25] 

Ian Johnson: http://bl.ocks.org/enjalot/f973a941606aa38fed321fbce0c8bd7f

[26] 

Particles: https://d3blocks.github.io/d3blocks/pages/html/.html


🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉 PythonMySQL数据分析数据可视化 机器学习与数据挖掘爬虫 等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184415