概述
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=

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

被折叠的 条评论
为什么被折叠?



