Jupyter Notebook无需渲染绘图直接获取scatter全部facecolor方法咨询
问题原因与解决方法
这个问题的本质是Matplotlib的延迟渲染机制:散点图对象PathCollection在画布没有完成实际渲染前,不会预先计算生成所有散点的独立颜色值,只会保留统一的颜色配置。拆分单元格运行时,第一个单元格执行完成后Jupyter会自动触发图表渲染,此时所有散点颜色才会被计算生成,因此get_facecolors()能返回完整的颜色列表;同单元格运行时渲染还未触发,因此只能拿到默认的1个颜色值。
无需等待渲染的解决方案是直接调用散点图自带的归一化对象和颜色映射对象,自行计算所有数值对应的颜色,该逻辑和Matplotlib内部渲染时的颜色计算逻辑完全一致,得到的颜色结果和渲染后get_facecolors()返回的结果没有差异。
可直接在单个单元格运行的完整代码如下:
import matplotlib.pyplot as plt difference = [-9.11476554e-03, 6.96440932e-01, 1.55848671e+00, 2.49302039e+00, 1.78664413e+00, 9.21715740e-01, -9.06779211e-02, 3.85599550e-01, 7.62364171e-01, 8.43788498e-01, 3.65637016e-01, -3.09278853e-02, -3.94263747e-02, -3.99640149e-01, -3.77036512e-01, -9.38614302e-01, -9.44227778e-01, -7.56399423e-01, -1.91719761e-01, 1.74602851e-01, -1.75804630e-01, -7.88096542e-01, -8.65569748e-01, -9.52364646e-01, -3.29532285e-01, -2.49750018e-01, -2.03776029e-03, 3.40896487e-01, -1.04289662e-01, -1.11517509e-01, 5.84315453e-02, 1.21235574e+00, 1.35715932e+00, 1.42280158e+00, 1.24305359e+00, 1.10727093e+00, 5.28615206e-01, -2.11163359e-02, -4.20183478e-01, -4.22867124e-01, 9.57720715e-02, 4.81484548e-01, 1.26236096e+00, 1.38971651e+00, 1.40270113e+00, 6.00938954e-01, -2.46022101e-02, -2.70847276e-02, -3.32089611e-03, -1.54348517e-01] fig, ax = plt.subplots(figsize=(13, 8)) plt.style.use("ggplot") cmap_name = 'inferno' scat = ax.scatter(range(len(difference)), difference, c=difference, cmap=cmap_name) # 自行计算所有点对应颜色,无需等待渲染 norm = scat.norm cmap = scat.cmap colors = cmap(norm(difference)) ax.plot([0, len(difference)], [0,0], color='dodgerblue', zorder=1, linestyle="-.") for num, (x0, x1, col) in enumerate(zip(difference[:-1], difference[1:], colors)): ax.plot([num, num+1], [x0, x1], color=col, zorder=2) scat.set_alpha(0) plt.show()
内容的提问来源于stack exchange,提问作者vftw
相关产品推荐
相关产品推荐

