1622 字
8 分钟
分享5个python可视化图表工具

本文分享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 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()

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

https://altair-viz.github.io/gallery/streamgraph.html


本公众号相关内容推荐:

分享5个python可视化图表工具
https://blog.scidatalab.net/posts/分享5个python可视化图表工具/
作者
Echo
发布于
2024-03-27
许可协议
CC BY-NC-SA 4.0