数据STUDIO

一图胜千言,5个极美数据科学图表

Image

Image

本文云朵君和大家一起看看不太常用但用于可视化数据时令人印象深刻的 5 种图表/绘图。

1. 和弦图

该图用于以矩阵形式表示数据之间的联系/关系。

该图由一个圆组成,圆周被划分为不同的线段,线段之间用弧线(或弦线)连接,弧线表示线段之间的关系。

弧的粗细与关系的重要性成正比。

Image

显示非洲国家间累计电力贸易(2015-2065 年)的和弦图(来源:维基)

何时使用?

当希望直观地表示数据中不同实体之间的关系时,可以使用弦线图。

例如

  • 社交网络
  • 基因组学数据
  • 交通流量数据
  • 贸易关系数据

如何使用?

使用 Holoviews 和 Bokeh 库创建精美的和弦图。

在下面的示例中,创建了一个展示 5 个不同国家之间贸易关系的图表。

import holoviews as hv
from holoviews import opts
import pandas as pd
import numpy as np
hv.extension('bokeh')

# Sample matrix representing the export volumes between 5 countries
export_data = np.array([[0, 50, 30, 20, 10],   
                        [10, 0, 40, 30, 20],   
                        [20, 10, 0, 35, 25],   
                        [30, 20, 10, 0, 40],   
                        [25, 15, 30, 20, 0]]) 

labels = ['USA', 'China', 'Germany', 'Japan', 'India']

# Creating a pandas DataFrame
df = pd.DataFrame(export_data, index=labels, columns=labels)
df = df.stack().reset_index()

df.columns = ['source', 'target', 'value']

# Creating a Chord object
chord = hv.Chord(df)

# Styling the Chord diagram
chord.opts(
    opts.Chord(
        cmap='Category20', edge_cmap='Category20', 
        labels='source', label_text_font_size='10pt',  
        edge_color='source', node_color='index', 
        width=700, height=700 
    )
).select(value=(5, None)) 

# Display the plot
chord

Image

和弦图

查看文档,了解更多信息:和弦图 [1]

2. 旭日图

该图表用于以圆形布局绘制和可视化层次数据/树状数据。

图表由多个圆环组成,每个圆环代表层次结构中的一个层级。

图表的中心是层次结构的根层/顶层。

圆环的每个分段或扇形代表该层次结构中的一个节点。

每个分段/扇形的大小与其相对于同级的价值成正比。

何时使用?

使用旭日图绘制层次数据,例如

  • 文件系统
  • 网站导航路径
  • 市场细分
  • 基因组数据

如何使用?

Python中的 "plotly "库提供了绘制这些图表的简便方法。

我们使用 Plotly Express(Plotly 的高级接口)创建了一个可视化 2007 年 Gapminder 数据集[2] 的交互式旭日图。

我们的图表将各大洲内的国家分级,按人口大小排列,并按预期寿命着色。

import plotly.express as px
import numpy as np

df = px.data.gapminder().query("year == 2007")

fig = px.sunburst(df, path=['continent', 'country'], 
                  values='pop',
                  color='lifeExp', 
                  hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()

Image
旭日图

查看文档,了解更多信息:旭日图[3]

3. Hexbin 图

这是一种二维直方图,其中的分区是六边形,用不同的颜色表示每个分区中的数据点数量。

何时使用?

该图用于分析两个数据变量(或二元数据)之间的关系。

在绘制大量数据点时,它是散点图的最佳替代品。

当有大量数据点需要绘制时,六边形图有助于实现更好的可视化,因为在传统的散点图中,这些数据点会相互重叠和遮挡。

如何使用?

Matplotlib 提供了如下所示的方法,可以轻松创建 Hexbin 图。

在下面的示例中,我们创建了一个假定的 Hexbin 图,旨在揭示空气质量差(使用空气质量指数/AQI)与医院就诊人次增加之间的潜在关联。

import matplotlib.pyplot as plt
import numpy as np

# Simulating environmental data
aqi = np.random.uniform(0, 300, 10000) 
hospital_visits = aqi * np.random.uniform(0.5, 1.5, 10000) 

# Creating the hexbin plot
plt.hexbin(aqi, hospital_visits, gridsize=30, cmap='Purples')

# Adding a color bar on the right
cb = plt.colorbar(label='Count')

# Setting labels and title
plt.xlabel('Air Quality Index (AQI)')
plt.ylabel('Respiratory-related Hospital Visits')
plt.title('Environmental Health Impact Analysis')

# Show the plot
plt.show()

Image
Hexbin图

查看文档,了解更多信息:Hexbin图[4]

4. 桑基图

该图表示数量在系统不同阶段或部分之间的移动/流动。

桑基图由节点和节点之间的链接组成。

每个链接的宽度与流动量成正比。

该图还表示流动的方向。

何时使用?

该图可用于将以下数据可视化:

  • 供应链/物流数据
  • 交通流数据
  • 数据流
  • 能源流数据

如何使用?

可使用 Plotly 库创建如下所示的 Sankey 图。

以下代码表示一个小城市从生产源头到消费者的能源流。

import plotly.graph_objects as go

labels = ["Coal", "Solar", "Wind", "Nuclear", "Residential", "Industrial", "Commercial"]

source = [0, 1, 2, 3, 0, 1, 2, 3] 
target = [4, 4, 4, 4, 5, 5, 5, 5] 
value = [25, 10, 40, 20, 30, 15, 25, 35] 

# Create the Sankey diagram object
fig = go.Figure(data=[go.Sankey(
    node=dict(
        pad=15,  
        thickness=20, 
        line=dict(color="black", width=0.5),
        label=labels 
    ),
    link=dict(
        source=source,  
        target=target, 
        value=value  
    ))])

fig.update_layout(title_text="Energy Flow in Model City", font_size=12)
fig.show()

Image
桑基图

查看文档了解更多信息:桑基图[5]

5. 流图/主题河

流图(也称主题河)是一种围绕中心轴创建的堆叠区域图,其结果是一个流动的形状。

图表上的每个流代表一个与类别相关的时间序列,并以不同的颜色编码。

Image

用户收听音乐的流图(来源:维基)

何时使用?

该图表可用于将时间序列数据可视化,如以下数据:

  • 流行趋势
  • 金融数据
  • 网站流量数据
  • 销售/营销数据

如何使用?

Altair 数据可视化库可用于绘制如下流图。

在下面的示例中,我们绘制了 10 年内多个行业的失业数据。

!pip install vega_datasets altair
import altair as alt
from vega_datasets import data

source = data.unemployment_across_industries.url

alt.Chart(source).mark_area().encode(
    alt.X('yearmonth(date):T',
        axis=alt.Axis(format='%Y', domain=False, tickSize=0)
    ),
    alt.Y('sum(count):Q', stack='center', axis=None),
    alt.Color('series:N',
        scale=alt.Scale(scheme='category20b')
    )
).interactive()

Image
主题河

查看文档,了解更多信息:流图/主题河[6]

参考资料

[1]

和弦图 : https://holoviews.org/reference/elements/matplotlib/Chord.html

[2]

Gapminder 数据集: https://www.gapminder.org/data/

[3]

旭日图: https://plotly.com/python/sunburst-charts

[4]

Hexbin图: https://matplotlib.org/stable/gallery/statistics/hexbin_demo.html

[5]

桑基图: https://plotly.com/python/sankey-diagram

[6]

流图/主题河: https://altair-viz.github.io/gallery/streamgraph.html

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

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