趋势(四)利用python绘制流图

趋势(四)利用python绘制流图

流图(Streamgraph)简介

1

流图是一种围绕中心轴偏移的堆叠面积图,从而形成流动的有机形状。数据在不同的阶段产生了结构性的变化时,通过可视化手段看数据成分的变动大小及变动方向。

绘制流图

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# 自定义数据
x = np.arange(1990, 2020)
y = [np.random.randint(0, 5, size=30) for _ in range(5)]

绘制基本的堆叠面积图

fig, ax = plt.subplots(figsize=(10, 7))

ax.stackplot(x, y);

2

修改baseline

fig, ax = plt.subplots(figsize=(10, 7))

ax.stackplot(x, y, baseline="sym")
ax.axhline(0, color="black", ls="--");

3

平滑曲线

# 自定义高斯平滑
def gaussian_smooth(x, y, sd):
    weights = np.array([stats.norm.pdf(x, m, sd) for m in x])
    weights = weights / weights.sum(1)
    return (weights * y).sum(1)

fig, ax = plt.subplots(figsize=(10, 7))

y_smoothed = [gaussian_smooth(x, y_, 1) for y_ in y] # 权重为1,权重越大越平滑,但是波动越小
ax.stackplot(x, y_smoothed, baseline="sym");

4

调整平滑程度

# 增加网格使其更平滑
def gaussian_smooth(x, y, grid, sd):
    weights = np.transpose([stats.norm.pdf(grid, m, sd) for m in x])
    weights = weights / weights.sum(0)
    return (weights * y).sum(1)

fig, ax = plt.subplots(figsize=(10, 7))

grid = np.linspace(1985, 2025, num=500)
y_smoothed = [gaussian_smooth(x, y_, grid, 1) for y_ in y] # 权重为1,权重越大越平滑,但是波动越小
ax.stackplot(grid, y_smoothed, baseline="sym");

5

美化颜色

COLORS = ["#D0D1E6", "#A6BDDB", "#74A9CF", "#2B8CBE", "#045A8D"]
fig, ax = plt.subplots(figsize=(10, 7))

ax.stackplot(grid, y_smoothed, colors=COLORS, baseline="sym");

6

总结

以上基于matplotlib绘制堆叠面积图的基础上,调整baseline和平滑曲线完成了流图的绘制。

共勉~

<think>嗯,用户想用Python绘制。首先,我得弄清楚什么是能。通常来说,能可能指的是展示能量动的表,比如在能源系统、生态系统中能量从源头到各个节点的动情况。这类表通常包含箭头、节点,可能还有量数值或比例。 接下来,我需要回忆一下Python中常用的绘库。matplotlib是基础,但能可能需要更专业的工具。有没有专门的库呢?比如Sankey,用于表示量,可能适用。matplotlib其实有一个sankey模块,但可能不够直观。另外,plotly这个交互式库也支持Sankey,而且效果更好,用户可能需要交互功能。或者pySankey这样的第三方库。 然后,用户提供的引用中提到了绘制PNG片、雷达和组合,但并没有直接提到能。不过引用1中的PIL库可以用来绘制基本形,但如果能复杂的话,可能需要更高级的库。引用2中的雷达和引用3的组合可能和能结构不同,但可以参考如何组织数据。 接下来,我需要考虑用户可能的实际需求。能可能属于Sankey的一种,所以重点应该放在生成Sankey的库上。比如,matplotlib的sankey模块,或者plotly的Sankey。此外,可能需要给出两种示例,一种基础,一种更美观的。 然后,我需要检查这些库的用法。比如,matplotlib的Sankey需要定义向和比例,而plotly的Sankey更灵活,支持节点和链接。pySankey库可能简化程。需要确保代码示例正确,并且用户能理解如何调整参数。 另外,用户可能需要知道如何安装这些库,所以应该在回答中提到安装命令,比如pip install plotly等。同时,注意事项部分要提醒用户节点和的设置,颜色调整,标签显示等。 最后,相关问题部分需要延伸,比如如何优化布局、添加交互功能,或者处理复杂数据。这样用户可以根据需求进一步探索。</think>根据Python可视化库的特点,绘制(能量/Sankey)推荐以下两种实现方案: ### 一、使用matplotlib的sankey模块(基础方案) ```python from matplotlib.sankey import Sankey import matplotlib.pyplot as plt fig = plt.figure(figsize=(10,6)) ax = fig.add_subplot(1,1,1) sankey = Sankey(ax=ax, unit='kW') sankey.add(flows=[100, -30, -20, -50], # 量值 labels=['能源输入', '发电损耗', '传输损耗', '终端用能'], orientations=[0, 1, 1, -1], # 向控制 edgecolor='gray', trunklength=1) diagrams = sankey.finish() plt.title("能源系统能") plt.show() ``` 该方案适合快速生成基础能,但自定义样式较复杂[^1]。 ### 二、使用plotly高级可视化库(推荐方案) ```python import plotly.graph_objects as go fig = go.Figure(data=[go.Sankey( node = dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=["能源生产", "发电站", "电网", "工业用电", "居民用电"], color=["#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072", "#80B1D3"] ), link = dict( source=[0,0,1,2,2], # 起始节点索引 target=[1,2,3,3,4], # 目标节点索引 value=[100, 30, 80, 50, 20], # 量值 color=["rgba(255,0,0,0.3)", "rgba(0,255,0,0.3)", "rgba(0,0,255,0.3)", "rgba(255,255,0,0.3)", "rgba(0,255,255,0.3)"] ))]) fig.update_layout(title_text="能源动Sankey", font_size=12) fig.show() ``` 该方案支持交互操作,可自定义颜色和布局,输出效果更专业[^2]。 ### 三、使用pySankey专用库 ```python pip install pySankey from pySankey.sankey import sankey flows = [ ('煤炭', '发电', 80), ('天然气', '发电', 20), ('发电', '电网', 90), ('电网', '工业', 60), ('电网', '居民', 30) ] sankey(flows, aspect=20, colorDict={ '煤炭':'#FFA07A', '天然气':'#87CEEB', '发电':'#D3D3D3', '电网':'#808080', '工业':'#FFD700', '居民':'#32CD32' }) plt.title("能源转化") plt.show() ``` ### 、注意事项 1. **节点关系**:需明确定义源节点与目标节点的对应关系 2. **量比例**:建议使用标准化数值(总和为100%) 3. **颜色编码**:推荐使用色系区分不同能源类型[^3] 4. **交互功能**:plotly版本支持悬停显示数值细节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值