You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在matplotlib中实现颜色渐变绘图并添加网格线

问题描述

我是Python可视化方向的新手,想要在右侧子图中使用颜色渐变和网格线绘制与左侧相同的数据集,提升图表可读性。目前参考同类问题的代码编写后遇到卡顿问题,无法实现预期效果。

原始问题代码
import random
import matplotlib
import matplotlib.pyplot as plt
import tkinter as tk
from matplotlib.widgets import Slider
from matplotlib import colors
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import style
import numpy as np

style.use('ggplot')
matplotlib.use('TkAgg')

def update(val):
    pos = s_time.val
    ax.axis([pos, pos+10, 20, 40])
    fig.canvas.draw_idle()

def plot():
    canvas = FigureCanvasTkAgg(fig,root)
    canvas.get_tk_widget().pack(side=tk.TOP, fill = tk.BOTH, expand =1)
    
    fig.subplots_adjust(bottom=0.25)

    y_values = [random.randrange(41) for _ in range(40)]
    x_values = [i for i in range(40)]

    ax.axis([0, 9, 20, 40])
    ax.plot(x_values, y_values)

    #cmap = colors.ListedColormap(['red', 'blue','green'])
    #bounds = [0,10,20,30]
    #norm = colors.BoundaryNorm(bounds, cmap.N)
    #ax1.imshow(ax, cmap=cmap, norm=norm)
    im0  = ax1.pcolormesh([x_values,y_values], vmin=0, vmax=1, cmap="RdBu")
    im = fig.colorbar(im0,cax=ax1)
    ax1.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5)

    #ax1.set_yticks(np.arange(0, 40, 2.5))

    ax_time = fig.add_axes([0.12, 0.1, 0.78, 0.03])
    return ax_time
    

root = tk.Tk()
fig = plt.Figure(figsize = (10,10),dpi = 150)
ax=fig.add_subplot(121)
ax1=fig.add_subplot(122)
s_time = Slider(plot(), 'Time', 0, 30, valinit=0)
s_time.on_changed(update)
root.mainloop()
修复后可运行代码
import random
import matplotlib
# 后端设置必须放在导入pyplot之前,避免冲突
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
import tkinter as tk
from matplotlib.widgets import Slider
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import style
import numpy as np

style.use('ggplot')

def update(val):
    pos = s_time.val
    # 同步更新左右子图的x轴范围,保证展示数据一致
    ax.axis([pos, pos+10, 20, 40])
    ax1.axis([pos, pos+10, 20, 40])
    fig.canvas.draw_idle()

def plot():
    canvas = FigureCanvasTkAgg(fig,root)
    canvas.get_tk_widget().pack(side=tk.TOP, fill = tk.BOTH, expand =1)
    
    # 调整布局,预留colorbar位置和滑块位置
    fig.subplots_adjust(bottom=0.25, right=0.9)

    y_values = [random.randrange(20,41) for _ in range(40)] # 对齐y轴范围20-40
    x_values = np.arange(40)

    # 左侧子图:普通折线
    ax.axis([0, 9, 20, 40])
    ax.plot(x_values, y_values)
    ax.set_title("基础折线图")

    # 右侧子图:渐变折线+网格
    ax1.axis([0, 9, 20, 40])
    ax1.set_title("渐变可视化折线图")
    ax1.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5)

    # 构造渐变折线所需的线段集合
    points = np.array([x_values, y_values]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    lc = LineCollection(segments, cmap='RdBu', norm=plt.Normalize(20,40))
    lc.set_array(y_values) # 用y值映射颜色
    lc.set_linewidth(2)
    line = ax1.add_collection(lc)

    # 单独新建axes放colorbar,不占用子图空间,解决卡顿问题
    cbar_ax = fig.add_axes([0.92, 0.25, 0.02, 0.6])
    fig.colorbar(line, cax=cbar_ax, label='Y值大小')

    ax_time = fig.add_axes([0.12, 0.1, 0.78, 0.03])
    return ax_time
    

root = tk.Tk()
root.title("双图可视化工具")
fig = plt.Figure(figsize = (10,5),dpi = 150) # 调整尺寸避免过宽
ax=fig.add_subplot(121)
ax1=fig.add_subplot(122)
s_time = Slider(plot(), 'Time', 0, 30, valinit=0)
s_time.on_changed(update)
root.mainloop()
关键修改说明
  • 调整后端设置的调用顺序,避免Matplotlib后端冲突导致的渲染异常
  • 采用LineCollection实现折线颜色随Y值渐变,满足同数据集颜色可视化的需求
  • 单独创建区域放置颜色条,不再占用右侧子图的绘图空间,解决卡顿问题
  • 滑块拖动时同步更新左右子图的X轴范围,保证两侧展示的数据段完全一致
  • 保留右侧子图的白色网格线设置,提升数据可读性

内容的提问来源于stack exchange,提问作者sillydoubts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:24:00