利用matplotlib实现颜色视觉映射的分段多色折线图(模拟ECharts Beijing AQI案例)

本文介绍了一个使用matplotlib实现的北京空气质量指数(AQI)可视化案例。通过对原始数据进行插值处理,实现了不同阈值间平滑的颜色过渡效果,有效解决了直接应用官方示例时存在的颜色突变问题。

概述

ECharts提供了大量交互组件,Beijing AQI是ECharts的一个典型的视觉映射案例,y轴的值根据不同的阈值映射为不同的颜色,matplotlib没有现成的解决方案。
在这里插入图片描述

matplotlib相关案例

matplotlib官方案例Multicolored lines提供了类似的解决方案。

但是直接套用该案例发现,效果并不好。问题主要在于映射y轴时,如果相邻两个数据点刚好跨越不同值区间,那么这段线只能绘制一种颜色,因此,应当在值区间的转换点之间插入过渡的阈值。

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm

with open('aqi-beijing.json') as f:
    data =pd.read_json(f,orient='columns')

x = np.arange(len(data))
y = data[1]
dydx = y
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

fig, axs = plt.subplots(1, 1, figsize=(15,9))

cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([0, 100, 200, 300], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = axs.add_collection(lc)
fig.colorbar(line, ax=axs)

axs.set_xlim(x.min(), x.max())
axs.set_ylim(0, 500)
plt.show()

解决方案

由于numpy学艺不精,不能优雅的处理插值问题,因此,采用列表、字典处理插值问题。
其他的思路包括利用numpy掩码数组处理数据过滤问题,利用plot函数分段绘制线。
在这里插入图片描述

from collections import Counter, defaultdict

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap, BoundaryNorm

plt.rcParams['font.family'] = 'simhei'

plt.figure(figsize=
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值