本文分享5个python可视化图表及其python实现代码。

1. 和弦图(Chord Diagram)
和弦图是一种表示数据之间相互关系的图表。图表中节点围绕着圆周分布,点与点之间以弧线彼此连接以显示之间的关系,通过每个圆弧的大小比例给每个连接分配数值,弧线的粗细与关系的重要性成比例。此外,还可以通过颜色将数据分类,直观地进行比较和区分。
和弦图非常适合比较数据集内或不同数据组之间的相似性。它们被生物科学界广泛用于可视化基因数据,在国际主流刊物上也被称为信息图表(info graphics),还常用于可视化社交网络、基因组、交通流、贸易关系等数据。





以下示例代码使用Holoviews & Bokeh创建和弦图,展示5个不同国家之间的贸易关系。
import holoviews as hvfrom holoviews import optsimport pandas as pdimport numpy as nphv.extension('bokeh')# Sample matrix representing the export volumes between 5 countriesexport_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 DataFramedf = pd.DataFrame(export_data, index=labels, columns=labels)df = df.stack().reset_index()df.columns = ['source', 'target', 'value']# Creating a Chord objectchord = hv.Chord(df)# Styling the Chord diagramchord.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 plotchord
https://holoviews.org/reference/elements/matplotlib/Chord.html
https://github.com/moshi4/pyCirclize
2. 旭日图(Sunburst Chart)
旭日图(Sunburst Chart)超越传统的饼图和环图,能表达清晰的层级和归属关系,以父子层次结构来显示数据构成情况,使用户能够轻松地理解和分析复杂的层次数据。
旭日图呈现多个环形,每个环代表层次结构中的一个级别。图表中心是层次结构中的根/顶层。每个环的每个部分或扇区代表该层次结构中的一个节点,每个部分/扇区的大小与其相对于兄弟节点的值成比例。

旭日图用于在圆形布局中绘制和可视化分层数据或树状数据,例如:
- 计算机文件系统
- 网站导航路径
- 市场细分数据
- 基因组数据
以下示例代码使用python库plotly绘制旭日图。
import plotly.express as pximport numpy as npdf = 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()
https://plotly.com/python/sunburst-charts/
3. 六边形箱图(Hexbin Plot)
六边形箱图是一种可视化二维数据分布的图表类型。它将数据按照坐标轴划分为多个小六边形区域,并根据每个区域内数据点的数量进行不同的着色,以展示数据分布情况。
该图用于分析两个数据变量(或双变量数据)之间的关系。当需要绘制大量数据点时,六边形散点图有助于更好地可视化,它是散点图的一个很好的替代选择,因为这些数据点在传统的散点图中可能会重叠并遮挡彼此。


可以使用Matplotlib可以轻松创建六边形散点图。
下面的示例创建了一个假设的六边形散点图,旨在揭示空气质量恶化(使用空气质量指数/AQI)与增加的医院就诊之间的潜在相关性。
import matplotlib.pyplot as pltimport numpy as np# Simulating environmental dataaqi = np.random.uniform(0, 300, 10000) hospital_visits = aqi * np.random.uniform(0.5, 1.5, 10000)# Creating the hexbin plotplt.hexbin(aqi, hospital_visits, gridsize=30, cmap='Purples')# Adding a color bar on the rightcb = plt.colorbar(label='Count')# Setting labels and titleplt.xlabel('Air Quality Index (AQI)')plt.ylabel('Respiratory-related Hospital Visits')plt.title('Environmental Health Impact Analysis')# Show the plotplt.show()
https://matplotlib.org/stable/gallery/statistics/hexbin\_demo.html
4. 桑基图(Sankey Diagram)
桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”。
桑基图表示系统不同阶段或部分之间数量的流动,由节点和它们之间的链接组成,每个链接的宽度与流动数量成比例。


Plotly库可以用来创建如下所示的桑基图。
以下代码表示能量从生产源流向小城市的消费者。
import plotly.graph_objects as golabels = ["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 objectfig = 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()
https://plotly.com/python/sankey-diagram/
5. 主题河流图(Stream Graph/ Theme River)
**主题河流图顾名思义就是形状像河流的图形,实际上是一种特殊的流图,它主要用来表示事件或主题在一段时间内的变化。**河流图用颜色区分不同的类别,或每个类别的附加定量,流向则与表示时间的X轴平行。每个类别的对应数值则是通过 “河流”的宽度展示出来。每个类别的数值变化就会形同一条粗细不一的小河,汇集、扭结在一起,河流图也因此而得名。



Altair数据可视化库可用于绘制流图,如下所示。
import altair as altfrom vega_datasets import datasource = data.unemployment_across_industries.urlalt.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()
https://altair-viz.github.io/gallery/streamgraph.html
本公众号相关内容推荐:
- 分享17个网络(Network)数据可视化工具
- Napari:一个支持分析大型多维图像数据集的python工具
- 地理空间数据分析可视化R软件包汇总
- 大气海洋科学数据可视化案例集#2
- 一个快速检索和下载NASA地球科学数据的Python软件包
- 可视化呈现海洋洋流-墨西哥湾流
- 探索NOAA提供的数据产品资源
- 全球海洋船舶定位数据交互式可视化(附数据)
- 地球科学领域开源python包#1
- 地球科学领域开源python包#2
- 大规模空间矢量数据可视化Python库-lonboard
- 可视化呈现2023年是有气象记录以来最热的一年
- 大气海洋科学数据可视化案例集#1
- 地球科学领域计算分析开源Julia软件包
- 地球观测数据可视化工具
- 地球科学领域计算分析开源Julia软件包